SPI 協議學習


SPI 協議學習

背景

2年之前學過SPI,但是因為現在太久沒用、基礎知識不牢靠(對自己的面試表現不滿意);所以重新整理了一遍。

SPI接口的一個缺點:沒有指定的流控制,沒有應答機制確認是否接收到數據

介紹

SPI是串行外設接口(Serial Peripheral Interface)的縮寫;是 Motorola 公司推出的一種同步串行接口技術,是一種高速的,全雙工,同步的通信總線。

作為嵌入式工程師的老朋友,SPI與I2C一樣,都可以用在對各類芯片通信上(實現對芯片的配置)。

一些比較好的配置芯片運行同時支持I2C、SPI或者其他總線協議。

通常,SPI是一種4線制的全雙工總線協議;它們分別是:

  • SDI(數據輸入):(主)設備數據輸入;因為這里的 輸入指的是主機的輸入,那么對於對端來說,就是從機輸出;所以通常被稱為MISO。
  • SDO(數據輸出):主設備數據輸出,從設備數據輸入,即MOSI。
  • SCLK(時鍾):時鍾信號,由主設備產生。通信時一直變化,沒有通信時保持固定電平。
  • CS(片選):從設備使能信號,由主設備控制。一般每一個從設備的CS都不一樣。

如果只需要單向接收,那么可以省去一個IO。

結合框圖理解一下:

SPI拓撲圖

當有多個從設備的時候,因為每個從設備上都有一個片選引腳接入到主設備機中,當我們的主設備和某個從設備通信時將需要將從設備對應的片選引腳電平拉低或者是拉高。

SPI 通信速度

SPI 通信速率:一般情況下,SPI模塊的最大時鍾頻率為系統時鍾頻率的1/2。

不比I2C,SPI的通信速率主要看主從器件SPI控制器的性能限制:

  1. SPI的最大時鍾頻率(短板理論)
  2. CPU處理SPI數據的能力
  3. 輸出端驅動能力(PCB所允許的最大信號傳輸速率)

SPI的最大時鍾頻率

一般情況下,SPI模塊的最大時鍾頻率為系統時鍾頻率的1/2。雖然SPI的傳輸速率主要受限於CPU處理SPI數據的能力,但在同另一個非高速率的SPI設備通訊時,其SPI的最大時鍾頻率將有可能制約其傳輸速率

短板效應:盛水的木桶是由許多塊木板箍成的,盛水量也是由這些木板共同決定的。若其中一塊木板很短,則盛水量就被短板所限制。這塊短板就成了木桶盛水量的“限制因素”(或稱“短板效應”)。

CPU處理SPI數據的能力

通常情況下,考慮到系統中CPU有可能需要處理其他任務,以及對所接收SPI數據的具體運算處理方法,CPU處理SPI數據的能力將影響到整體的傳輸速率。

例如,系統在收到SPI數據后只是作簡單的累加。如果當前SPI模塊的時鍾頻率是1/2系統時鍾頻率,接收每一個SPI byte將需要16個系統時鍾周期。那么在下一筆SPI數據接收到之前CPU有足夠的時間來處理當前數據,此時SPI的最大傳輸速率即為系統時鍾的1/2。

接下來考慮另外一種情形,假設CPU有50%的時間用於處理其他任務,同時對所接收到的每byte SPI數據,需要100個系統時鍾周期來作運算處理。每接收1 byte SPI數據,CPU需要100個時鍾周期來作處理,同時需要100個時鍾周期來處理其他任務,因此總共需要消耗200個系統時鍾周期。用公式表達如下:

200 *Tsysclk = 8 * Tspiclk;
spiclk = sysclk/25;

因此,在這個例子中,我們可以看出SPI的最大傳輸速率由CPU處理SPI數據的能力所決定。

輸出端驅動能力

最后要考慮的因素是輸出節點的驅動力。PCB上的微量電容和器件引腳的輸出阻抗相結合,將會形成一個低通濾波器,限制設備間信號的傳輸速度。通常該濾波器的截止頻率可以近似為:

Fmax = 1 /(2 × π × Rdrive * Ctrace)

其中Rdrive是所驅動的最大阻抗值,Ctrace表示輸出節點所驅動的所有微量電容的總和。

在固定阻抗條件下,電路的微量電容將成為制約SPI傳輸速率的因素。系統中如果設備間的距離非常短(Ctrace較小值),那么CPU的處理能力或SPI的時鍾頻率將是主要限制因素。如果系統中總線上有多個SPI設備,同時設備間的連線很長(Ctrace較大值),那么輸出驅動能力將制約SPI的傳輸速率。

SPI模式

在SPI協議中,使用SPI通信時,需要注意兩個概念,這兩個概念共同決定了SPI通信的屬性。

時鍾極性CPOL,規定了時鍾的有效電平(高或低):配置SCLK的電平處於哪種狀態時是空閑態或者有效態

  • 若CPOL = 1,串行同步時鍾的空閑狀態為高電平(常高電平時不工作);
  • 若CPOL = 0,串行同步時鍾的空閑狀態為低電平(常低電平時不工作);

時鍾相位CPHA ,規定了數據的采樣時刻(奇或偶):是用來配置數據采樣是 在串行同步時鍾的 奇或偶 個 跳變沿(上升或下降)數據將被采樣

  • 若CPHA = 0,在串行同步時鍾SCLK的第一個跳變沿(上升或下降)數據將被采樣;
  • 若CPHA = 1,在串行同步時鍾SCLK的第二個跳變沿(上升或下降)數據將被采樣;
  • 時鍾相位選擇,為0時在SCK第一個跳變沿采樣,為1時在SCK第二個跳變沿采樣

根據CPOL(時鍾極性)和CPHA(時鍾相位)的不同,市面上的總線協議共有4種模式:

  • Mode0:CPOL=0,CPHA=0:此時空閑態時,SCLK處於低電平,數據采樣是在第1個邊沿,也就是SCLK由低電平到高電平的跳變,所以數據采樣(讀取)是在上升沿,數據發送是在下降沿。
  • Mode1:CPOL=0,CPHA=1:此時空閑態時,SCLK處於低電平,數據發送是在第1個邊沿,也就是SCLK由低電平到高電平的跳變,所以數據采樣(讀取)是在下降沿,數據發送是在上升沿。
  • Mode2:CPOL=1,CPHA=0 :此時空閑態時,SCLK處於高電平,數據采集是在第1個邊沿,也就是SCLK由高電平到低電平的跳變,所以數據采集(讀取)是在下降沿,數據發送是在上升沿。
  • Mode3:CPOL=1,CPHA=1:此時空閑態時,SCLK處於高電平,數據發送是在第1個邊沿,也就是 SCLK由高電平到低電平的跳變,所以數據采集(讀取)是在上升沿,數據發送是在下降沿。

不同的從設備的SPI模式一般是不能改變的;而為了達到通信的目的,雙方的SPI模式必須匹配;因此,有時候需要修改主機的通信模式。

SPI 通信過程

SPI以主從方式工作:主機主動發起通信,按MSB或LSB的順序一位一位傳輸數據;從機被動接收、處理主機發送的數據。

不光是數據,甚至,時鍾、片選使能信號也是主機提供的。

SPI能夠實現發送時按位接收從設備的數據。

下面以CPHA=0為例講解SPI時序。

發起通信

主設備拉起片選NSS(N代表低電平有效),選中對應的從設備。

同時,主設備開始驅動CLK時鍾產生信號。

假設下面的8位寄存器裝的是待發送的數據1010 1010(0XAA),上升沿發送、下降沿接收、高位先發送(MSB)。

發送后,從機對應的寄存器的buff存放了0101 0101(0X55)。

那么第一個上升沿來的時候 數據將會是SDO=1;寄存器=0101010x(X代表不確定,因為沒有從從設備讀回數據)。下降沿到來的時候,將SDI上的電平保存為二進制值,那么這時寄存器=0101 010 BIT[SDI] ;SCLK時鍾再接下來的7個脈沖以后,主從中的兩個寄存器的內容便互相交換一次。這樣就完成里一個SPI時序。

舉例:

假設主機和從機初始化就緒:並且主機的sbuff=0xaa(1010 1010),從機的sbuff=0x55(0101 0101),下面將分步對spi的8個時鍾周期的數據情況演示一遍:假設上升沿發送數據

加粗的地方代表需要重點留意;高量的地方代表已經儲存的值。

SCLK脈沖 主機buff 從機buff MISO(sdi) MOSI(sdo)
低電平 1010 1010 0101 0101 X X
第1個↗ 0101 010X 1010101X X 1
第1個↘ 0101 010 0 10101011 0 X
第2個↗ 1010 100X 0101 011X X 0
第2個↘ 1010 1001 0101 0110 1 X
第3個↗ 0101 001X 1010 110X X 1
第3個↘ 0101 0010 1010 1101 0 X
第4個↗ 1010 010X 0101 101X X 0
第4個↘ 1010 0101 0101 1010 1 X
第5個↗ 010 0101X 1011 010X X 1
第5個↘ 0100 1010 1011 0101 0 X
第6個↗ 1001 010X 0110 101X X 0
第6個↘ 1001 0101 0110 1010 1 X
第7個↗ 0010 101X 110 1010X X 1
第7個↘ 0010 1010 1101 0101 0 X
第8個↗ 010 1010X 1010 101X X 0
第8個↘ 0101 0101 1010 101X 1 X

這樣就完成了兩個寄存器8位的交換,上面的上表示上升沿、下表示下降沿,sdi、sdo相對於主機而言的。其中ss引腳作為主機的時候,從機可以把它拉底被動選為從機,作為從機的是時候,可以作為片選腳用。

根據以上分析,一個完整的傳送周期是16位,即兩個字節:因為,首先主機要發送命令過去,然后從機根據主機的命令准備數據,主機在下一個8位時鍾周期才把數據讀回來。

附錄:SPI模式有關理解框圖

img

附錄:SPI 內部機制

img

SSPSR: SPI 設備內部的移位寄存器(Shift Register). 它的主要作用是根據 SPI時鍾信號狀態, 往 SSPBUF 里移入或者移出數據, 每次移動的數據大小由 Bus-Width 以及 Channel-Width 所決定。

ref :


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM