/** * Function to read a word. * \param res - pointer in which to store the result * \return - 0 the operation is successful * \return - 1 the operation is failed. Check internal error for more details */ BOOL SPIReadWord(unsigned int * res) { int counter=0; if(SPI2CON1bits.MSTEN==0) { #ifdef SPI_DBG uartwrite(1,"[SPI_DBG] Master op in Slave mode, quitting\n"); #endif _intSPIerr=NotMasterMode; return 1; } if(SPIWriteWord(0x00)==0) { while((SPI2STATbits.SPIRBF==0) && (counter!=255)) counter++; if(counter<255) { #ifdef SPI_DBG uartwrite(1,"[SPI_DBG] Rx buf ok, reading\n"); #endif if (SPI2CON1bits.MODE16) { #ifdef SPI_DBG uartwrite(1,"[SPI_DBG] Mode16 ok, reading\n"); #endif *res = SPI2BUF; _intSPIerr=SPI_NO_ERR; return 0; } else { #ifdef SPI_DBG uartwrite(1,"[SPI_DBG] Mode16 read, no Mode16 set, NOT READING!\n"); #endif _intSPIerr = Mode16ReadNoMode16; return 1; } } #ifdef SPI_DBG uartwrite(1,"[SPI_DBG] Rx buf empty, NOT READING!\n"); #endif _intSPIerr = RxBufEmpty; return 1; } return 1; }
/** * Function to perform a contemporary write and read of a word. * This is used when the slave device supports full-duplex. * In this case while clocking data out, data in is considered valid and saved. * \param data - unsigned int data to be sent * \param res - pointer to store the received data * \return - 0 the operation is successful * \return - 1 the operation is failed. Check internal error for more details */ BOOL SPIWriteReadWord(unsigned int data, unsigned int * res) { if(SPI2CON1bits.MSTEN==0) { #ifdef SPI_DBG uartwrite(1,"[SPI_DBG] Master op in Slave mode, quitting\n"); #endif _intSPIerr=NotMasterMode; return 1; } //BOOL outcome; if(SPIWriteWord(data)==0) { //outcome = SPIReadWord(res); //return outcome; *res = SPI2BUF; return 0; } return 1; }
// transfer line buffer to display using SPI // input: line position where line buffer is rendered void SPIWriteLine(unsigned char line) { P2OUT |= _SCS; // SCS high, ready talking to display SPIWriteByte(MLCD_WR | VCOM); // send command to write line(s) SPIWriteByte(line+1); // send line address UCB0CTL0 |= UCMSB; // switch SPI to MSB first for proper bitmap orientation unsigned char j = 0; while(j < (PIXELS_X/8)) // write pixels / 8 bytes { UCB0TXBUF = LineBuff[j++]; // transfer byte while (UCB0STAT & UCBUSY); // wait for transfer to complete } UCB0CTL0 &= ~UCMSB; // switch SPI back to LSB first for commands SPIWriteWord(0); // send 16 bit to latch buffers and end transfer P2OUT &= ~_SCS; // SCS low, finished talking to display }
// transfer line buffer to display using SPI // input: line position where line buffer is rendered void SPIWriteLine(unsigned char line) { P1OUT |= _SCS; // SCS high, ready talking to display SPIWriteByte(MLCD_WR | VCOM); // send command to write line(s) SPIWriteByte(line+1); // send line address USICTL0 &= ~USILSB; // switch SPI to MSB first for proper bitmap orientation unsigned char j = 0; while(j < (PIXELS_X/8)) // write pixels / 8 bytes { USISRH = LineBuff[j++]; // store low byte USISRL = LineBuff[j++]; // store high byte USICNT |= USISCLREL | USI16B | USICNT4; // release SCLK when done, transfer 16 bits while(!(USICTL1 & USIIFG)); // wait for transfer to complete } USICTL0 |= USILSB; // switch SPI back to LSB first for commands SPIWriteWord(0); // send 16 bit to latch buffers and end transfer P1OUT &= ~_SCS; // SCS low, finished talking to display }
int SPI3W_sendCommand(char cmd){ int ret=0; Transfer f = { .data = cmd, .type = 0, }; void* structure = &f; //printf("%i\n", sizeof(Transfer)); ret = SPIWriteWord(structure); if(ret == -1) pabort("Invalid Command"); return ret; } int SPI3W_sendData(char datal){ int ret=0; Transfer f = { .data = datal, .type = 1, }; void* structure = &f; //printf("%i\n", sizeof(Transfer)); ret = SPIWriteWord(structure); if(ret == -1) pabort("Invalid Data"); return ret; } int init_tft(int deviceNum) { int ret=0; int SPISpeed = 2000000; ret = initResetPin(); if(ret == -1){ pabort("Unable to initialize reset PIN"); } ret = SPIInit(deviceNum, 9, SPISpeed); if(ret < 0){ pabort("Unable to initialize SPI"); } //***************************RESET LCD Driver******************************* // SET RST Pin high resetSet(); usleep(1000); // SET RST Pin low resetClear(); usleep(20000); // SET RST Pin high resetSet(); usleep(120000); SPI3W_sendCommand(0x11); // Sleep out and Charge Pump on usleep(120000); SPI3W_sendCommand(0xB1); //SETPWCTR SPI3W_sendData(0x02); SPI3W_sendData(0x35); SPI3W_sendData(0x36); SPI3W_sendCommand(0xB2); //SETDISPLAY SPI3W_sendData(0x02); SPI3W_sendData(0x35); SPI3W_sendData(0x36); SPI3W_sendCommand(0xB3); //Doesn't exist SPI3W_sendData(0x02); SPI3W_sendData(0x35); SPI3W_sendData(0x36); SPI3W_sendData(0x02); SPI3W_sendData(0x35); SPI3W_sendData(0x36); SPI3W_sendCommand(0xB4); //SETCYC SPI3W_sendData(0x07); SPI3W_sendCommand(0xC0); //SETSTBA SPI3W_sendData(0xa2); SPI3W_sendData(0x02); SPI3W_sendData(0x04); SPI3W_sendCommand(0xc1); //Doesn't exist SPI3W_sendData(0xc5); SPI3W_sendCommand(0xc2); //Doesn't exist SPI3W_sendData(0x0d); SPI3W_sendData(0x00); SPI3W_sendCommand(0xc3); // SETID SPI3W_sendData(0x8d); SPI3W_sendData(0x1a); SPI3W_sendCommand(0xc4); //Doesn't exist SPI3W_sendData(0x8d); SPI3W_sendData(0xee); SPI3W_sendCommand(0xc5); //Doesn't exist SPI3W_sendData(0x09); SPI3W_sendCommand(0xE0); //Gamma setting For LGIT Panel SPI3W_sendData(0x0a); SPI3W_sendData(0x1c); SPI3W_sendData(0x0c); SPI3W_sendData(0x14); SPI3W_sendData(0x33); SPI3W_sendData(0x2b); SPI3W_sendData(0x24); SPI3W_sendData(0x28); SPI3W_sendData(0x27); SPI3W_sendData(0x25); SPI3W_sendData(0x2C); SPI3W_sendData(0x39); SPI3W_sendData(0x00); SPI3W_sendData(0x05); SPI3W_sendData(0x03); SPI3W_sendData(0x0d); SPI3W_sendCommand(0xE1); //Doesn't exist SPI3W_sendData(0x0a); SPI3W_sendData(0x1c); SPI3W_sendData(0x0c); SPI3W_sendData(0x14); SPI3W_sendData(0x33); SPI3W_sendData(0x2b); SPI3W_sendData(0x24); SPI3W_sendData(0x28); SPI3W_sendData(0x27); SPI3W_sendData(0x25); SPI3W_sendData(0x2D); SPI3W_sendData(0x3a); SPI3W_sendData(0x00); SPI3W_sendData(0x05); SPI3W_sendData(0x03); SPI3W_sendData(0x0d); SPI3W_sendCommand(0x3A); //Doesn't exist SPI3W_sendData(0x06); SPI3W_sendCommand(0x29); //Display On usleep(150); }