大話 SPI 通信 -- 基礎鞏固篇

正文

SPI 通信在嵌入式領域是非常常用的一種通信方式了,相比串口、IIC 等等,SPI 通信是一種高速、高效率的串行接口技術。

然而最近在新項目開發中使用 SPI 通信卻遇到了不少問題,過程中還是有挺多技術細節和知識點需要把握住的,那麼今天 bug 菌就結合最近的使用情況和一直以來在 SPI 通信上踩過的坑進行總結和記錄,一起避坑。

本文爲基礎鞏固篇:

1

通信形式

SPI 是一種全雙工、同步串行的通信方式,全雙工、半雙工等,表示某一時刻,數據的流動形式,全雙工即可雙向同時收發,而半雙工則在一個時刻只能收或者發,通常全雙工具有兩條獨立通信線路,而半雙工則共用同一條線路。

從 SPI 通信接線圖可以看出,MOSI 用於主機數據輸出,從機數據輸入,MISO 引腳的數據流則剛好與之相反,所以數據流收發是走的兩條獨立的線路,從而可實現全雙工通信模式,當然你也可以用於只用於單向數據傳輸,比如省略掉 MISO 僅主機傳輸從機數據等。

SPI 通信有一個 SCLK 時鐘線作爲通信的同步信號,用來標定數據在 MOSI 和 MISO 引腳上的傳輸情況,SCLK 是由主機來控制提供,從機檢測識別,從而同步完成數據傳輸。

片選信號 CS 引腳,還記得有一次面試問片選信號 CS 英文是什麼?英文直譯即可 --Chip Select。

片選信號在大部分數字芯片都有存在,外界給該引腳相應的電平即可選中,相當於一個 "總開關",大部分從設備都是低電平被選中(電路圖中通常在 CS 上劃線標識),如果一直被選中則直接接地即可;當然也有少部分高電平選中則可直接接到 VCC,切記不可懸空,以免異常。

這樣看 SPI 的通信線路非常簡單,沒有繁雜的線路硬件也省了不少事,但很多朋友包括 bug 菌曾經因爲把主機的 MOSI 接到從機的 MISO 而折騰得不輕,都是慣性思維惹的禍,一定要記住是對應引腳相連。

2

通信線路

SPI 是一種主從通信方式,在 SPI 通信總線上通常只有一個主機,一切通信的開始都是以主機發起,那如果在一條總線上與多個從設備通信呢?下面以兩個從機爲例,更多的從機也是類似的。

通過不同的片選引腳來選中不同的從設備,從而完成一對多的通信過程。通常多從機的情況都會採用多餘的 IO 口連接從設備的片選引腳,以便分時控制從設備,達到一主多從機的主從控制方式。

當然如果獨立的 IO 口引腳有限,可以採用 IO 口擴展芯片進行選中,也是比較方便的。

3

通信數據

SPI 通信是一種交換數據的形式,主機根據 SCLK 時鐘把數據從 MOSI 引腳按 bit 位發送的同時,從機也以相同的速率把數據從 MISO 引腳傳輸,其傳輸數據形式如下:

從 SPI 通信數據流圖可以看出其發送與接收形成了一個封閉的環,所要傳輸的數據像水在一根管道內循環流動,所以其硬件線路上並沒有像 I2C 那樣有所謂的應答機制,通信效率上提高不少,但數據可靠性也會有一定的減弱。

前面 bug 也談到 SPI 是一種主從通信機制,那麼使得 “管子” 內數據流湧動的源泉一方面需要 SPI 的 SCLK 時鐘保持好節奏,另一方面就是需要主機來推動,所以如果 master 只是想獲取 slave 的數據,也需要發送空數據來使得整個數據流動起來,從而獲得從機的數據。

細心的朋友應該注意到上圖中 MSB 和 LSB 方向了,通常 SPI 通信都是以 MSB 來進行發送,但像 stm32 芯片這樣的芯片可以設置是 LSB 先發送還是 MSB 先發送。

所以在分析 SPI 通信數據的時候這些數據都是需要提前瞭解的。

4

通信電平‍

SPI 比較麻煩點的就是時鐘極性和時鐘相位的確定了,但再怎麼麻煩也就確定了 4 種模式。

如下是 4 種模式的時序圖,其中 CPOL(Clock Polarity) 表示時鐘極性,CPHA(Clock Phase) 表示時鐘相位。

從圖中我們可以分析得到:

1、CPOL 和 CPHA 共同決定數據的採集方式。

2、CPOL 決定了 SCLK 默認狀態,當 CPOL=0,時鐘空閒時是低電平;當 CPOL=1,時鐘空閒時爲高電平。

3、CPHA 決定了數據在第幾個跳變沿採集,當 CPHA=0,在 SCLK 第一個跳變沿採集穩定數據;當 CPHA=1,在 SCLK 第二個跳變沿採集穩定數據。

每個 bit 的數據交換,都是在電平穩定的時候進行數據電平採集,在電平變化的時候進行數據發送,一般從設備像高精度 ADC 等等,出廠就已經是固定了某種模式,我們需要做的就是通過配置可編程的主機 SPI 外設在相同的一種頻率和模式下通信,否則就是造成數據錯亂。

現在比較流行庫開發,很多外設使用案例直接可以拿過來用,或者嘗試着調整幾個參數就可以了,似乎不需要懂太多的原理,但這樣的學習終究只是把芯片玩起來了,要做到一通百通還是得從最原始的理論出發,只有把握住這些重點才能在項目開發的過程中直面問題並搞定它。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/AWkowwFdX3xo-oxBsCIPpA