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