串行數(shù)據(jù)總線由于占用較少的管腳被廣泛應(yīng)用在MCU和外設(shè)的連接中,在過(guò)去的幾十年里,有三種最常用的多線串行數(shù)據(jù)傳輸格式SPI、I2C和UART。這3種串行總線的主要區(qū)別:
SPI - Serial Peripheral Interface(串行外設(shè)接口),突出了外設(shè),也就有了主(Master - 控制器)和從(Slave - 外設(shè))之分,在總線中也就只有一個(gè)“主人”,其它都是處于服從的位置,也就是Slave,它是一種有時(shí)鐘信號(hào)的同步串行總線,從器件的尋址是靠專(zhuān)用的片選信號(hào)線SS來(lái)實(shí)現(xiàn)的;
I2C - Inter-Integrated Circuits(集成電路之間的連接),沒(méi)有突出主次,也就是所有掛在總線上的器件都是平等的,它也是一種有時(shí)鐘信號(hào)的同步串行總線,每個(gè)器件都有自己的地址,兩根信號(hào)線都需要通過(guò)電阻上拉;
UART - universal asynchronous receiver/transmitter(通用異步收/發(fā)),顧名思義,它是異步串行總線,傳輸?shù)男盘?hào)中沒(méi)有專(zhuān)用的時(shí)鐘信號(hào)線。
由于很多MCU、外設(shè)芯片為了節(jié)省管腳,都采用了管腳功能復(fù)用的方式,同一個(gè)管腳既可以用于SPI,也可以用于I2C,根據(jù)具體的器件連接方式進(jìn)行選用。當(dāng)器件的管腳配置為I2C的時(shí)候,要記住在I2C的兩根信號(hào)線(SCL、SDA)上一定要有上拉電阻,SPI則不需要。
今天我們就先來(lái)說(shuō)說(shuō)SPI:
SPI(Serial Peripheral Interface - 串行外設(shè)接口)是一種用于短距離通信(主要是嵌入式系統(tǒng)中)的同步串行通信接口規(guī)范,這種接口由Motorola發(fā)明,已經(jīng)成了一種事實(shí)標(biāo)準(zhǔn)。廣泛用于各種MCU處理器中,同傳感器,串行ADC、DAC、存儲(chǔ)器、SD卡以及LCD等進(jìn)行數(shù)據(jù)連接。
幾乎所有的微處理器/微控制器都有SPI/I2C和UART接口,而且不止一個(gè)
SPI和I2C也被廣泛用于傳感器的數(shù)字接口連接
即便FPGA也將SPI和I2C做成了硬化的IP在芯片內(nèi)
SPI總線由4根主要的信號(hào)線組成以實(shí)現(xiàn)數(shù)據(jù)在主設(shè)備(Master)和從設(shè)備(Slave)之間的全雙工(收、發(fā)同時(shí)執(zhí)行)同步(由時(shí)鐘同步)通信:
SCLK:串行時(shí)鐘(由主設(shè)備輸出),每個(gè)時(shí)鐘周期將會(huì)移出一個(gè)新的數(shù)據(jù)位;
MOSI:主設(shè)備輸出?從設(shè)備輸入,數(shù)據(jù)由主設(shè)備進(jìn)入從設(shè)備,器件A上的MOSI線連接到器件B上的MOSI線。
MISO:主設(shè)備輸入? 從設(shè)備輸出,數(shù)據(jù)由從設(shè)備送到主設(shè)備(或其它從設(shè)備,采用菊花鏈配置),器件A上的MISO線連接到器件B上的MISO線。
SS(或SSN): 從設(shè)備選中(低電平有效),用于主設(shè)備控制從設(shè)備用,當(dāng)該從選擇信號(hào)線有效的時(shí)候表示主設(shè)備正在向相應(yīng)的從設(shè)備發(fā)送數(shù)據(jù)或從相應(yīng)的從設(shè)備請(qǐng)求數(shù)據(jù)。
SPI端口管腳的名字也有其它的叫法,不同的芯片公司叫法不同,比如:
串行輸出: SCLK : SCK, CLK.
主輸出 –> 從輸入: MOSI:SIMO、SDI(for slave devices)、DI、DIN、SI、MTST.
主輸入 ← 從輸出: MISO:SOMI、SDO (for slave devices )、DO、DOUT、SO、MRSR.
從選擇: SS: SSN、nCS、CS、CSB、CSN、EN、nSS、STE、SYNC.
主從器件之間的連接及數(shù)據(jù)傳輸方式
SPI允許將數(shù)據(jù)位從主設(shè)備移出到從設(shè)備,同時(shí),可以將從設(shè)備的位移出到主設(shè)備中。
動(dòng)畫(huà)1顯示數(shù)據(jù)從器件A移出到器件B,從器件B移出到器件 A.
動(dòng)畫(huà)2顯示了通過(guò)一個(gè)虛擬的4通道示波器捕捉的兩個(gè)器件之間SPI的轉(zhuǎn)換
由于SPI未標(biāo)準(zhǔn)化,不同廠商的器件具體的定義不同,有的首先傳輸最高有效位(MSb),有的則是最低有效位(LSb),這需要我們認(rèn)真閱讀用到的相應(yīng)器件的數(shù)據(jù)手冊(cè),以確定正確的數(shù)據(jù)處理方式。
4種傳輸模式:
每次數(shù)據(jù)傳輸都是先將SSN(有的器件命名為SS,從選擇線)被驅(qū)動(dòng)為邏輯低電平時(shí)開(kāi)始。由時(shí)鐘的極性(CPOL)和相位(CPHA)構(gòu)成了4種不同的數(shù)據(jù)傳輸模式(0,1,2,3),分別對(duì)應(yīng)四種可能的時(shí)鐘配置。
CPOL: 時(shí)鐘的極性,它控制著時(shí)鐘信號(hào)的初始邏輯狀態(tài)。
CPHA: 時(shí)鐘相位,它控制了數(shù)據(jù)轉(zhuǎn)換和時(shí)鐘轉(zhuǎn)換之間的關(guān)系。
時(shí)鐘的極性和相位構(gòu)成了4種不同的可能,也就有4種模式
在時(shí)鐘周期的上升沿采樣的位在時(shí)鐘周期的下降沿移出,反之亦然。
具有非反相時(shí)鐘極性(即,當(dāng)從器件選擇轉(zhuǎn)換為邏輯低時(shí),時(shí)鐘處于邏輯低電平):
模式0:配置時(shí)鐘相位使得數(shù)據(jù)在時(shí)鐘脈沖的上升沿采樣,并在時(shí)鐘脈沖的下降沿移出。 這對(duì)應(yīng)于上圖中的第一個(gè)藍(lán)色時(shí)鐘軌跡。 請(qǐng)注意,數(shù)據(jù)必須在時(shí)鐘的第一個(gè)上升沿之前可用。
模式1:配置時(shí)鐘相位使得數(shù)據(jù)在時(shí)鐘脈沖的下降沿采樣,并在時(shí)鐘脈沖的上升沿移出。 這對(duì)應(yīng)于上圖中的第二個(gè)藍(lán)色時(shí)鐘軌跡。
使用反相時(shí)鐘極性(即,當(dāng)從器件選擇轉(zhuǎn)換為邏輯低時(shí),時(shí)鐘處于邏輯高電平):
模式2:配置時(shí)鐘相位,使得數(shù)據(jù)在時(shí)鐘脈沖的下降沿采樣,并在時(shí)鐘脈沖的上升沿移出。 這對(duì)應(yīng)于上圖中的第一個(gè)橙色時(shí)鐘軌跡。 請(qǐng)注意,數(shù)據(jù)必須在時(shí)鐘的第一個(gè)下降沿之前可用。
模式3:配置時(shí)鐘相位,使得數(shù)據(jù)在時(shí)鐘脈沖的上升沿采樣,并在時(shí)鐘脈沖的下降沿移出。 這對(duì)應(yīng)于上圖中的第二個(gè)橙色時(shí)鐘軌跡。
由于主設(shè)備一般為可以編程各種模式的控制器/處理器或者可以靈活編程的FPGA,因此在使用SPI連接的時(shí)候要認(rèn)真閱讀自己選用的從設(shè)備的工作模式,以便在時(shí)許上滿足傳輸?shù)囊蟆?/p>
主、從器件連接方式
在標(biāo)準(zhǔn)的SPI配置中,主設(shè)備可以通過(guò)使能相應(yīng)的從設(shè)備,即通過(guò)將相應(yīng)設(shè)備的從選擇線(SSN或SS)設(shè)置為邏輯低電平,通過(guò)共享的公共數(shù)據(jù)線將數(shù)據(jù)寫(xiě)入各個(gè)從設(shè)備或由各個(gè)從設(shè)備中讀取數(shù)據(jù)。 應(yīng)注意不要同時(shí)使能多個(gè)從設(shè)備,因?yàn)榉祷氐街髟O(shè)備的數(shù)據(jù)將在MISO線路之間的驅(qū)動(dòng)器上產(chǎn)生競(jìng)爭(zhēng)導(dǎo)致無(wú)法進(jìn)行數(shù)據(jù)的判讀。 在某些應(yīng)用中不需要將數(shù)據(jù)返回給主設(shè)備,在這種情況下,如果主設(shè)備想要將相同的數(shù)據(jù)發(fā)送到多個(gè)從設(shè)備,則可以同時(shí)尋址多個(gè)從設(shè)備。
在多從設(shè)備選擇配置中,每個(gè)從設(shè)備都需要來(lái)自主設(shè)備的唯一從設(shè)備選擇線(SS、SSN或CSn)。如果主設(shè)備沒(méi)有足夠的I/O引腳用于所需數(shù)量的從設(shè)備,則使用解碼/解復(fù)用器(例如74HC(T)238(3到8線)來(lái)實(shí)現(xiàn)I/O擴(kuò)展)。
在這種配置中,數(shù)據(jù)從一個(gè)設(shè)備移動(dòng)到下一個(gè)設(shè)備, 最終的從設(shè)備可以將數(shù)據(jù)返回給主設(shè)備(給FPGA編程的JTAG在給多個(gè)器件編程的時(shí)候也常用這種方式)。
在菊花鏈配置中,所有從設(shè)備共享一條公共的從選擇線(SS)。 數(shù)據(jù)從主設(shè)備傳輸?shù)降谝粋€(gè)從設(shè)備,然后從第一個(gè)從設(shè)備傳輸?shù)降诙€(gè)從設(shè)備,依此下去,數(shù)據(jù)沿著線路級(jí)聯(lián),直到系列中的最后一個(gè)從設(shè)備,最后的一個(gè)從設(shè)備使用其MISO線路將數(shù)據(jù)傳送到主設(shè)備。
這種配置非常適合于主設(shè)備的信號(hào)引腳有限的場(chǎng)景。
SPI的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
支持全雙工通信
推挽驅(qū)動(dòng)(跟漏極開(kāi)路正相反)提供了比較好的信號(hào)完整性和較高的速度
比I2C或SMBus吞吐率更高
協(xié)議非常靈活支持“位”傳輸
不僅限于8-bit一個(gè)字節(jié)的傳輸
可任意選擇的信息大小、內(nèi)容、以及用途
異常簡(jiǎn)單的硬件接口:
一般來(lái)講比I2C或SMBus需要的功耗更低,因?yàn)樾枰俚碾娐?包括上拉電阻)
沒(méi)有仲裁機(jī)制或相關(guān)的失效模式
“從設(shè)備”采用的是“主設(shè)備”的時(shí)鐘,不需要精確的晶振
“從設(shè)備”不需要一個(gè)單獨(dú)的地址 — 這點(diǎn)不像I2C或GPIB或SCSI
不需要收/發(fā)器
在一個(gè)器件上只用了4個(gè)管腳, 板上走線和布局連接都比并行接口簡(jiǎn)單很多
每個(gè)設(shè)備最多只有一個(gè)單獨(dú)的從設(shè)備選擇信號(hào)(SS、SSN、CSn);其它的都是共享的
信號(hào)都是單方向的,非常容易進(jìn)行電流隔離
對(duì)于時(shí)鐘的速度沒(méi)有上限,有進(jìn)一步提高速度的潛力,很多MCU的SPI傳輸速率可以高達(dá)50Msps,可用于數(shù)據(jù)采集以及圖像的傳輸。
缺點(diǎn):
相比于I2C總線需要更多的管腳, 即便是只用到3根線的情況下
沒(méi)有尋址機(jī)制,在共享的總線連接時(shí)需要通過(guò)片選信號(hào)支持多個(gè)設(shè)備的訪問(wèn)
在從設(shè)備側(cè)沒(méi)有硬件流控機(jī)制(主設(shè)備一側(cè)可以通過(guò)延遲到下一個(gè)時(shí)鐘沿以降低傳輸?shù)乃俾?
從設(shè)備無(wú)法進(jìn)行硬件“應(yīng)答”(主設(shè)備傳送的信息無(wú)法確定傳遞到哪里,是否傳遞成功)
一般只支持一個(gè)主設(shè)備(取決于設(shè)備的硬件構(gòu)成)
沒(méi)有查錯(cuò)機(jī)制
沒(méi)有一個(gè)正式的標(biāo)準(zhǔn)規(guī)范,無(wú)法驗(yàn)證一致性
相對(duì)于RS-232, RS-485, 或CAN-總線,只能近距離傳輸
存在很多的變種,很難能夠找到開(kāi)發(fā)工具(例如主適配卡)支持這所有的變種
SPI不支持熱交換(動(dòng)態(tài)地增加一個(gè)節(jié)點(diǎn)).
如果想使用“中斷”,只有通過(guò)SPI信號(hào)以外的其它信號(hào)線,或者采用類(lèi)似USB1.1或2.0中的周期性查詢的欺騙方式
應(yīng)用舉例:
小腳丫FPGA學(xué)習(xí)主板上的DAC、ADC、以及用于圖形顯示的液晶屏都是通過(guò)SPI接口連接的。
小腳丫FPGA主板的實(shí)物照片,外設(shè)基本都是通過(guò)SPI、I2C以及UART進(jìn)行連接的
小腳丫FPGA主板的功能框圖
鑒于此,我們硬件工程師很有必要深入了解SPI、I2C以及UART的技術(shù)細(xì)節(jié),尤其是傳輸信號(hào)線的連接以及傳輸?shù)臅r(shí)序要求,爭(zhēng)取能夠自己通過(guò)FPGA來(lái)編程實(shí)現(xiàn)各種傳輸總線。
聯(lián)系客服