這幾天學完了 stm32 的 SPI 通信,今天來寫學習筆記。
(一)什麼是 SPI 通信?#
SPI(Serial Peripheral Interface)是由 Motorola 公司開發的一種通用數據總線,有四根通信線:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slave Output)、SS(Slave Select,為同步,全雙工通信,支持總線掛載多設備(一主多從)。
(二)SPI 硬體電路#
SPI 的硬體電路圖如下(圖片終於能發了!):
其中 SCK 時鐘線與所有設備相連,發送時鐘信號;
MOSI 為主機發送從機接收線,MISO 為主機接收從機發送線;
SS 是片選,主機和所有從機都有一條片選來連接,用於指定從機。
(三)SPI 時序#
SPI 時序的基本單元為:開始,結束,交換一個字節。
其中與 USART 和 I2C 相比,交換一個字節是 SPI 的一大特徵,這個過程就是主機和從機直接進行數據交換,而不是一方發送一方接收。
開始和結束時序比較簡單,只需置高或者置低 SS 即可:
交換一個字節由 CPOL 和 CPHA 兩個參數決定了四種模式。
CPOL:空閒狀態 SCK 電平。
CPHA:SCK 上升沿或下降沿採集數據。
四種模式時序圖如下:
(三)軟體 SPI#
軟體 SPI 需要選擇四個引腳來配置,其中 SS、SCK、MOSI 配置為推挽輸出,MISO 配置為上拉輸入:
然後我們寫好三個時序基本單元:
隨後我們就可以使用這三個時序基本單元組成完整時序使用 SPI 通信了。
這邊我們寫了 W25Q64 的幾個函數,主要是通過命令的方式,先發送開始時序,然後發送命令,然後發送命令的一些參數,最後結束,這裡展示讀取 ID 的命令:
(四)硬體 SPI#
stm32 內部有 SPI 的通信外設,其基本結構如下:
與 I2C 不同,SPI 中發送和接收各有一個緩衝區,但共用一個移位寄存器。
配置過程如下:
其中,我們需要把 MOSI 和 SCK 配置為複用推挽輸出,其他兩個不變(SS 沒有用到 SPI 外設,因為 NSS 不具備其功能),然後我們配置結構體,結構體參數如下:
SPI_BaudRatePrescaler—— 波特率,決定傳輸快慢
SPI_CPHA—— 前面提到的 CPHA
SPI_CPOL—— 前面提到的 CPOL
SPI_CRCPolynomial——CRC 校驗,我們這裡不需要用到,不過不能置 0,別問我為什麼知道。
SPI_DataSize—— 數據大小,我們使用 8 字節傳輸。
SPI_Direction—— 傳輸方向,我們選擇全雙工。
SPI_FirstBit—— 高位先行還是低位先行,我們選擇高位先行
SPI_Mode——SPI 模式,我們選擇主機模式
SPI_NSS——NSS,用於多主機用的,我們用不到,這裡隨便選一個。
然後開始和結束時序代碼不需要更改,我們改一下交換數據的代碼:
代碼主要遵照如下時序圖:
以上,就是 SPI 的全部內容,886.