28335接两个spi设备_SPI浅析
01? SPI簡介
SPI,全稱為Serial Peripheral interface,即串行外圍設備接口。由摩托羅拉率先在產品上使用。SPI是一種高速全雙工,同步(full duplex synchronous)的通信總線協議,且占用硬件端口只有4個(SO,SI, SCLK 和CSN),所以出于這種簡單易用的特性,越來越多的芯片開始將該總線協議集成在了芯片中。在工作中如果涉及到底層軟件編寫,大概率會經常用到SPI通信。打開英飛凌官網,直接搜索一個工作中比較常用到的芯片TLE75080,對應著相應章節結合實際開發來學習。
02? 協議詳解
? SPI采用主從模式的控制方式
SPI協議規定必須由主設備(Master)控制從設備(Slave),首先通過CS片選信號選中特定的從設備,然后通過SCK引腳給Slave設備提供時鐘。Slave 設備本身不能產生或控制 Clock, 沒有 Clock 則 Slave 設備不能正常工作。理論上,主設備可以控制無限多個從設備,(實際上,從設備掛載的個數也受限于具體的硬件環境)。如圖:
? SPI采用同步傳輸方式進行通信
當通信發生時,主設備會生成相應的時鐘脈沖信號,在每個時鐘的上升沿或者下降沿,時鐘信號會驅動設備內部的移位寄存器,使得主設備的數據從移位寄存器中移出后移入從設備的移位寄存器中,同時從設備也會有數據從SO引腳移出到主設備中。這樣就保證了數據的同步傳輸。一般來說,SPI并沒有讀和寫的說法,本質上,數據的通信其實也是數據交換的過程。
SPI 設備間的數據傳輸之所以又被稱為數據交換, 是因為 SPI 協議規定一個 SPI 設備不僅能在數據通信過程中充當一個 "發送者(Transmitter)" 或者 "接收者(Receiver)". 在每個 Clock 周期內, SPI 設備都會發送并接收一個 bit 大小的數據, 相當于該設備有一個 bit 大小的數據被交換了。
03? 工作原理
??兩個寄存器SSPBUF , SSPSR
SSPBUF:Synchronous Serial Port Buffer, 泛指 SPI 設備里面的內部緩沖區, 一般在物理上是以 FIFO 的形式, 保存傳輸過程中的臨時數據;
SSPSR,:Synchronous Serial Port Register, 泛指 SPI 設備里面的移位寄存器(Shift Regitser), 它的作用是根據設置好的數據位寬(bit-width) 把數據移入或者移出 SSPBUF;
SPI 設備在進行通信的過程中, Master 設備和 Slave 設備之間會產生一個數據鏈路回環(Data Loop), 就像上圖所畫的那樣, 通過 SDO 和 SDI 管腳, SSPSR 控制數據移入移出 SSPBUF, Controller 確定 SPI 總線的通信模式, SCK 傳輸時鐘信號。
? 時序說明
以TLE75080為例,從上圖中可以獲取的信息有:
??16bits SPI
??以MSB模式傳輸數據
??數據在時鐘的下降沿移入TLE75080芯片中,在時鐘下降沿移出
? 時鐘在空閑時為低電平
? 極性和相位
在SPI中有個很重要的參數即極性和相位,比較常見的縮寫為CPOL,CPHA。就是在上一節中TLE75080交換數據的方式,數據在時鐘的下降沿移入TLE75080芯片中,在時鐘下降沿移出。所以極性和相位都是相對于時鐘來說的。
再此需要插一段邊沿(edge)的概念,在每個脈沖里,都有一個上升沿和一個下降沿,對于Leading edge來說就是第一個邊沿,對于開始電壓是1,那么就是1變成0的時候,對于開始電壓是0,那么就是0變成1的時候;Trailing edge是第二個邊沿,對于開始電壓是1,那么就是0變成1的時候(即在第一次1變成0之后,才可能有后面的0變成1),對于開始電壓是0,那么就是1變成0的時候;
所謂極性SPI的CPOL,表示當SCLK空閑idle的時候,其電平的值是低電平0還是高電平1:
CPOL=0,時鐘空閑idle時候的電平是低電平,所以當SCLK有效的時候,就是高電平,就是所謂的active-high;
CPOL=1,時鐘空閑idle時候的電平是高電平,所以當SCLK有效的時候,就是低電平,就是所謂的active-low;
相位CPHA對應于數據采樣是在時鐘的第幾個邊沿,0為第一個邊沿,1為第二個邊沿。(1)?CPHA=0,表示第一個邊沿:? 對于CPOL=0,idle時候的是低電平,第一個邊沿就是從低變到高,所以是上升沿;? 對于CPOL=1,idle時候的是高電平,第一個邊沿就是從高變到低,所以是下降沿;(2)?CPHA=1,表示第二個邊沿:? 對于CPOL=0,idle時候的是低電平,第二個邊沿就是從高變到低,所以是下降沿;? 對于CPOL=1,idle時候的是高電平,第一個邊沿就是從低變到高,所以是上升沿;
那么相位,極性配合起來,就有4中情況,如圖(圖片來自網絡)。
? 再聊SSPSR
SSPSR 是 SPI 設備內部的移位寄存器(Shift Register). 它的主要作用是根據 SPI 時鐘信號狀態, 往 SSPBUF 里移入或者移出數據, 每次移動的數據大小由 Bus-Width 以及 Channel-Width 所決定。
Bus-Width 的作用是指定地址總線到 Master 設備之間數據傳輸的單位.
例如, 我們想要往 TLE75080 設備里面的 SSPBUF 寫入 16 bits 大小的數據: 首先, 將mcu相關寄存器設置 寬度 為 16bits; 然后配置為MSB傳輸模式。
再在相應的寄存器中設置相位和極性。到此,主設備mcu的spi主要屬性已經配置完畢。
然后往 mcu 設備的 Tx-Data 移位寄存器在地址總線的入口寫入數據, 每次寫入 16bits 大小的數據(使用 writeb 函數); 寫完之后, mcu設備里面的 Tx-Data 移位寄存器會自動把從地址總線傳來的16bits數據移入 SSPBUF 里。
Channel-Width 的作用是指定 Master 設備與 Slave 設備之間數據傳輸的單位. 與 Bus-Width 相似, Master 設備內部的移位寄存器會依據 Channel-Width 自動地把數據從 Master-SSPBUF 里通過 Master-SDO 管腳搬運到 Slave 設備里的 Slave-SDI 引腳, Slave-SSPSR 再把每次接收的數據移入 Slave-SSPBUF里.通常情況下, Bus-Width 總是會大于或等于 Channel-Width, 這樣能保證不會出現因 Master 與 Slave 之間數據交換的頻率比地址總線與 Master 之間的數據交換頻率要快, 導致 SSPBUF 里面存放的數據為無效數據這樣的情況。
04? 調試結果
以TLE75080為例,SPI通信是由ss(cs)、sck、sdi、sdo構成,總線上掛載了2片TLE75080,其時序其實很簡單,主要是在sck的控制下,兩個雙向移位寄存器進行數據交換。根據上文手冊中的spi屬性配置如圖:
從上圖可以看出,從設備只有在片選選中的時候,才會對移入移位寄存器的數據進行處理并同時返回給主設備相應數據。這樣就可以實現兩個芯片交替通信。
然后放大后,可以看到數據是在下降沿的時候進行采樣,時鐘會在空閑時置低。極性相位一目了然。
至此SPI的主要原理就暫告一段路了。
編輯:Zhang Jinwei
部分圖片來自網絡
往期文章:
CMake簡介
走進IP
Linux下Socket通信
聊聊汽車診斷刷新那點事
總結
以上是生活随笔為你收集整理的28335接两个spi设备_SPI浅析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql8.0.13驱动包_MySQL
- 下一篇: 玩转oracle 11g(13):命令学