本文描述用RA2E1分别用软件和硬件SPI两种方式驱动LCD(ST7735)屏。
一、软件SPI驱动LCD
连线图:
1、FSP配置
时钟是默认配置
将所有用到的gpio都设置成相同配置
2、程序说明
软件模拟SPI发送数据
void SPI_WriteData(unsigned char Data)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
if(Data&0x80)
LCD_SDA_SET;
else LCD_SDA_CLR;
Data<<=1;
R_BSP_SoftwareDelay(6, BSP_DELAY_UNITS_MICROSECONDS);
LCD_SCL_CLR;
R_BSP_SoftwareDelay(6, BSP_DELAY_UNITS_MICROSECONDS);
LCD_SCL_SET;
}
}
必须要说明的是这里增加了2个延时,因为经过反复实验如果没有延时是不工作的。而对于很多芯片来说,这2个延时是不必须的,延时增加的开销,会导致软件模拟SPI速度变慢。
写指令:
void Lcd_WriteIndex(unsigned char Index)
{
LCD_CS_CLR;
LCD_RS_CLR;
SPI_WriteData(Index);
LCD_CS_SET;
}
写数据:
void Lcd_WriteData(unsigned char Data)
{
LCD_CS_CLR;
LCD_RS_SET;
SPI_WriteData(Data);
LCD_CS_SET;
}
二、硬件SPI驱动LCD
RA2E1提供了2中硬件SPI方式,一种是标准的SPI,一种是基于SCI的简单SPI。两种方式实现方式差不多,标准SPI更灵活一些,下面以标准SPI为例。
连线图同前。
1、FSP配置
1、时钟
2、新建Stack->SPI0
SPI0配置:
还是必须要说明的是Bitrate不能设置太大,否则LCD不工作,实验了好久,之前设置720000,不用延时可以工作,但现在只能设到480000,并且要延8个时钟,总之非常不稳定。
2、程序说明
1、hal_entry中调用SPI OPEN
err = R_SPI_Open(&g_spi0_ctrl, &g_spi0_cfg);
assert(FSP_SUCCESS == err);
2、回调函数设置接收标志
volatile bool g_transfer_complete = false;
void spi_callback (spi_callback_args_t * p_args)
{
if (SPI_EVENT_TRANSFER_COMPLETE == p_args->event)
{
g_transfer_complete = true;
}
}
3、SPI发送数据
void SPI_WriteData(uint8_t Data)
{
fsp_err_t err = FSP_SUCCESS;
g_transfer_complete = false;
err=R_SPI_Write(&g_spi0_ctrl,&Data,1,SPI_BIT_WIDTH_8_BITS);
spi0_wait_for_tx();
}
static void spi0_wait_for_tx(void)
{
while (g_transfer_complete==false)
{
;
}
}
4、DMA方式清屏
为了发挥DMA的优势,一次发送多个字节
所以定义了一个数组做为DMA的SRC:
uint8_t line_buff[128*2*16]={0};
下面程序通过DMA一次发送16行的数据到LCD:
void Lcd_Clear_DMA(unsigned int Color)
{
unsigned int i,m;
fsp_err_t err = FSP_SUCCESS;
Lcd_SetRegion(0,0,X_MAX_PIXEL-1,Y_MAX_PIXEL-1);
Lcd_WriteIndex(0x2C);
for(m=0;m<Y_MAX_PIXEL*16;m++)
{
line_buff[m*2]=Color&0xff;
line_buff[m*2+1]=(Color>>8)&0xff;
}
LCD_CS_CLR;
LCD_RS_SET;
for(i=0;i<X_MAX_PIXEL/16;i++)
{
g_transfer_complete = false;
err=R_SPI_Write(&g_spi0_ctrl,&line_buff,256*16,SPI_BIT_WIDTH_8_BITS);
spi0_wait_for_tx();
}
LCD_CS_SET;
}
总结
虽然软件SPI和硬件SPI都实现了驱动LCD,但效果没有达到预期效果。为了显示都做了各种延时,感觉哪里不对,但是说不清楚。