之前在https://bbs.elecfans.com/jishu_2460016_1_1.html中实现了SPI驱动LCD,但效果差强人意。一时解决不了就搁置了。今天又试了试,应该是解决了。
一、时钟要选MOCO
之前选的缺省的HOCO(High-Speed On-Chip Oscillator)48MHZ
改成了MOCO(Middle-speed on-chip oscillator ) (8 MHz)就可以了。
bitrate也可以设到8000000
二、DMA优化
要想DMA速度快,就要每开启一次DMA输出的时候尽量传的数据要多。
所以,先设置一个缓存:
uint8_t line_buff[256];
对应屏幕一行的数据。
清屏函数Lcd_Clear_Dma:
void Lcd_Clear_Dma(unsigned int Color)
{
unsigned int i;
for(i=0;i<128;i++){
line_buff[i*2]=Color>>8;
line_buff[i*2+1]=Color&0xFf;
}
Lcd_SetRegion(0,0,X_MAX_PIXEL-1,Y_MAX_PIXEL-1);
LCD_CS_CLR;
LCD_RS_SET;
for(i=0;i<Y_MAX_PIXEL;i++)
{
g_transfer_complete = false;
R_SCI_SPI_Write(&g_spi0_ctrl,line_buff,256,SPI_BIT_WIDTH_8_BITS);
spi0_wait_for_tx();
}
LCD_CS_SET;
}
说明:
1、用color将line_buff填满,这样line_buff就有了一行的颜色值。
2、Lcd_SetRegion(0,0,X_MAX_PIXEL-1,Y_MAX_PIXEL-1);设置输出范围。
3、R_SCI_SPI_Write(&g_spi0_ctrl,line_buff,256,SPI_BIT_WIDTH_8_BITS);通过SPI DMA一次发送256个字节的line_buff数据。
4、spi0_wait_for_tx();等待SPI传输完成。
5、不断重复3、4,将屏幕填满。
spi0_wait_for_tx:
static void spi0_wait_for_tx(void)
{
while (g_transfer_complete==false)
{
;
}
}
sci_spi_callback SPI中断回调函数负责设置g_transfer_complete
volatile bool g_transfer_complete = false;
void sci_spi_callback (spi_callback_args_t * p_args)
{
if (SPI_EVENT_TRANSFER_COMPLETE == p_args->event)
{
g_transfer_complete = true;
}
}
三、效果
1102
|