一. 簡介
相信大家都玩過屏幕,在FPGA上使用最多的就是VGA/HDMI接口的顯示器了,這兩種顯示器的優(yōu)點就不用說了,缺點就是體積比較大,而且價格比較貴,對于追求便攜/價格低的我來說,SPI接口的屏幕才是我的首要選擇,而且一般是可以帶觸摸的哦。
此為圖像處理的基礎,后面圖像處理相關的代碼都會基于此屏幕哦!
二. SPI屏幕驅動(驅動芯片ST7789V)
1. SPI模式
SPI時序就不介紹了,很重要且必須要掌握的協(xié)議。要想驅動屏幕,最關系的肯定是使用那種模式來驅動了,答案就在這里,數(shù)據在SCL時鐘的上升沿被采樣,數(shù)據在SCL時鐘的下降沿切換(空閑的時候對SCL的電平不作要求),對應的模式為0和3。
2. 初始化
摸清楚SPI的模式之后,就可以開始初始化屏幕了,最簡單高效的方法當然是參考C語言的現(xiàn)實。
可以看出,初始化的過程就是依次發(fā)送命令和數(shù)據即可。那么如何辨別命令和數(shù)據呢?
通過下圖可以清楚的知道,是通過DC信號線的電平來區(qū)別的(低電平表示當前發(fā)送的數(shù)據為命令)。
弄懂了上述問題之后,就可以按照C語言實現(xiàn)依葫蘆畫瓢,依次將命令和數(shù)據發(fā)送出去即可。另外有兩點需要注意的是:
兩條命令不能連續(xù)發(fā)送,中間需要停頓數(shù)個時鐘周期;而數(shù)據則不需要。
命令到數(shù)據,或者數(shù)據到命令,是不能連續(xù),中間需要停頓數(shù)個時鐘周期。
另外這三個命令需要注意一下0x36,0x2A,0x2B,它們分別是設置顯示的方向(還有就是數(shù)據是RGB還是BGR)、列地址和行地址。0x36涉及到的東西比較多,需要詳細了解的可以自行去翻閱數(shù)據手冊。
經過上面的初始化,如果成功了,屏幕上顯示出雜亂無章的圖案。
3. 顯示數(shù)據
C語言的實現(xiàn)如下,設置要顯示X,Y的范圍,也就是矩形的左上角和右下角的值,然后發(fā)送要顯示的數(shù)據即可。非常簡單。
三. FPGA實現(xiàn)
有了C語言作為參考,F(xiàn)PGA端的實現(xiàn)那還不是小菜一碟,總共只需要分為如下的三個模塊:
SPI主機模塊: 用來和屏幕進行數(shù)據交互
屏幕初始化模塊: 將初始化數(shù)據依次通過SPI主機模塊發(fā)送給模塊
屏幕刷新模塊: 將顯示數(shù)據依次通過SPI主機模塊發(fā)送給模塊
模塊框圖如下,有點小哈()
SPI主機模塊和初始化模塊非常簡單,就不作說明啦!重點來說說刷新模塊。
刷新模塊不會像單片機中那樣,調用的時候才會進行刷新,而且在初始化完成之后,就一直在對整個屏幕進行刷新了,
1. 模塊狀態(tài)跳轉
模塊由如下四個在狀態(tài)組成,在發(fā)送前11個數(shù)據的時候,需要進入打啊奧延時狀態(tài),原因是這11個數(shù)據中既有命令也有數(shù)據(此數(shù)據,懂?), 后面則一直在DATA態(tài),它只包括顯示數(shù)據,所以不需要延時。最后一個顯示數(shù)據發(fā)送完成后,就進入幀同步狀態(tài),表示一幀數(shù)據發(fā)送完成。
2. 圖像顯示數(shù)據
很easy!發(fā)送完前面的命令和數(shù)據后,剩下的全部都是顯示數(shù)據了,都丟在default里面就可以了。這里暫時寫死了(后面會將顯示的數(shù)據修改為模塊輸入的數(shù)據)。
3. 模塊端口
端口信號如下,著重關注用戶接口的三個信號即可,非常easy!
四. 模塊封裝
spi模塊top模塊的接口如下,很明顯不夠完美,無法知道當前顯示的像素坐標,而且圖像數(shù)據一般為16bit的,而這個模塊的輸入為8bit的數(shù)據,另外在替換VGA接口的屏幕時候,也不能簡單高效的替換下來,所以需要經過一次封裝,將其與外部進行交互的端口信號封裝為VGA接口的信號(近似)。
封裝后的模塊端口信號如下,其內部實現(xiàn)類似于VGA驅動。
五. 上板測試
測試代碼如下,顯示四個方塊,是不是感覺so easy!。
測試圖片如下,顯示效果完美!!!!
審核編輯:湯梓紅
-
FPGA
+關注
關注
1630文章
21796瀏覽量
606010 -
顯示器
+關注
關注
21文章
5010瀏覽量
140406 -
SPI
+關注
關注
17文章
1721瀏覽量
92125 -
驅動芯片
+關注
關注
13文章
1295瀏覽量
54922
原文標題:FPGA驅動SPI屏幕
文章出處:【微信號:FPGA研究院,微信公眾號:FPGA研究院】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論