關於三線SPI驅動ST7789V

2021-10-11 02:04:26 字數 1353 閱讀 4471

最近在做專案的過程中,公司採購了一款由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...