stm32驱动ili9486液晶显示屏
这是我接手的第一个小项目,也是第一次我写的代码真正排上用场,虽然不超过50行。但遇到的阻碍,我想确实硬件厂商善意的刁难。这个项目最大的收获是弄清楚我与软件工程师最大的不同吧!给我职业生涯上的第一个教训。下面言归正传(驱动见51hei论坛附件TFT资料)。
(一)ili9486显示屏简介
ili9486支持262144种色彩,有320RGB*480个像素点,内部GRAM345600Bytres(320*480*18bit),有全彩(262K_colors,65K_colors)和idle(8_colors)两种显示模式,支持8种总线,用IM2,IM1,IM0决定,见下图
支持16bit-RGB(5,6,5)和18bit-RGB(6,6,6)两种色彩格式,也用单一纯色格式(in idle mode)。
(二)常用命令
显示屏的需求,最多的还是在怎样满足我们的显示要求,比如横屏,竖屏,颜色格式,刷屏速度等等。这里只稍微讲一下在此次项目中用到的命令,慢慢补充。
1)与坐标原点相关的命令:
1.Display Function Control(B6h)
命令主要参数:GS,SM,SS
2.Memory Access Control (36h)
命令主要参数:MX,MY,MV,BGR(色彩模式RGB or GBR),MH,ML
2)设置指针位置
1.Set Page Address (2Bh)
设置指针X起点, 默认情况为0~13F(B5= 0),受36h的第五位(B5)影响0~1DF(B5 = 1)
2.Set Column Address (2Ah)
设置指针Y起点, 默认情况为0~1DF(B5= 0),受36h的第五位(B5)影响0~13F(B5 = 1)
3)设置像素格式
1. Interface Pixel Format(3Ah)
设置是16bit或则18bit的像素。DPI设置接口像素格式,DBI设置CPU像素格式
4)连续写
1.Memory Write Continue (3Ch)
要在使用Memory Write (2Ch)后使用此命令,最多能连续读取65535个字节。
(三)与uCUI接口相关函数
接口函数在GUI/LCDDriver文件夹下LCD_Dummy.c以及Config目录下LCDConfig.h。
1. LCD_Dummy.c主要是接口相应显示屏
1--void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) 设置像素点,要使用自己的函数实现设置像素点功能。下面一个简单的例子:
void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)
{
LCD_Setpixel(xPhys, yPhys,PixelIndex);//底层TFT相关的函数(可以转换XY的值,达到想要的效果)
}
2--void LCD_L0_DrawVLine (int x, int y0, int y1)//画横线
3--void LCD_L0_DrawHLine (int x0, int y, int x1)//画竖线
注:这两个函数,可以不用替换,uCGUI默认情况下给一个坐标,画一个像素点(速度慢,但准确,无差错)。如果你觉得你使用自己的函数更加快速,可进行替换(ili9486有自动移动指针的功能,可以只送一个起始点,然后送数据,指针会自动加也会自动换行(列),而不用送坐标地址)
4--LCD_L0_DrawBitmap(...)//画位图
5--DrawBitLine16BPP(...)//画位图主要功能函数
注:这两个函数底层功能函数与2,3两个函数类似,但色彩不同。自行替换时要注意相关参数。
2.LCDConfig.h需修改如下项
#define LCD_XSIZE (480) /* X-resolution of LCD, Logical coor. */
#define LCD_YSIZE (350) /* Y- resolution of LCD, Logical coor. */
#define LCD_BITSPERPIXEL (16) //像素点位数
#define LCD_CONTROLLER -1 // -1表示不在GUI_Init()里面初始化显示屏
#define LCD_SWAP_RB 1 // 1--BGR 0--RGB
#define LCD_MIRROR_X (1) //0 If active: X ->-X /1--翻转X轴起点
#define LCD_MIRROR_Y (0) //0 If active: Y -> -Y /1--翻转Y轴起点
#define LCD_SWAP_XY 1 //0 If active: X <->Y/1--调换XY的值
(四)FAQ
1.显示颜色不对,而图像轮廓正确
1)这个问题最常见的是RB调换,TFT显示屏常见的像素格式为BGR(5,6,5),而一般的windows的格式为RGB(5,6,5),这个问题只要转换Memory Access Control(36h)命令BGR参数即可。
2)第二个可能原因是由于高低字节的问题,这款ili9486的显示屏为低字节在前,高字节在后,可以在送数据到显示屏之前将数据转换一下。
3)如果以上步骤没有将颜色的问题解决,考虑显示屏质量问题或者屏幕焊接问题(换块显示屏试试)。
2.背景图显示不正确,没有完整的图像
1)这个问题主要是取图像大小时出错,如果要铺满整个屏幕的话,图像一定要与显示屏规格相同,例如:ili9486是320*480,所以你的图像大小也要为320*480或者横屏480*320,不能多也不能少,否则不会正确显示图像。
3.图像无法整屏显示,或者是整屏显示需要更多的像素点
1)这个问题很有可能是总线模式选择错误,ili9486支持多种纵向模式8、9、16、18以及3/4SPI等等,总线模式取决于IM[2:0]的选择,详细内容请参考相关数据手册。
2)还有一个可能是数据在传输的过程中丢失了(因为传输速度过快/频率太高),可以每传送一次数据,延时一段时间,观察有没有出现漏点的情况(对比色要鲜明),或者调整频率,让送数据的速度变慢些(不太建议这样做,因为频率low,可能导致其他问题出现,频率high也是)。
4.屏幕总是白屏,而无法显示其他内容
1)这问题最有可能是因为屏幕的显示模式不正确,极有可能处在idle模式下,加入命令0x0011(退出idle模式,进入normal模式)可解决。
5. 颜色抖动现象
1)这个问题最有可能的是电路上的问题,可以尝试重新焊接一下。
(五)测试
1.颜色测试:让显示屏显示出三原色的三种纯色,三种颜色正确,基本不会出现颜色问题,若出现颜色问题,考虑硬件上的问题。
2.刷屏测试:用320*480个像素点刷屏,如果能铺满整屏,总线模式正确。反之模式不正确。
注意:
3.5_TFT彩色LCD模块 驱动芯片型号为SSD2119
3.2_TFT彩色LCD模块 驱动芯片型号为ILI9320
2.8_TFT彩色LCD模块 驱动芯片型号为ST7781、ILI9325、ILI9328、或ILI9331。具体是哪种控制芯片可以在UCGUI程序里初始化LCD程序的读ID函数里下个断点即可看到器件ID号。
驱动程序全兼容这些控制芯片,要想详细了解控制芯片请查看目录下的对应芯片数据手册,ILI9328的数据手册请参考ILI9325的。两个是一样的,只是读到的ID不一样,驱动程序也是相同的。
SSD2119 读到的ID为 0x9919
ILI9320 读到的ID为 0x9320
ILI9325 读到的ID为 0x9325
ILI9328 读到的ID为 0x9328
ILI9331 读到的ID为 0x9331
ST7781 读到的ID为 0x7783
LGDP4531 读到的ID为 0x4531
用户可以自己提取对应驱动芯片的初始化文件用到自己的工程中。