前言
前面的文章詳細(xì)介紹了Autosar架構(gòu)圖下的SPI模塊,但是沒有介紹SPI通信總線,本文轉(zhuǎn)載一篇個人認(rèn)為寫的比較好的SPI通信協(xié)議介紹的文章,供大家參考。
參考文章:
AUTOSAR-MCAL--SPI模塊詳解(一)
AUTOSAR-MCAL--SPI模塊詳解(二)
AUTOSAR-MCAL--SPI模塊詳解(三)
注:本文轉(zhuǎn)載自CSDN,由硬件十萬個為什么公眾號整理。
正文
1、 SPI簡介
SPI,是英語Serial Peripheral interface的縮寫,顧名思義就是串行外圍設(shè)備接口。是Motorola首先在其MC68HCXX系列處理器上定義的。SPI接口主要應(yīng)用在 EEPROM,F(xiàn)LASH,實(shí)時(shí)時(shí)鐘,AD轉(zhuǎn)換器,還有數(shù)字信號處理器和數(shù)字信號解碼器之間。SPI,是一種高速的,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,節(jié)約了芯片的管腳,同時(shí)為PCB的布局上節(jié)省空間,提供方便,正是出于這種簡單易用的特性,現(xiàn)在越來越多的芯片集成了這種通信協(xié)議。
2、 SPI特點(diǎn)
2.1采用主-從模式(Master-Slave) 的控制方式
SPI 規(guī)定了兩個 SPI 設(shè)備之間通信必須由主設(shè)備 (Master) 來控制次設(shè)備 (Slave). 一個 Master 設(shè)備可以通過提供 Clock 以及對 Slave 設(shè)備進(jìn)行片選 (Slave Select) 來控制多個 Slave 設(shè)備, SPI 協(xié)議還規(guī)定 Slave 設(shè)備的 Clock 由 Master 設(shè)備通過 SCK 管腳提供給 Slave 設(shè)備, Slave 設(shè)備本身不能產(chǎn)生或控制 Clock, 沒有 Clock 則 Slave 設(shè)備不能正常工作。
2.2采用同步方式(Synchronous)傳輸數(shù)據(jù)
Master 設(shè)備會根據(jù)將要交換的數(shù)據(jù)來產(chǎn)生相應(yīng)的時(shí)鐘脈沖(Clock Pulse), 時(shí)鐘脈沖組成了時(shí)鐘信號(Clock Signal) , 時(shí)鐘信號通過時(shí)鐘極性 (CPOL) 和 時(shí)鐘相位 (CPHA) 控制著兩個 SPI 設(shè)備間何時(shí)數(shù)據(jù)交換以及何時(shí)對接收到的數(shù)據(jù)進(jìn)行采樣, 來保證數(shù)據(jù)在兩個設(shè)備之間是同步傳輸?shù)摹?/p>
2.3數(shù)據(jù)交換(Data Exchanges)
SPI 設(shè)備間的數(shù)據(jù)傳輸之所以又被稱為數(shù)據(jù)交換, 是因?yàn)?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ù)被交換了. 一個 Slave 設(shè)備要想能夠接收到 Master 發(fā)過來的控制信號, 必須在此之前能夠被 Master 設(shè)備進(jìn)行訪問 (Access). 所以, Master 設(shè)備必須首先通過 SS/CS pin 對 Slave 設(shè)備進(jìn)行片選, 把想要訪問的 Slave 設(shè)備選上. 在數(shù)據(jù)傳輸?shù)倪^程中, 每次接收到的數(shù)據(jù)必須在下一次數(shù)據(jù)傳輸之前被采樣. 如果之前接收到的數(shù)據(jù)沒有被讀取, 那么這些已經(jīng)接收完成的數(shù)據(jù)將有可能會被丟棄, 導(dǎo)致 SPI 物理模塊最終失效. 因此, 在程序中一般都會在 SPI 傳輸完數(shù)據(jù)后, 去讀取 SPI 設(shè)備里的數(shù)據(jù), 即使這些數(shù)據(jù)(Dummy Data)在我們的程序里是無用的。
2.4 SPI有四種傳輸模式
上升沿、下降沿、前沿、后沿觸發(fā)。當(dāng)然也有MSB和LSB傳輸方式。
2.5 SPI只有主模式和從模式之分。
沒有讀和寫的說法,因?yàn)閷?shí)質(zhì)上每次SPI是主從設(shè)備在交換數(shù)據(jù)。也就是說,你發(fā)一個數(shù)據(jù)必然會收到一個數(shù)據(jù);你要收一個數(shù)據(jù)必須也要先發(fā)一個數(shù)據(jù)。
3、 工作機(jī)制
3.1概述
上圖只是對 SPI 設(shè)備間通信的一個簡單的描述, 下面就來解釋一下圖中所示的幾個組件(Module):
SSPBUF,Synchronous Serial Port Buffer, 泛指 SPI 設(shè)備里面的內(nèi)部緩沖區(qū), 一般在物理上是以 FIFO 的形式, 保存?zhèn)鬏斶^程中的臨時(shí)數(shù)據(jù);
SSPSR, Synchronous Serial Port Register, 泛指 SPI 設(shè)備里面的移位寄存器(Shift Regitser), 它的作用是根據(jù)設(shè)置好的數(shù)據(jù)位寬(bit-width) 把數(shù)據(jù)移入或者移出 SSPBUF;
Controller, 泛指 SPI 設(shè)備里面的控制寄存器, 可以通過配置它們來設(shè)置 SPI 總線的傳輸模式。
通常情況下, 我們只需要對上圖所描述的四個管腳(pin) 進(jìn)行編程即可控制整個 SPI 設(shè)備之間的數(shù)據(jù)通信:
SCK, Serial Clock, 主要的作用是 Master 設(shè)備往 Slave 設(shè)備傳輸時(shí)鐘信號, 控制數(shù)據(jù)交換的時(shí)機(jī)以及速率;
SS/CS, Slave Select/Chip Select, 用于 Master 設(shè)備片選 Slave 設(shè)備, 使被選中的 Slave 設(shè)備能夠被 Master 設(shè)備所訪問;
SDO/MOSI, Serial Data Output/Master Out Slave In, 在 Master 上面也被稱為 Tx-Channel, 作為數(shù)據(jù)的出口, 主要用于 SPI 設(shè)備發(fā)送數(shù)據(jù);
SDI/MISO, Serial Data Input/Master In Slave Out, 在 Master 上面也被稱為 Rx-Channel, 作為數(shù)據(jù)的入口, 主要用于SPI 設(shè)備接收數(shù)據(jù);
SPI 設(shè)備在進(jìn)行通信的過程中, Master 設(shè)備和 Slave 設(shè)備之間會產(chǎn)生一個數(shù)據(jù)鏈路回環(huán)(Data Loop), 就像上圖所畫的那樣, 通過 SDO 和 SDI 管腳, SSPSR 控制數(shù)據(jù)移入移出 SSPBUF, Controller 確定 SPI 總線的通信模式, SCK 傳輸時(shí)鐘信號。
3.2 Timing
上圖通過 Master 設(shè)備與 Slave 設(shè)備之間交換1 Byte 數(shù)據(jù)來說明 SPI 協(xié)議的工作機(jī)制。
首先, 在這里解釋一下相位和極性的概念
3.2.1 SPI相關(guān)的縮寫或說法
SPI的極性Polarity和相位Phase,最常見的寫法是CPOL和CPHA,不過也有一些其他寫法,簡單總結(jié)如下:
(1) CKPOL (Clock Polarity) = CPOL = POL = Polarity = (時(shí)鐘)極性
(2) CKPHA (Clock Phase) = CPHA = PHA = Phase = (時(shí)鐘)相位
(3) SCK=SCLK=SPI的時(shí)鐘
(4) Edge=邊沿,即時(shí)鐘電平變化的時(shí)刻,即上升沿(rising edge)或者下降沿(falling edge)
對于一個時(shí)鐘周期內(nèi),有兩個edge,分別稱為:
Leading edge=前一個邊沿=第一個邊沿,對于開始電壓是1,那么就是1變成0的時(shí)候,對于開始電壓是0,那么就是0變成1的時(shí)候;
Trailing edge=后一個邊沿=第二個邊沿,對于開始電壓是1,那么就是0變成1的時(shí)候(即在第一次1變成0之后,才可能有后面的0變成1),對于開始電壓是0,那么就是1變成0的時(shí)候;
3.2.2 SPI的相位和極性
CPOL和CPHA,分別都可以是0或時(shí)1,對應(yīng)的四種組合就是:
Mode 0 CPOL=0, CPHA=0
Mode 1 CPOL=0, CPHA=1
Mode 2 CPOL=1, CPHA=0
Mode 3 CPOL=1, CPHA=1
3.2.3 CPOL極性
先說什么是SCLK時(shí)鐘的空閑時(shí)刻,其就是當(dāng)SCLK在數(shù)發(fā)送8個bit比特?cái)?shù)據(jù)之前和之后的狀態(tài),于此對應(yīng)的,SCLK在發(fā)送數(shù)據(jù)的時(shí)候,就是正常的工作的時(shí)候,有效active的時(shí)刻了。
先說英文,其精簡解釋為:Clock Polarity = IDLE state of SCK。
再用中文詳解:
SPI的CPOL,表示當(dāng)SCLK空閑idle的時(shí)候,其電平的值是低電平0還是高電平1:
CPOL=0,時(shí)鐘空閑idle時(shí)候的電平是低電平,所以當(dāng)SCLK有效的時(shí)候,就是高電平,就是所謂的active-high;
CPOL=1,時(shí)鐘空閑idle時(shí)候的電平是高電平,所以當(dāng)SCLK有效的時(shí)候,就是低電平,就是所謂的active-low;
3.2.4 CPHA相位
首先說明一點(diǎn),capture strobe = latch = read = sample,都是表示數(shù)據(jù)采樣,數(shù)據(jù)有效的時(shí)刻。相位,對應(yīng)著數(shù)據(jù)采樣是在第幾個邊沿(edge),是第一個邊沿還是第二個邊沿,0對應(yīng)著第一個邊沿,1對應(yīng)著第二個邊沿。
對于:
CPHA=0,表示第一個邊沿:
對于CPOL=0,idle時(shí)候的是低電平,第一個邊沿就是從低變到高,所以是上升沿;
對于CPOL=1,idle時(shí)候的是高電平,第一個邊沿就是從高變到低,所以是下降沿;
CPHA=1,表示第二個邊沿:
對于CPOL=0,idle時(shí)候的是低電平,第二個邊沿就是從高變到低,所以是下降沿;
對于CPOL=1,idle時(shí)候的是高電平,第一個邊沿就是從低變到高,所以是上升沿;
還是上圖大家更容易看懂
3.2.5 軟件中如何設(shè)置SPI的極性和相位
SPI分主設(shè)備和從設(shè)備,兩者通過SPI協(xié)議通訊。
而設(shè)置SPI的模式,是從設(shè)備的模式,決定了主設(shè)備的模式。
所以要先去搞懂從設(shè)備的SPI是何種模式,然后再將主設(shè)備的SPI的模式,設(shè)置和從設(shè)備相同的模式,即可正常通訊。
對于從設(shè)備的SPI是什么模式,有兩種:
3.2.5.1固定的,有SPI從設(shè)備硬件決定的
SPI從設(shè)備,具體是什么模式,相關(guān)的datasheet中會有描述,需要自己去datasheet中找到相關(guān)的描述,即:
關(guān)于SPI從設(shè)備,在空閑的時(shí)候,是高電平還是低電平,即決定了CPOL是0還是1;
然后再找到關(guān)于設(shè)備是在上升沿還是下降沿去采樣數(shù)據(jù),這樣就是,在定了CPOL的值的前提下,對應(yīng)著可以推算出CPHA是0還是1了。
3.2.5.2 可配置的,由軟件自己設(shè)定
從設(shè)備也是一個SPI控制器,4種模式都支持,此時(shí)只要自己設(shè)置為某種模式即可。
然后知道了從設(shè)備的模式后,再去將SPI主設(shè)備的模式,設(shè)置為和從設(shè)備模式一樣,即可。
對于如何配置SPI的CPOL和CPHA的話,不多細(xì)說,多數(shù)都是直接去寫對應(yīng)的SPI控制器中對應(yīng)寄存器中的CPOL和CPHA那兩位,寫0或?qū)?即可。
3.3 SSPSR
SSPSR 是 SPI 設(shè)備內(nèi)部的移位寄存器(Shift Register). 它的主要作用是根據(jù) SPI 時(shí)鐘信號狀態(tài), 往 SSPBUF 里移入或者移出數(shù)據(jù), 每次移動的數(shù)據(jù)大小由 Bus-Width 以及 Channel-Width 所決定。
Bus-Width 的作用是指定地址總線到 Master 設(shè)備之間數(shù)據(jù)傳輸?shù)膯挝弧?/p>
例如, 我們想要往 Master 設(shè)備里面的 SSPBUF 寫入 16 Byte 大小的數(shù)據(jù): 首先, 給 Master 設(shè)備的配置寄存器設(shè)置 Bus-Width 為 Byte; 然后往 Master 設(shè)備的 Tx-Data 移位寄存器在地址總線的入口寫入數(shù)據(jù), 每次寫入 1 Byte 大小的數(shù)據(jù)(使用 writeb 函數(shù)); 寫完 1 Byte 數(shù)據(jù)之后, Master 設(shè)備里面的 Tx-Data 移位寄存器會自動把從地址總線傳來的1 Byte 數(shù)據(jù)移入 SSPBUF 里; 上述動作一共需要重復(fù)執(zhí)行 16 次.
Channel-Width 的作用是指定 Master 設(shè)備與 Slave 設(shè)備之間數(shù)據(jù)傳輸?shù)膯挝? 與 Bus-Width 相似, Master 設(shè)備內(nèi)部的移位寄存器會依據(jù) Channel-Width 自動地把數(shù)據(jù)從 Master-SSPBUF 里通過 Master-SDO 管腳搬運(yùn)到 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ù)這樣的情況。
3.4 SSPBUF
我們知道, 在每個時(shí)鐘周期內(nèi), Master 與 Slave 之間交換的數(shù)據(jù)其實(shí)都是 SPI 內(nèi)部移位寄存器從 SSPBUF 里面拷貝的. 我們可以通過往 SSPBUF 對應(yīng)的寄存器 (Tx-Data / Rx-Data register) 里讀寫數(shù)據(jù), 間接地操控 SPI 設(shè)備內(nèi)部的 SSPBUF.
例如, 在發(fā)送數(shù)據(jù)之前, 我們應(yīng)該先往 Master 的 Tx-Data 寄存器寫入將要發(fā)送出去的數(shù)據(jù), 這些數(shù)據(jù)會被 Master-SSPSR 移位寄存器根據(jù) Bus-Width 自動移入 Master-SSPBUF 里, 然后這些數(shù)據(jù)又會被 Master-SSPSR 根據(jù) Channel-Width 從 Master-SSPBUF 中移出, 通過 Master-SDO 管腳傳給 Slave-SDI 管腳, Slave-SSPSR 則把從 Slave-SDI 接收到的數(shù)據(jù)移入 Slave-SSPBUF 里. 與此同時(shí), Slave-SSPBUF 里面的數(shù)據(jù)根據(jù)每次接收數(shù)據(jù)的大小(Channel-Width), 通過 Slave-SDO 發(fā)往 Master-SDI, Master-SSPSR 再把從 Master-SDI 接收的數(shù)據(jù)移入 Master-SSPBUF.在單次數(shù)據(jù)傳輸完成之后, 用戶程序可以通過從 Master 設(shè)備的 Rx-Data 寄存器讀取 Master 設(shè)備數(shù)據(jù)交換得到的數(shù)據(jù)。
3.5 Controller
Master 設(shè)備里面的 Controller 主要通過時(shí)鐘信號(Clock Signal)以及片選信號(Slave Select Signal)來控制 Slave 設(shè)備. Slave 設(shè)備會一直等待, 直到接收到 Master 設(shè)備發(fā)過來的片選信號, 然后根據(jù)時(shí)鐘信號來工作。
Master 設(shè)備的片選操作必須由程序所實(shí)現(xiàn). 例如: 由程序把 SS/CS 管腳的時(shí)鐘信號拉低電平, 完成 SPI 設(shè)備數(shù)據(jù)通信的前期工作; 當(dāng)程序想讓 SPI 設(shè)備結(jié)束數(shù)據(jù)通信時(shí), 再把 SS/CS 管腳上的時(shí)鐘信號拉高電平。
4. SPI舉例
上面說了那么多,在這里我來舉一個例子幫助大家理解。
SPI是一個環(huán)形總線結(jié)構(gòu),由ss(cs)、sck、sdi、sdo構(gòu)成,其時(shí)序其實(shí)很簡單,主要是在sck的控制下,兩個雙向移位寄存器進(jìn)行數(shù)據(jù)交換。
假設(shè)下面的8位寄存器裝的是待發(fā)送的數(shù)據(jù)10101010,上升沿發(fā)送、下降沿接收、高位先發(fā)送。
那么第一個上升沿來的時(shí)候 數(shù)據(jù)將會是sdo=1;寄存器=0101010x。下降沿到來的時(shí)候,sdi上的電平將所存到寄存器中去,那么這時(shí)寄存器=0101010sdi,這樣在 8個時(shí)鐘脈沖以后,兩個寄存器的內(nèi)容互相交換一次。這樣就完成里一個spi時(shí)序。
舉例:
假設(shè)主機(jī)和從機(jī)初始化就緒:并且主機(jī)的sbuff=0xaa,從機(jī)的sbuff=0x55,下面將分步對spi的8個時(shí)鐘周期的數(shù)據(jù)情況演示一遍:假設(shè)上升沿發(fā)送數(shù)據(jù)。
這樣就完成了兩個寄存器8位的交換,上面的上表示上升沿、下表示下降沿,sdi、sdo相對于主機(jī)而言的。已經(jīng)很接近理解了,下一步就是把 上面的過程轉(zhuǎn)為動畫。
-
脈沖
+關(guān)注
關(guān)注
20文章
882瀏覽量
95475 -
SPI
+關(guān)注
關(guān)注
17文章
1688瀏覽量
91215 -
傳輸數(shù)據(jù)
+關(guān)注
關(guān)注
1文章
110瀏覽量
16081
原文標(biāo)題:SPI詳解
文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論