最近在做專案的過程中,公司採購了一款由st7789v驅動的螢幕。由於考慮到fpc形狀,又本著節約開模定製的錢,故而買了三線spi介面模式的螢幕。
三線spi,即硬體介面只有sda資料線,clk時鐘線以及cs片選。三線spi最尷尬的就是不像四線spid/c資料/命令選擇線,三線spi要想區分發的是資料還是命令,那就要在8位資料前多發一位0/1,進而確定發的是資料還是命令。如下所示:
那這就很尷尬了,本身我們spi就是發的8位資料,這就違背了標準的spi協議。在程式上,用模擬spi我們還能仿照時序,但是我們用硬體spi又該如何傳送?才能讓st7789v準確接收並識別呢?
其思想就是9位資料按照按照兩個位元組發,spi從高位開始傳送,發完有效的9位資料後,剩下發7個零就可以。這樣顯然浪費了資源,但這卻是不改變硬體下最好的解決辦法。
我寫這篇文章的主要目的是記錄一下封裝spi傳送16位資料的函式,傳送單個資料程式寫起來並不困難。我在後續用於填充顏色時,發現顏色填充並不理想,後來去翻了st7789v的手冊,找到了傳送顏色的時序,也是自己做了修改和優化。為了防止以後再碰到浪費時間,我這裡做一下簡單的記錄。
我用的晶元時nordic公司的一款晶元,但是處理流程同樣適用stm32,只需要修改一下spi傳送函式即可。
我選擇的時65k16位真彩色模式。即rgb各佔位數5-6-5,根據上圖時序,我們利用硬體spi需要處理成標準8位格式,就需要把乙個16位的顏色分成3個8位來發,並且還要滿足上圖的時序。具體原理我這裡就不進行詳述,我將我**貼到下面,並不難理解,就是利用位運算,大家自己在紙上畫一畫就可以明白其中的緣由:
//寫16位資料
//data:要寫入的值---發資料
void
lcd_wr_data
(uint16_t data)
spi_tx_buf[1]
= dat2;
dat3 =
(dat&
0x0000ff
)>>1;
if((dat&
0x100)!=
0x00
) spi_tx_buf[2]
= dat3;
spi_xfer_done = false;
(nrf_drv_spi_transfer
(&spi, spi_tx_buf, len, spi_rx_buf, len));
while
(!spi_xfer_done)
;}
三線SWD模式Jlink
在公司實習,部門經理讓我做乙個usb can的介面卡。在網上找資料,找到乙個開源的usb can的介面卡的資料。採用的是cp2102晶元實現usb轉串列埠。stm32作為主控,高速can收發器採用是tja1050。由於usb can介面卡要求小巧,在給stm32燒寫程式除錯的時候,傳統20腳jtag...
LaTex繪製三線表
tabular 環境提供了最簡單的 功能。它用 hline 命令表示橫線,表示豎線 用 來分列,用 來換行 每列可以採用居中 居左 居右 等橫向對齊方式,分別用 l c r 來表示。三條橫線就分別用 toprule midrule bottomrule 等命令表示。begin htbp center...
三線SWD模式Jlink
在公司實習,部門經理讓我做乙個usb can的介面卡。在網上找資料,找到乙個開源的usb can的介面卡的資料。採用的是cp2102晶元實現usb轉串列埠。stm32作為主控,高速can收發器採用是tja1050。由於usb can介面卡要求小巧,在給stm32燒寫程式除錯的時候,傳統20腳jtag...