1. 程式人生 > >stm32驅動ili9486液晶顯示屏

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
使用者可以自己提取對應驅動晶片的初始化檔案用到自己的工程中。