回复于:织女星开发板通过SPI协议驱动ARDUINO LCD模块

Home 论坛 开发和更新问题 织女星开发板通过SPI协议驱动ARDUINO LCD模块 回复于:织女星开发板通过SPI协议驱动ARDUINO LCD模块

#1833
123123
参与者

代码的补充和优化

优化

以单个像素点来读取数据可能会有点慢,一次读取多个像素点能大大提高读取速度,但也有一些情况就是需要一次只读取一个像素点,所以我定义了一个宏HIGH_LEVEL_OPTIMIZE,来控制选择是否一次读取多个像素点:
#if HIGH_LEVEL_OPTIMIZE
static uint16_t LCD_MULTI_WORD_WRITE(uint16_t* data, uint16_t len)
{
uint8_t *transfer = (uint8_t*)malloc(len);
lpspi_transfer_t masterXfer;
if(transfer){
uint8_t exist = len % 8; //copy 8 Byte one time
uint32_t i = 0;
for(;i<(len - exist);){ transfer[i++] = (*(data)) & 0xff; transfer[i++] = ((*(data++)) & 0xff00) >> 8;
transfer[i++] = (*(data)) & 0xff;
transfer[i++] = ((*(data++)) & 0xff00) >> 8;
transfer[i++] = (*(data)) & 0xff;
transfer[i++] = ((*(data++)) & 0xff00) >> 8;
transfer[i++] = (*(data)) & 0xff;
transfer[i++] = ((*(data++)) & 0xff00) >> 8;
}
for(int j=0;j<exist/2;j++){ transfer[i++] = (*(data)) & 0xff; transfer[i++] = ((*(data++)) & 0xff00) >> 8;
}
masterXfer.txData = transfer;
masterXfer.rxData = NULL;
masterXfer.dataSize = len;
masterXfer.configFlags = BOARD_LPSPI_PCS_FOR_TRANSFER | kLPSPI_MasterPcsContinuous;
LPSPI_MasterTransferBlocking(LCD_SPI, &masterXfer);
free(transfer);
transfer = NULL;
}
else{
free(transfer);
transfer = NULL;
return -1;
}
return *data;
}
#endif

修改lcd_clear_screen(uint16_t color)函数,代码如下:
void lcd_clear_screen(uint16_t color)
{
uint32_t i, cnt = 0;
cnt = LCD_WIDTH * LCD_HEIGHT;
lcd_set_cursor(0, 0);
lcd_write_byte(0x22, LCD_CMD);
LCD_DC_SET();
#if HIGH_LEVEL_OPTIMIZE
const uint32_t nPixelSet = 32; //send n pixels one time
uint16_t temp[nPixelSet];
uint16_t color2send = INVERSE_MSB(color); //MSB first, need to convert the data
for(int i=0;i<nPixelSet;){
temp[i++] = color2send;
temp[i++] = color2send;
temp[i++] = color2send;
temp[i++] = color2send;
}
/*** Send 64 Bytes one time, but the lcd will accept one 16-bit as a pixel,
so the len will be the len of the (uint16), need to sizeof(temp)/sizeof(uint16_t);***/
for (i = 0; i < cnt; i += nPixelSet)
{
LCD_MULTI_WORD_WRITE(temp, sizeof(temp));
}
#else
/**** send 2 bytes one time***/
for (i = 0; i < cnt; i ++)
{
LCD_WORD_WRITE(color);
}
#endif
}

显示图片部分的代码也是通过类似的方法来优化。

补充

一楼显示的配置SPI的代码看起来有点乱,我想修改的时候已经不能编辑了,在这里重新写一遍:
static uint8_t lcd_hardware_init(void)
{
lpspi_master_config_t masterConfig;
uint32_t srcClock_Hz;
/* SPI init */
LPSPI_MasterGetDefaultConfig(&masterConfig);
/*********Master config*********/
masterConfig.baudRate = 24000000;
/* 这里LPSPI_TRANSFER_SIZE的值在宏定义中设置为1 */
masterConfig.bitsPerFrame = 8*LPSPI_TRANSFER_SIZE;
masterConfig.cpol = kLPSPI_ClockPolarityActiveHigh;
masterConfig.cpha = kLPSPI_ClockPhaseFirstEdge;
masterConfig.direction = kLPSPI_MsbFirst;
masterConfig.pcsToSckDelayInNanoSec = 1000000000 / masterConfig.baudRate;
masterConfig.lastSckToPcsDelayInNanoSec = 1000000000 / masterConfig.baudRate;
masterConfig.betweenTransferDelayInNanoSec = 1000000000 / masterConfig.baudRate;
/* 设置pcs2为片选信号 */
masterConfig.whichPcs = kLPSPI_Pcs2;
masterConfig.pcsActiveHighOrLow = kLPSPI_PcsActiveLow;
masterConfig.pinCfg = kLPSPI_SdiInSdoOut;
masterConfig.dataOutConfig = kLpspiDataOutRetained;
srcClock_Hz = CLOCK_GetIpFreq(kCLOCK_Lpspi0);
LPSPI_MasterInit(LCD_SPI, &masterConfig, srcClock_Hz);
return true;
}