IIC和SPI匯流排協議
IICvs SPI
現今,在低端數字通訊應用領域,我們隨處可見IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身影。原因是這兩種通訊協議非常適合近距離低速晶片間通訊。Philips(for IIC)和Motorola(for SPI) 出於不同背景和市場需求制定了這兩種標準通訊協議。
IIC 開發於1982年,當時是為了給電視機內的CPU和外圍晶片提供更簡易的互聯方式。電視機是最早的嵌入式系統之一,而最初的嵌入系統是使用記憶體對映(memory-mapped I/O)的方式來互聯微控制器和外圍裝置的。要實現記憶體對映,裝置必須並聯入微控制器的資料線和地址線,這種方式在連線多個外設時需大量線路和額外地址解碼晶片,很不方便並且成本高。
為了節省微控制器的引腳和和額外的邏輯晶片,使印刷電路板更簡單,成本更低,位於荷蘭的Philips實驗室開發了 ‘Inter-Integrated Circuit’,IIC 或 IIC ,一種只使用二根線接連所有外圍晶片的匯流排協議。最初的標準定義匯流排速度為100kbps。經歷幾次修訂,主要是1995年的400kbps,1998的3.4Mbps。
有跡象表明,SPI匯流排首次推出是在1979年,Motorola公司將SPI匯流排整合在他們第一支改自68000微處理器的微控制器晶片上。SPI匯流排是微控制器四線的外部匯流排(相對於內部匯流排)。與IIC不同,SPI沒有明文標準,只是一種事實標準,對通訊操作的實現只作一般的抽象描述,晶片廠商與驅動開發者通過data sheets和application notes溝通實現上的細節。
SPI
對於有經驗的數位電子工程師來說,用SPI互聯兩支數字裝置是相當直觀的。SPI是種四根訊號線協議(如圖):
§ SCLK: Serial Clock (output from master);
§ MOSI; SIMO: Master Output, Slave Input(output from master);
§ MISO; SOMI: Master Input, Slave Output(output from slave);
§ SS: Slave Select (active low, outputfrom master).
SPI是[單主裝置( single-master )]通訊協議,這意味著匯流排中的只有一支中心裝置能發起通訊。當SPI主裝置想讀/寫[從裝置]時,它首先拉低[從裝置]對應的SS線(SS是低電平有效),接著開始傳送工作脈衝到時鐘線上,在相應的脈衝時間上,[主裝置]把訊號發到MOSI實現“寫”,同時可對MISO取樣而實現“讀”,如下圖:
SPI有四種操作模式——模式0、模式1、模式2和模式3,它們的區別是定義了在時鐘脈衝的哪條邊沿轉換(toggles)輸出訊號,哪條邊沿取樣輸入訊號,還有時鐘脈衝的穩定電平值(就是時鐘訊號無效時是高還是低)。每種模式由一對引數刻畫,它們稱為時鐘極(clock polarity)CPOL與時鐘期(clock phase)CPHA。
[主從裝置]必須使用相同的工作引數——SCLK、CPOL 和 CPHA,才能正常工作。如果有多個[從裝置],並且它們使用了不同的工作引數,那麼[主裝置]必須在讀寫不同[從裝置]間重新配置這些引數。以上SPI匯流排協議的主要內容。SPI不規定最大傳輸速率,沒有地址方案;SPI也沒規定通訊應答機制,沒有規定流控制規則。事實上,SPI[主裝置]甚至並不知道指定的[從裝置]是否存在。這些通訊控制都得通過SPI協議以外自行實現。例如,要用SPI連線一支[命令-響應控制型]解碼晶片,則必須在SPI的基礎上實現更高階的通訊協議。SPI並不關心物理介面的電氣特性,例如訊號的標準電壓。在最初,大多數SPI應用都是使用間斷性時鐘脈衝和以位元組為單位傳輸資料的,但現在有很多變種實現了連續性時間脈衝和任意長度的資料幀。
IIC
與SPI的單主裝置不同,IIC 是多主裝置的匯流排,IIC沒有物理的晶片選擇訊號線,沒有仲裁邏輯電路,只使用兩條訊號線—— ‘serial data’ (SDA) 和 ‘serial clock’ (SCL)。IIC協議規定:
§ 第一,每一支IIC裝置都有一個唯一的七位裝置地址;
§ 第二,資料幀大小為8位的位元組;
§ 第三,資料(幀)中的某些資料位用於控制通訊的開始、停止、方向(讀寫)和應答機制。
IIC 資料傳輸速率有標準模式(100 kbps)、快速模式(400 kbps)和高速模式(3.4 Mbps),另外一些變種實現了低速模式(10 kbps)和快速+模式(1 Mbps)。
物理實現上,IIC 匯流排由兩根訊號線和一根地線組成。兩根訊號線都是雙向傳輸的,參考下圖。IIC協議標準規定發起通訊的裝置稱為主裝置,主裝置發起一次通訊後,其它裝置均為從裝置。
IIC 通訊過程大概如下。首先,主裝置發一個START訊號,這個訊號就像對所有其它裝置喊:請大家注意!然後其它裝置開始監聽匯流排以準備接收資料。接著,主裝置傳送一個7位裝置地址加一位的讀寫操作的資料幀。當所裝置接收資料後,比對地址自己是否目標裝置。如果比對不符,裝置進入等待狀態,等待STOP訊號的來臨;如果比對相符,裝置會發送一個應答訊號——ACKNOWLEDGE作迴應。
當主裝置收到應答後便開始傳送或接收資料。資料幀大小為8位,尾隨一位的應答訊號。主裝置傳送資料,從裝置應答;相反主裝置接資料,主裝置應答。當資料傳送完畢,主裝置傳送一個STOP訊號,向其它裝置宣告釋放匯流排,其它裝置回到初始狀態。
基於IIC匯流排的物理結構,總線上的START和STOP訊號必定是唯一的。另外,IIC匯流排標準規定SDA線的資料轉換必須在SCL線的低電平期,在SCL線的高電平期,SDA線的上資料是穩定的。
在物理實現上,SCL線和SDA線都是漏極開路(open-drain),通過上拉電阻外加一個電壓源。當把線路接地時,線路為邏輯0,當釋放線路,線路空閒時,線路為邏輯1。基於這些特性,IIC裝置對匯流排的操作僅有“把線路接地”——輸出邏輯0。
IIC匯流排設計只使用了兩條線,但相當優雅地實現任意數目裝置間無縫通訊,堪稱完美。我們設想一下,如果有兩支裝置同時向SCL線和SDA線傳送資訊會出現什麼情況。
基於IIC匯流排的設計,線路上不可能出現電平衝突現象。如果一支裝置傳送邏輯0,其它傳送邏輯1,那麼線路看到的只有邏輯0。也就是說,如果出現電平衝突,傳送邏輯0的始終是“贏家”。
匯流排的物理結構亦允許主裝置在往匯流排寫資料的同時讀取資料。這樣,任何裝置都可以檢測衝突的發生。當兩支主裝置競爭匯流排的時候,“贏家”並不知道競爭的發生,只有“輸家”發現了衝突——當它寫一個邏輯1,卻讀到0時——而退出競爭。
10位裝置地址
任何IIC裝置都有一個7位地址,理論上,現實中只能有127種不同的IIC裝置。實際上,已有IIC的裝置種類遠遠多於這個限制,在一條總線上出現相同的地址的IIC裝置的概率相當高。為了突破這個限制,很多裝置使用了雙重地址——7位地址加引腳地址(external configuration pins)。IIC 標準也預知了這種限制,提出10位的地址方案。
10位的地址方案對 IIC協議的影響有兩點:
§ 第一,地址幀為兩個位元組長,原來的是一個位元組;
§ 第二,第一個位元組前五位最高有效位用作10位地址標識,約定是“11110”。
除了10位地址標識,標準還預留了一些地址碼用作其它用途,如下表:
時鐘拉伸
在 IIC 通訊中,主裝置決定了時鐘速度。因為時鐘脈衝訊號是由主裝置顯式發出的。但是,當從裝置沒辦法跟上主裝置的速度時,從裝置需要一種機制來請求主裝置慢一點。這種機制稱為時鐘拉伸,而基於I²C結構的特殊性,這種機制得到實現。當從裝置需要降低傳輸的速度的時候,它可以按下時鐘線,逼迫主裝置進入等待狀態,直到從裝置釋放時鐘線,通訊才繼續。
高速模式
原理上講,使用上拉電阻來設定邏輯1會限制匯流排的最大傳輸速度。而速度是限制匯流排應用的因素之一。這也說明為什麼要引入高速模式(3.4 Mbps)。在發起一次高速模式傳輸前,主裝置必須先在低速的模式下(例如快速模式)發出特定的“High Speed Master”訊號。為縮簡訊號的週期和提高匯流排速度,高速模式必須使用額外的I/O緩衝區。另外,匯流排仲裁在高速模式下可遮蔽掉。更多的資訊請參與匯流排標準文件。
IIC vs SPI: 哪位是贏家?
我們來對比一下IIC 和 SPI的一些關鍵點:
第一,匯流排拓撲結構/訊號路由/硬體資源耗費
IIC 只需兩根訊號線,而標準SPI至少四根訊號,如果有多個從裝置,訊號需要更多。一些SPI變種雖然只使用三根線——SCLK, SS和雙向的MISO/MOSI,但SS線還是要和從裝置一對一根。另外,如果SPI要實現多主裝置結構,匯流排系統需額外的邏輯和線路。用IIC 構建系統匯流排唯一的問題是有限的7位地址空間,但這個問題新標準已經解決——使用10位地址。從第一點上看,IIC是明顯的大贏家。
第二,資料吞吐/傳輸速度
如果應用中必須使用高速資料傳輸,那麼SPI是必然的選擇。因為SPI是全雙工,IIC 的不是。SPI沒有定義速度限制,一般的實現通常能達到甚至超過10 Mbps。IIC 最高的速度也就快速+模式(1 Mbps)和高速模式(3.4 Mbps),後面的模式還需要額外的I/O緩衝區,還並不是總是容易實現的。
第三,優雅性
IIC 常被稱更優雅於SPI。公正的說,我們更傾向於認為兩者同等優雅和健壯。IIC的優雅在於它的特色——用很輕盈的架構實現了多主裝置仲裁和裝置路由。但是對使用的工程師來講,理解匯流排結構更費勁,而且匯流排的效能不高。
SPI的優點在於它的結構相當的直觀簡單,容易實現,並且有很好擴充套件性。SPI的簡單性不足稱其優雅,因為要用SPI搭建一個有用的通訊平臺,還需要在SPI之上構建特定的通訊協議軟體。也就是說要想獲得SPI特有而IIC沒有的特性——高速效能,工程師們需要付出更多的勞動。另外,這種自定的工作是完全自由的,這也說明為什麼SPI沒有官方標準。IIC和SPI都對低速裝置通訊提供了很好的支援,不過,SPI適合資料流應用,而IIC更適合“位元組裝置”的多主裝置應用。
小結
在數字通訊協議簇中,IIC和SPI常稱為“小”協議,相對Ethernet, USB, SATA, PCI-Express等傳輸速度達數百上千兆位元組每秒的匯流排。但是,我們不能忘記的是各種匯流排的用途是什麼。“大”協議是用於系統外的整個系統之間通訊的,“小”協議是用於系統內各晶片間的通訊,沒有跡象表明“大”協議有必要取代“小”協議。IIC和SPI的存在和流行體現了“夠用就好”的哲學。迴應文首,IIC和SPI如此的流行,它是任何一位嵌入式工程師必備的工具。