將微控制器連接到傳感器,顯示器或其他模塊時(shí),您是否考慮過(guò)兩個(gè)設(shè)備之間如何通信?他們到底在說(shuō)什么?他們?nèi)绾文軌蛳嗷ダ斫?
電子設(shè)備之間的通信就像人類之間的通信,雙方都需要說(shuō)同一種語(yǔ)言。在電子學(xué)中,這些語(yǔ)言稱為通信協(xié)議。
我們先了解三種最常見協(xié)議的基礎(chǔ)知識(shí):串行外設(shè)接口(SPI),內(nèi)部集成電路(I2C)和通用異步接收器/發(fā)送器(UART)驅(qū)動(dòng)通信。
SPI,I2C和UART比USB,以太網(wǎng),藍(lán)牙和WiFi等協(xié)議慢得多,但它們更簡(jiǎn)單,使用的硬件和系統(tǒng)資源也更少。SPI,I2C和UART非常適用于微控制器之間以及微控制器和傳感器之間的通信,在這些傳感器中不需要傳輸大量高速數(shù)據(jù)。
串行與并行通信
電子設(shè)備通過(guò)物理連接在設(shè)備之間的導(dǎo)線發(fā)送數(shù)據(jù)位來(lái)相互通信,有點(diǎn)像一個(gè)字母中的字母,除了26個(gè)字母(英文字母表中),一個(gè)位是二進(jìn)制的,只能是1或0。通過(guò)電壓的快速變化,位從一個(gè)設(shè)備傳輸?shù)搅硪粋€(gè)設(shè)備。在工作電壓為5V的系統(tǒng)中,0位作為0V的短脈沖通信,1位通過(guò)5V的短脈沖通信。 數(shù)據(jù)位可以并行或串行形式傳輸。在并行通信中,數(shù)據(jù)位是同時(shí)發(fā)送的,每個(gè)都通過(guò)單獨(dú)的線路。下圖顯示了二進(jìn)制(01000011)中字母“C”的并行傳輸:
在串行通信中,通過(guò)單線逐個(gè)發(fā)送這些位。下圖顯示了二進(jìn)制(01000011)中字母“C”的串行傳輸:
SPI簡(jiǎn)介
SPI,是英語(yǔ)Serial Peripheral interface的縮寫,顧名思義就是串行外圍設(shè)備接口。是Motorola首先在其MC68HCXX系列處理器上定義的。SPI接口主要應(yīng)用在 EEPROM,F(xiàn)LASH,實(shí)時(shí)時(shí)鐘,AD轉(zhuǎn)換器,還有數(shù)字信號(hào)處理器和數(shù)字信號(hào)解碼器之間。SPI,是一種高速的,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,節(jié)約了芯片的管腳,同時(shí)為PCB的布局上節(jié)省空間,提供方便,正是出于這種簡(jiǎn)單易用的特性,現(xiàn)在越來(lái)越多的芯片集成了這種通信協(xié)議。
1、SPI特點(diǎn)
(1)采用主-從模式(Master-Slave) 的控制方式
SPI 規(guī)定了兩個(gè) SPI 設(shè)備之間通信必須由主設(shè)備 (Master) 來(lái)控制次設(shè)備 (Slave). 一個(gè) Master 設(shè)備可以通過(guò)提供 Clock 以及對(duì) Slave 設(shè)備進(jìn)行片選 (Slave Select) 來(lái)控制多個(gè) Slave 設(shè)備, SPI 協(xié)議還規(guī)定 Slave 設(shè)備的 Clock 由 Master 設(shè)備通過(guò) SCK 管腳提供給 Slave 設(shè)備, Slave 設(shè)備本身不能產(chǎn)生或控制 Clock, 沒有 Clock 則 Slave 設(shè)備不能正常工作
(2)采用同步方式(Synchronous)傳輸數(shù)據(jù)
Master 設(shè)備會(huì)根據(jù)將要交換的數(shù)據(jù)來(lái)產(chǎn)生相應(yīng)的時(shí)鐘脈沖(Clock Pulse), 時(shí)鐘脈沖組成了時(shí)鐘信號(hào)(Clock Signal) , 時(shí)鐘信號(hào)通過(guò)時(shí)鐘極性 (CPOL) 和 時(shí)鐘相位 (CPHA) 控制著兩個(gè) SPI 設(shè)備間何時(shí)數(shù)據(jù)交換以及何時(shí)對(duì)接收到的數(shù)據(jù)進(jìn)行采樣, 來(lái)保證數(shù)據(jù)在兩個(gè)設(shè)備之間是同步傳輸?shù)?
(3)數(shù)據(jù)交換(Data Exchanges)
SPI 設(shè)備間的數(shù)據(jù)傳輸之所以又被稱為數(shù)據(jù)交換, 是因?yàn)?SPI 協(xié)議規(guī)定一個(gè) SPI 設(shè)備不能在數(shù)據(jù)通信過(guò)程中僅僅只充當(dāng)一個(gè) "發(fā)送者(Transmitter)" 或者 "接收者(Receiver)". 在每個(gè) Clock 周期內(nèi), SPI 設(shè)備都會(huì)發(fā)送并接收一個(gè) bit 大小的數(shù)據(jù), 相當(dāng)于該設(shè)備有一個(gè) bit 大小的數(shù)據(jù)被交換了. 一個(gè) Slave 設(shè)備要想能夠接收到 Master 發(fā)過(guò)來(lái)的控制信號(hào), 必須在此之前能夠被 Master 設(shè)備進(jìn)行訪問(wèn) (Access). 所以, Master 設(shè)備必須首先通過(guò) SS/CS pin 對(duì) Slave 設(shè)備進(jìn)行片選, 把想要訪問(wèn)的 Slave 設(shè)備選上. 在數(shù)據(jù)傳輸?shù)倪^(guò)程中, 每次接收到的數(shù)據(jù)必須在下一次數(shù)據(jù)傳輸之前被采樣. 如果之前接收到的數(shù)據(jù)沒有被讀取, 那么這些已經(jīng)接收完成的數(shù)據(jù)將有可能會(huì)被丟棄, 導(dǎo)致 SPI 物理模塊最終失效. 因此, 在程序中一般都會(huì)在 SPI 傳輸完數(shù)據(jù)后, 去讀取 SPI 設(shè)備里的數(shù)據(jù), 即使這些數(shù)據(jù)(Dummy Data)在我們的程序里是無(wú)用的。
(4)SPI有四種傳輸模式
上升沿、下降沿、前沿、后沿觸發(fā)。當(dāng)然也有MSB和LSB傳輸方式.
(5)SPI只有主模式和從模式之分。
沒有讀和寫的說(shuō)法,因?yàn)閷?shí)質(zhì)上每次SPI是主從設(shè)備在交換數(shù)據(jù)。也就是說(shuō),你發(fā)一個(gè)數(shù)據(jù)必然會(huì)收到一個(gè)數(shù)據(jù);你要收一個(gè)數(shù)據(jù)必須也要先發(fā)一個(gè)數(shù)據(jù)。
2、 工作機(jī)制
(1)概述
上圖只是對(duì) SPI 設(shè)備間通信的一個(gè)簡(jiǎn)單的描述, 下面就來(lái)解釋一下圖中所示的幾個(gè)組件(Module):
SSPBUF,Synchronous Serial Port Buffer, 泛指 SPI 設(shè)備里面的內(nèi)部緩沖區(qū), 一般在物理上是以 FIFO 的形式, 保存?zhèn)鬏斶^(guò)程中的臨時(shí)數(shù)據(jù);
SSPSR, Synchronous Serial Port Register, 泛指 SPI 設(shè)備里面的移位寄存器(Shift Regitser), 它的作用是根據(jù)設(shè)置好的數(shù)據(jù)位寬(bit-width) 把數(shù)據(jù)移入或者移出 SSPBUF;
Controller, 泛指 SPI 設(shè)備里面的控制寄存器, 可以通過(guò)配置它們來(lái)設(shè)置 SPI 總線的傳輸模式。
通常情況下, 我們只需要對(duì)上圖所描述的四個(gè)管腳(pin) 進(jìn)行編程即可控制整個(gè) SPI 設(shè)備之間的數(shù)據(jù)通信:
SCK, Serial Clock, 主要的作用是 Master 設(shè)備往 Slave 設(shè)備傳輸時(shí)鐘信號(hào), 控制數(shù)據(jù)交換的時(shí)機(jī)以及速率;
SS/CS, Slave Select/Chip Select, 用于 Master 設(shè)備片選 Slave 設(shè)備, 使被選中的 Slave 設(shè)備能夠被 Master 設(shè)備所訪問(wèn);
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)行通信的過(guò)程中, Master 設(shè)備和 Slave 設(shè)備之間會(huì)產(chǎn)生一個(gè)數(shù)據(jù)鏈路回環(huán)(Data Loop), 就像上圖所畫的那樣, 通過(guò) SDO 和 SDI 管腳, SSPSR 控制數(shù)據(jù)移入移出 SSPBUF, Controller 確定 SPI 總線的通信模式, SCK 傳輸時(shí)鐘信號(hào)。
(2) Timing
上圖通過(guò) Master 設(shè)備與 Slave 設(shè)備之間交換1 Byte 數(shù)據(jù)來(lái)說(shuō)明 SPI 協(xié)議的工作機(jī)制.
首先, 在這里解釋一下相位和極性的概念
a, SPI相關(guān)的縮寫或說(shuō)法
SPI的極性Polarity和相位Phase,最常見的寫法是CPOL和CPHA,不過(guò)也有一些其他寫法,簡(jiǎn)單總結(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)
對(duì)于一個(gè)時(shí)鐘周期內(nèi),有兩個(gè)edge,分別稱為:
Leading edge=前一個(gè)邊沿=第一個(gè)邊沿,對(duì)于開始電壓是1,那么就是1變成0的時(shí)候,對(duì)于開始電壓是0,那么就是0變成1的時(shí)候;
Trailing edge=后一個(gè)邊沿=第二個(gè)邊沿,對(duì)于開始電壓是1,那么就是0變成1的時(shí)候(即在第一次1變成0之后,才可能有后面的0變成1),對(duì)于開始電壓是0,那么就是1變成0的時(shí)候;
b,SPI的相位和極性
CPOL和CPHA,分別都可以是0或時(shí)1,對(duì)應(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
c,CPOL極性
先說(shuō)什么是SCLK時(shí)鐘的空閑時(shí)刻,其就是當(dāng)SCLK在數(shù)發(fā)送8個(gè)bit比特?cái)?shù)據(jù)之前和之后的狀態(tài),于此對(duì)應(yīng)的,SCLK在發(fā)送數(shù)據(jù)的時(shí)候,就是正常的工作的時(shí)候,有效active的時(shí)刻了。
先說(shuō)英文,其精簡(jiǎn)解釋為: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;
d,CPHA相位
首先說(shuō)明一點(diǎn),capture strobe = latch = read = sample,都是表示數(shù)據(jù)采樣,數(shù)據(jù)有效的時(shí)刻。相位,對(duì)應(yīng)著數(shù)據(jù)采樣是在第幾個(gè)邊沿(edge),是第一個(gè)邊沿還是第二個(gè)邊沿,0對(duì)應(yīng)著第一個(gè)邊沿,1對(duì)應(yīng)著第二個(gè)邊沿。
對(duì)于:
CPHA=0,表示第一個(gè)邊沿:
對(duì)于CPOL=0,idle時(shí)候的是低電平,第一個(gè)邊沿就是從低變到高,所以是上升沿;
對(duì)于CPOL=1,idle時(shí)候的是高電平,第一個(gè)邊沿就是從高變到低,所以是下降沿;
CPHA=1,表示第二個(gè)邊沿:
對(duì)于CPOL=0,idle時(shí)候的是低電平,第二個(gè)邊沿就是從高變到低,所以是下降沿;
對(duì)于CPOL=1,idle時(shí)候的是高電平,第一個(gè)邊沿就是從低變到高,所以是上升沿;
還是上圖大家更容易看懂
e,軟件中如何設(shè)置SPI的極性和相位
SPI分主設(shè)備和從設(shè)備,兩者通過(guò)SPI協(xié)議通訊。
而設(shè)置SPI的模式,是從設(shè)備的模式,決定了主設(shè)備的模式。
所以要先去搞懂從設(shè)備的SPI是何種模式,然后再將主設(shè)備的SPI的模式,設(shè)置和從設(shè)備相同的模式,即可正常通訊。
對(duì)于從設(shè)備的SPI是什么模式,有兩種:
固定的,有SPI從設(shè)備硬件決定的
SPI從設(shè)備,具體是什么模式,相關(guān)的datasheet中會(huì)有描述,需要自己去datasheet中找到相關(guān)的描述,即:
關(guān)于SPI從設(shè)備,在空閑的時(shí)候,是高電平還是低電平,即決定了CPOL是0還是1;
然后再找到關(guān)于設(shè)備是在上升沿還是下降沿去采樣數(shù)據(jù),這樣就是,在定了CPOL的值的前提下,對(duì)應(yīng)著可以推算出CPHA是0還是1了。
可配置的,由軟件自己設(shè)定
從設(shè)備也是一個(gè)SPI控制器,4種模式都支持,此時(shí)只要自己設(shè)置為某種模式即可。
然后知道了從設(shè)備的模式后,再去將SPI主設(shè)備的模式,設(shè)置為和從設(shè)備模式一樣,即可。
對(duì)于如何配置SPI的CPOL和CPHA的話,不多細(xì)說(shuō),多數(shù)都是直接去寫對(duì)應(yīng)的SPI控制器中對(duì)應(yīng)寄存器中的CPOL和CPHA那兩位,寫0或?qū)?即可。
(3)SSPSR
SSPSR 是 SPI 設(shè)備內(nèi)部的移位寄存器(Shift Register). 它的主要作用是根據(jù) SPI 時(shí)鐘信號(hào)狀態(tài), 往 SSPBUF 里移入或者移出數(shù)據(jù), 每次移動(dòng)的數(shù)據(jù)大小由 Bus-Width 以及 Channel-Width 所決定。
Bus-Width 的作用是指定地址總線到 Master 設(shè)備之間數(shù)據(jù)傳輸?shù)膯挝?
例如, 我們想要往 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 移位寄存器會(huì)自動(dòng)把從地址總線傳來(lái)的1 Byte 數(shù)據(jù)移入 SSPBUF 里; 上述動(dòng)作一共需要重復(fù)執(zhí)行 16 次.
Channel-Width 的作用是指定 Master 設(shè)備與 Slave 設(shè)備之間數(shù)據(jù)傳輸?shù)膯挝? 與 Bus-Width 相似, Master 設(shè)備內(nèi)部的移位寄存器會(huì)依據(jù) Channel-Width 自動(dòng)地把數(shù)據(jù)從 Master-SSPBUF 里通過(guò) Master-SDO 管腳搬運(yùn)到 Slave 設(shè)備里的 Slave-SDI 引腳, Slave-SSPSR 再把每次接收的數(shù)據(jù)移入 Slave-SSPBUF里.通常情況下, Bus-Width 總是會(huì)大于或等于 Channel-Width, 這樣能保證不會(huì)出現(xiàn)因 Master 與 Slave 之間數(shù)據(jù)交換的頻率比地址總線與 Master 之間的數(shù)據(jù)交換頻率要快, 導(dǎo)致 SSPBUF 里面存放的數(shù)據(jù)為無(wú)效數(shù)據(jù)這樣的情況.
(4) SSPBUF
我們知道, 在每個(gè)時(shí)鐘周期內(nèi), Master 與 Slave 之間交換的數(shù)據(jù)其實(shí)都是 SPI 內(nèi)部移位寄存器從 SSPBUF 里面拷貝的. 我們可以通過(guò)往 SSPBUF 對(duì)應(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ù)會(huì)被 Master-SSPSR 移位寄存器根據(jù) Bus-Width 自動(dòng)移入 Master-SSPBUF 里, 然后這些數(shù)據(jù)又會(huì)被 Master-SSPSR 根據(jù) Channel-Width 從 Master-SSPBUF 中移出, 通過(guò) Master-SDO 管腳傳給 Slave-SDI 管腳, Slave-SSPSR 則把從 Slave-SDI 接收到的數(shù)據(jù)移入 Slave-SSPBUF 里. 與此同時(shí), Slave-SSPBUF 里面的數(shù)據(jù)根據(jù)每次接收數(shù)據(jù)的大小(Channel-Width), 通過(guò) Slave-SDO 發(fā)往 Master-SDI, Master-SSPSR 再把從 Master-SDI 接收的數(shù)據(jù)移入 Master-SSPBUF.在單次數(shù)據(jù)傳輸完成之后, 用戶程序可以通過(guò)從 Master 設(shè)備的 Rx-Data 寄存器讀取 Master 設(shè)備數(shù)據(jù)交換得到的數(shù)據(jù).
(5) Controller
Master 設(shè)備里面的 Controller 主要通過(guò)時(shí)鐘信號(hào)(Clock Signal)以及片選信號(hào)(Slave Select Signal)來(lái)控制 Slave 設(shè)備. Slave 設(shè)備會(huì)一直等待, 直到接收到 Master 設(shè)備發(fā)過(guò)來(lái)的片選信號(hào), 然后根據(jù)時(shí)鐘信號(hào)來(lái)工作.
Master 設(shè)備的片選操作必須由程序所實(shí)現(xiàn). 例如: 由程序把 SS/CS 管腳的時(shí)鐘信號(hào)拉低電平, 完成 SPI 設(shè)備數(shù)據(jù)通信的前期工作; 當(dāng)程序想讓 SPI 設(shè)備結(jié)束數(shù)據(jù)通信時(shí), 再把 SS/CS 管腳上的時(shí)鐘信號(hào)拉高電平.
SPI的優(yōu)點(diǎn)和缺點(diǎn)
使用SPI有一些優(yōu)點(diǎn)和缺點(diǎn),如果在不同的通信協(xié)議之間進(jìn)行選擇,您應(yīng)該根據(jù)項(xiàng)目的要求知道何時(shí)使用SPI: 優(yōu)點(diǎn)沒有啟動(dòng)和停止位,因此數(shù)據(jù)可以連續(xù)流式傳輸而不會(huì)中斷沒有復(fù)雜的從機(jī)尋址系統(tǒng),如I2C比I2C更高的數(shù)據(jù)傳輸速率(幾乎快兩倍)單獨(dú)的MISO和MOSI線,因此可以同時(shí)發(fā)送和接收數(shù)據(jù) 缺點(diǎn)使用四根線(I2C和UART使用兩根)無(wú)法確認(rèn)數(shù)據(jù)已成功接收(I2C已執(zhí)行此操作)沒有錯(cuò)誤檢查,如UART中的奇偶校驗(yàn)位僅允許單個(gè)主機(jī)
審核編輯:湯梓紅
-
通信協(xié)議
+關(guān)注
關(guān)注
28文章
857瀏覽量
40256 -
SPI
+關(guān)注
關(guān)注
17文章
1700瀏覽量
91323 -
I2C
+關(guān)注
關(guān)注
28文章
1481瀏覽量
123286 -
uart
+關(guān)注
關(guān)注
22文章
1227瀏覽量
101172
原文標(biāo)題:電子通信的SPI詳解
文章出處:【微信號(hào):WW_CGQJS,微信公眾號(hào):傳感器技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論