您好,登錄后才能下訂單哦!
這篇文章主要介紹了樹莓派4 rt-thread如何實現SPI屏人機交互界面,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
樹莓派4的rt-thread一直在不斷的更新,充分挖掘可以樹莓派底層硬件的特性,同時借助各種外設,使得樹莓派4成為一個更加適合學習嵌入式開發,驗證各種外設功能,學習操作系統的好用的平臺。
在樹莓派4上進行各種外設的開發,需要一定的嵌入式調試經驗與驅動調試方法,因為樹莓派雖然資料很多,但是關鍵核心的芯片資料卻非常的少,都是進行應用層面的開發工作。為了更加深刻的學習嵌入式,了解方法是不夠的,而是要弄清楚原理才行。本文主要是介紹樹莓派4圖像,觸摸相關的使用方式,從而實現GUI的移植和界面交互。
樹莓派4默認是不帶任何屏接口的顯示的,可以接上HDMI接口。
另外,樹莓派4上帶有MIPI的顯示器DSI排線接口,可以通過排線進行連接。
這兩種顯示接口的驅動實現,都已經在樹莓派的videocore中實現了,具體的實現細節需要查看相關的GPU的使用。作為學習嵌入式圖像這一塊,已經無法從樹莓派上進行任何的底層相關的開發了。想調用圖像的讀寫操作,可以通過CPU與GPU的通信管道作為數據的傳輸通道,具體可以查看mbox的驅動實現細節:
https://github.com/RT-Thread/rt-thread/blob/master/bsp/raspberry-pi/raspi4-32/driver/mbox.c
將圖像放到一段內存空間,然后發消息給GPU,讓其去該地址取數據,最后就可以在屏幕上看到顯示的畫面了。
這一種只有顯示,如果要實現觸摸,還需進行另外的接口實現。一種是DSI可以將觸摸的坐標傳遞給GPU,通過mbox取獲取坐標數據,另外一種接HDMI屏的常見做法就是將觸摸另外接到USB上,通過USB獲取坐標點。這是常見的實現手段。
除此之外,微雪則出了MHS-3.5inch RPi Display
的3.5寸的SPI屏。
http://www.lcdwiki.com/MHS-3.5inch_RPi_Display
下圖是基本的展示:
該屏是利用SPI總線所驅動,最大spi速率支持125Mhz。支持電阻屏觸摸。而且價格也很便宜。是本文研究的重點。
要想將該屏驅動起來,首先必須了解的是SPI協議,以及bcm2711芯片的spi控制器的使用。所有深度的研讀了rpi_DATA_2711_1p0.pdf
文檔。
https://gitee.com/bigmagic/raspi_sd_fw/tree/master/doc/raspi4
重點是說,樹莓派4的SPI是支持兩種模式的,一種是標準的SPI總線。
這個很基本,也就是CE片選決定是那個設備,主機通過傳輸SCLK時鐘信號,然后傳輸MOSI,從機響應數據,MISO。這是標準的SPI協議,可以好好復習一下。
另外一種則是LOSSI模式。
也就是低速串行總線。片選外設后,主機可以通過SCL發送時鐘,然后通過SDA發送數據,從機接受到數據后,也會通過SDA數據線傳輸到主機。只有一條線傳輸數據。
區分的方法就是在發送數據位時比如發送8位數據位,則會在前面增加一位表示讀寫。這種適合于低速外設總線的使用。這一種模式目前暫時沒有使用到,后面使用的時候再進行分析。
具體細節我就不過多的展開,反正調試就占用了兩天時間,下面主要講一講調試的心得和步驟。
標準的SPI屏接上后,觸摸和LCD都是用的同樣的SPI線。
通過CS引腳進行選擇,正好對應上樹莓派SPI0的兩個片選。我剛開始調試的是LCD,由于LCD的主控是ILI9486
,看來一下芯片手冊,準備按照以往的調試經驗,先讀出出廠ID試試。怎么都不讀到數據,嘗試了好久,結果仔細看上圖,發現SO引腳上標注的是Touch panel SPI data output
。原來是不能輸出數據的呀。于是轉換方向,先調試觸摸,因為觸摸標準一些。
剛開始的時候,觸摸讀不到數據,因為SPI驅動寫的不好,而且測試也不嚴格,對SPI的協議理解不深刻,后來干脆采用邏輯分析儀跟蹤數據。才發現速率太高了,原來這個觸摸支持的spi的頻率是很低的,只有幾百K。我終于看到數據讀出來變化了。
由于是電阻屏,所以讀到的是12位的數據,讀到2個字節,然后計算偏移得到12位的數據,總體變化范圍是0到2048之間。按照這個規律,不斷的在屏的上下左右角度測試坐標,終于測試得到了以下結論。
XPT2046:Width:320 High:480
no pressed:(0x800,0xfff)
---ETH----USB-----------------------
| (0x800,0x800) (0xfff,0x800) |
| |
| (0x800,0xFFF) (0xfff,0xfff) |
------------------------------------
不進行觸摸得到的數據(0x800,0xfff)
,各個角度的值可以看上面的信息。
計算坐標,由于電阻屏,每個點的坐標均勻分布,有著二次方程的線性關系。很容易就通過取到的數據算出坐標點了。調試這個花費了一天時間。終于可以開始調試LCD了。
由于兩個片選不一樣,而且只能寫不能讀,這樣調試起來需要非常的精確。首先LCD復位,也就是22號引腳先高電平再低電平再高電平。此時完成復位動作。
接著,注意命令和數據是一個GPIO的高低電平進行控制的。這個細節要注意。接著就是開始傳輸配置的參數了,參數主要參考類似的lcd的實現。參數傳遞完成,屏的面板顯示又白色變成黑色,這個是證明參數寫進去的關鍵。為了這個細節的實現,調試了許久。然后寫數據到lcd中。
剛開始的時候,刷屏的速度肉眼可見,每個坐標點在變化,這肯定不能接受,然后算了一下SPI的頻率還不到1MHZ。這肯定不行,于是配置樹莓派SPI,將時鐘提升到125Mhz。速度雖然有了提升,但是還是不夠,差不多1s才能刷新全屏。最后直接跳過rt-thread的spi框架,直接操作底層進行SPI寫數據。發現真的快了許多。
用數據來說話,用Image2LCD來生成一張圖像,進行刷屏測試。
最后的結果如下所示:
由于操作系統的tick為10ms,所以測試得到差不多40到50ms,所以幀率在20~25幀左右。這是目前實測的數據。雖然速率不是特別高,但是還是可以接受的。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“樹莓派4 rt-thread如何實現SPI屏人機交互界面”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。