SPI通信協(xié)議有哪些應(yīng)用及原理?
SPI,Serial Peripheral Interface,串行外圍設(shè)備接口,是一種同步通信協(xié)議,通常用于芯片間進(jìn)行數(shù)據(jù)交互。SPI總線通常由四根線組成:時(shí)鐘線、數(shù)據(jù)線、主機(jī)選擇線與從機(jī)選擇線。本文將介紹SPI通信協(xié)議的基本原理和使用場景,并附帶示例代碼。
一、基本原理
SPI協(xié)議是一種全雙工協(xié)議,其中最多存在一個(gè)主設(shè)備和多個(gè)從設(shè)備,主設(shè)備通過選擇不同的從設(shè)備、向其發(fā)送數(shù)據(jù)及接收數(shù)據(jù)的方式,與多個(gè)從設(shè)備進(jìn)行通信。SPI是一種同步通信協(xié)議,亦即通過時(shí)鐘信號(hào)的同步作用,實(shí)現(xiàn)數(shù)據(jù)在多個(gè)設(shè)備之間的傳遞。
SPI通信一般由四根線(或者五根線)組成:
1. CLK(Clock):時(shí)鐘信號(hào),規(guī)定數(shù)據(jù)的傳輸時(shí)間。
2. MOSI(Master-Out-Slave-In):主設(shè)備發(fā)出的數(shù)據(jù)。
3. MISO(Master-In-Slave-Out):從設(shè)備發(fā)出的數(shù)據(jù)。
4. SS(Slave Select):從設(shè)備的選擇信號(hào),因?yàn)镾PI可以同時(shí)控制多個(gè)設(shè)備,所以可以使用多個(gè)SS線來實(shí)現(xiàn)多個(gè)從設(shè)備的選擇。
(5. 全雙工模式下,數(shù)據(jù)輸出線為MOSI,數(shù)據(jù)輸入線為MISO,兩個(gè)設(shè)備分別向?qū)Ψ絺鬏敂?shù)據(jù)。)
二、使用場景
SPI是一種非常常見的芯片間通信協(xié)議,它的應(yīng)用場景非常廣泛,如:
1. 內(nèi)部數(shù)據(jù)傳輸
無論是芯片內(nèi)部還是與其他芯片之間的通訊,SPI都能體現(xiàn)出其高效率與高速性。它的主機(jī)能同時(shí)與多個(gè)從機(jī)進(jìn)行數(shù)據(jù)通信,使得芯片之間的數(shù)據(jù)交換更為高效。
2. 存儲(chǔ)器
常見的存儲(chǔ)器芯片,如EEPROM、Flash以及SRAM等均可以使用SPI進(jìn)行數(shù)據(jù)的讀寫。
3. 傳感器
SPI協(xié)議在很多傳感器中也得到廣泛應(yīng)用。比如陀螺儀、加速度計(jì)、壓力傳感器等。
SPI是一種高速、全雙工、同步通信總線,所以可以在同一時(shí)間發(fā)送和接收數(shù)據(jù),SPI沒有定義速度限制,通常能達(dá)到甚至超過10M/bps。
SPI是有主從機(jī)設(shè)備的,主機(jī)只允許有一個(gè),從機(jī)可以有多個(gè)。
SPI通信時(shí)需要用到四根線,單向傳輸時(shí)需要用到三根線,即單工模式。它們是MISO(主設(shè)備數(shù)據(jù)輸入)、MOSI(主設(shè)備數(shù)據(jù)輸出)、SCLK(時(shí)鐘)和CS/SS(片選)
MISO( Master Input Slave Output):主設(shè)備輸入從設(shè)備輸出信號(hào)引腳。
MOSI(Master Output Slave Input):主設(shè)備輸出從設(shè)備輸入信號(hào)引腳。
SCLK(Serial Clock):時(shí)鐘信號(hào),由主設(shè)備產(chǎn)生。
CS/SS(Chip Select/Slave Select):從設(shè)備使能信號(hào),由主設(shè)備控制,一主多從時(shí),CS/SS是從芯片是否被主芯片選中的控制信號(hào),只有片選信號(hào)為預(yù)先規(guī)定的使能信號(hào)時(shí)(高電位或低電位),主芯片對此從芯片的操作才有效。
SPI的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
無起始位和停止位,因此數(shù)據(jù)位可以連續(xù)傳輸而不會(huì)被中斷(根據(jù)通信芯片的選擇可能有所區(qū)別,但SPI通信本身沒有硬性的起始位停止位規(guī)定);
沒有像I2C這樣復(fù)雜的從設(shè)備尋址系統(tǒng);
數(shù)據(jù)傳輸速率比I2C更高(幾乎快兩倍);
分離的MISO和MOSI信號(hào)線,因此可以同時(shí)發(fā)送和接收數(shù)據(jù);
極其靈活的數(shù)據(jù)傳輸,不限于8位,它可以是任意大小的字;
非常簡單的硬件結(jié)構(gòu)。從站不需要唯一地址(與I2C不同)。從機(jī)使用主機(jī)時(shí)鐘,不需要精密時(shí)鐘振蕩器/晶振(與UART不同)。不需要收發(fā)器(與CAN不同)。
缺點(diǎn)
使用四根信號(hào)線(I2C和UART使用兩根信號(hào)線);
無法確認(rèn)是否已成功接收數(shù)據(jù)(I2C應(yīng)答位擁有此功能);
沒有任何形式的錯(cuò)誤檢查,如UART中的奇偶校驗(yàn)位;
只允許一個(gè)主設(shè)備;
沒有硬件從機(jī)應(yīng)答信號(hào)(主機(jī)可能在不知情的情況下無處發(fā)送);
沒有定義硬件級(jí)別的錯(cuò)誤檢查協(xié)議;
與RS-232和CAN總線相比,只能支持非常短的距離;
電子設(shè)備之間的通信就像人類之間的交流,雙方都需要說相同的語言。在電子產(chǎn)品中,這些語言稱為通信協(xié)議。
之前有單獨(dú)地分享了SPI、UART、I2C通信的文章,這篇對它們做一些對比。
串行 VS 并行
電子設(shè)備通過發(fā)送數(shù)據(jù)位從而實(shí)現(xiàn)相互交談。位是二進(jìn)制的,只能是1或0。通過電壓的快速變化,位從一個(gè)設(shè)備傳輸?shù)搅硪粋€(gè)設(shè)備。在以5V工作的系統(tǒng)中,“0”通過0V的短脈沖進(jìn)行通信,而“1”通過5V的短脈沖進(jìn)行通信。
數(shù)據(jù)位可以通過并行或串行的形式進(jìn)行傳輸。另外也可以通過此視頻了解:視頻講解UART、I2C、SPI串口通信。在并行通信中,數(shù)據(jù)位在導(dǎo)線上同時(shí)傳輸。下圖顯示了二進(jìn)制(01000011)中字母“C”的并行傳輸:
在串行通信中,位通過單根線一一發(fā)送。下圖顯示了二進(jìn)制(01000011)中字母“C”的串行傳輸:
SPI通信
SPI是一種常見的設(shè)備通用通信協(xié)議。它有一個(gè)獨(dú)特優(yōu)勢就是可以無中斷傳輸數(shù)據(jù),可以連續(xù)地發(fā)送或接收任意數(shù)量的位。而在I2C和UART中,數(shù)據(jù)以數(shù)據(jù)包的形式發(fā)送,有著限定位數(shù)。
在SPI設(shè)備中,設(shè)備分為主機(jī)與從機(jī)系統(tǒng)。主機(jī)是控制設(shè)備(通常是微控制器),而從機(jī)(通常是傳感器,顯示器或存儲(chǔ)芯片)從主機(jī)那獲取指令。
一套SPI通訊共包含四種信號(hào)線:MOSI (Master Output/Slave Input) – 信號(hào)線,主機(jī)輸出,從機(jī)輸入。MISO (Master Input/Slave Output) – 信號(hào)線,主機(jī)輸入,從機(jī)輸出。SCLK (Clock) – 時(shí)鐘信號(hào)。SS/CS (Slave Select/Chip Select) – 片選信號(hào)。
SPI協(xié)議特點(diǎn)
實(shí)際上,從機(jī)的數(shù)量受系統(tǒng)負(fù)載電容的限制,它會(huì)降低主機(jī)在電壓電平之間準(zhǔn)確切換的能力。
時(shí)鐘信號(hào)
每個(gè)時(shí)鐘周期傳輸一位數(shù)據(jù),因此數(shù)據(jù)傳輸?shù)乃俣热Q于時(shí)鐘信號(hào)的頻率。 時(shí)鐘信號(hào)由于是主機(jī)配置生成的,因此SPI通信始終由主機(jī)啟動(dòng)。
設(shè)備共享時(shí)鐘信號(hào)的任何通信協(xié)議都稱為同步。SPI是一種同步通信協(xié)議,還有一些異步通信不使用時(shí)鐘信號(hào)。 例如在UART通信中,雙方都設(shè)置為預(yù)先配置的波特率,該波特率決定了數(shù)據(jù)傳輸?shù)乃俣群蜁r(shí)序。
片選信號(hào)
主機(jī)通過拉低從機(jī)的CS/SS來使能通信。 在空閑/非傳輸狀態(tài)下,片選線保持高電平。在主機(jī)上可以存在多個(gè)CS/SS引腳,允許主機(jī)與多個(gè)不同的從機(jī)進(jìn)行通訊。
如果主機(jī)只有一個(gè)片選引腳可用,則可以通過以下方式連接這些從器件:
MOSI和MISO
主機(jī)通過MOSI以串行方式將數(shù)據(jù)發(fā)送給從機(jī),從機(jī)也可以通過MISO將數(shù)據(jù)發(fā)送給主機(jī),兩者可以同時(shí)進(jìn)行。所以理論上,SPI是一種全雙工的通訊協(xié)議。
傳輸步驟
1. 主機(jī)輸出時(shí)鐘信號(hào)
使用SPI有一些優(yōu)點(diǎn)和缺點(diǎn),如果在不同的通信協(xié)議之間進(jìn)行選擇,則應(yīng)根據(jù)項(xiàng)目要求進(jìn)行充分考量。
SPI優(yōu)點(diǎn)
SPI通訊無起始位和停止位,因此數(shù)據(jù)可以連續(xù)流傳輸而不會(huì)中斷;沒有像I2C這樣的復(fù)雜的從站尋址系統(tǒng),數(shù)據(jù)傳輸速率比I2C更高(幾乎快兩倍)。獨(dú)立的MISO和MOSI線路,可以同時(shí)發(fā)送和接收數(shù)據(jù)。
SPI缺點(diǎn)
SPI使用四根線(I2C和UART使用兩根線),沒有信號(hào)接收成功的確認(rèn)(I2C擁有此功能),沒有任何形式的錯(cuò)誤檢查(如UART中的奇偶校驗(yàn)位等)。
UART代表通用異步接收器/發(fā)送器也稱為串口通訊,它不像SPI和I2C這樣的通信協(xié)議,而是微控制器中的物理電路或獨(dú)立的IC。
UART的主要目的是發(fā)送和接收串行數(shù)據(jù),其最好的優(yōu)點(diǎn)是它僅使用兩條線在設(shè)備之間傳輸數(shù)據(jù)。UART的原理很容易理解,但是如果您還沒有閱讀SPI 通訊協(xié)議,那可能是一個(gè)不錯(cuò)的起點(diǎn)。
UART通信
在UART通信中,兩個(gè)UART直接相互通信。相關(guān)實(shí)例:按下按鍵,通過串口發(fā)送數(shù)據(jù)實(shí)例。發(fā)送UART將控制設(shè)備(如CPU)的并行數(shù)據(jù)轉(zhuǎn)換為串行形式,以串行方式將其發(fā)送到接收UART。只需要兩條線即可在兩個(gè)UART之間傳輸數(shù)據(jù),數(shù)據(jù)從發(fā)送UART的Tx引腳流到接收UART的Rx引腳:
UART屬于異步通訊,這意味著沒有時(shí)鐘信號(hào),取而代之的是在數(shù)據(jù)包中添加開始和停止位。這些位定義了數(shù)據(jù)包的開始和結(jié)束,因此接收UART知道何時(shí)讀取這些數(shù)據(jù)。
當(dāng)接收UART檢測到起始位時(shí),它將以特定波特率的頻率讀取。波特率是數(shù)據(jù)傳輸速度的度量,以每秒比特?cái)?shù)(bps)表示。兩個(gè)UART必須以大約相同的波特率工作,發(fā)送和接收UART之間的波特率只能相差約10%。
UART工作原理
發(fā)送UART從數(shù)據(jù)總線獲取并行數(shù)據(jù)后,它會(huì)添加一個(gè)起始位,一個(gè)奇偶校驗(yàn)位和一個(gè)停止位來組成數(shù)據(jù)包并從Tx引腳上逐位串行輸出,接收UART在其Rx引腳上逐位讀取數(shù)據(jù)包。
UART數(shù)據(jù)包含有1個(gè)起始位,5至9個(gè)數(shù)據(jù)位(取決于UART),一個(gè)可選的奇偶校驗(yàn)位以及1個(gè)或2個(gè)停止位:
起始位:
UART數(shù)據(jù)傳輸線通常在不傳輸數(shù)據(jù)時(shí)保持在高電壓電平。開始傳輸時(shí)發(fā)送UART在一個(gè)時(shí)鐘周期內(nèi)將傳輸線從高電平拉低到低電平,當(dāng)接收UART檢測到高電壓到低電壓轉(zhuǎn)換時(shí),它開始以波特率的頻率讀取數(shù)據(jù)幀中的位。
數(shù)據(jù)幀:
數(shù)據(jù)幀內(nèi)包含正在傳輸?shù)膶?shí)際數(shù)據(jù)。如果使用奇偶校驗(yàn)位,則可以是5位,最多8位。如果不使用奇偶校驗(yàn)位,則數(shù)據(jù)幀的長度可以為9位。
校驗(yàn)位:
奇偶校驗(yàn)位是接收UART判斷傳輸期間是否有任何數(shù)據(jù)更改的方式。接收UART讀取數(shù)據(jù)幀后,它將對值為1的位數(shù)進(jìn)行計(jì)數(shù),并檢查總數(shù)是偶數(shù)還是奇數(shù),是否與數(shù)據(jù)相匹配。
停止位:
為了向數(shù)據(jù)包的結(jié)尾發(fā)出信號(hào),發(fā)送UART將數(shù)據(jù)傳輸線從低電壓驅(qū)動(dòng)到高電壓至少持續(xù)兩位時(shí)間。