本文轉自:http://m.elecfans.com/article/574049.htmlhtml
IIC vs 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。架構
1、SPI協議
經歷幾回修訂,主要是1995年的400kbps,1998的3.4Mbps。有跡象代表,SPI總線首次推出是在1979年,Motorola公司將SPI總線集成在他們第一支改自68000微處理器的微控制器芯片上。SPI總線是微控制器四線的外部總線(相對於內部總線)。與IIC不一樣,SPI沒有明文標準,只是一種事實標準,對通訊操做的實現只做通常的抽象描述,芯片廠商與驅動開發者經過data sheets和application notes溝通實現上的細節。SPI對於有經驗的數字電子工程師來講,用SPI互聯兩支數字設備是至關直觀的。SPI是種四根信號線協議(如圖):app
-
SCLK: Serial Clock (output from master);工具
-
MOSI; SIMO: Master Output, Slave Input(output from master);性能
-
MISO; SOMI: Master Input, Slave Output(output from slave);ui
-
SS: Slave Select (active low, outputfrom master).url
SPI是[單主設備( single-master )]通訊協議,這意味着總線中的只有一支中心設備能發起通訊。當SPI主設備想讀/寫[從設備]時,它首先拉低[從設備]對應的SS線(SS是低電平有效),接着開始發送工做脈衝到時鐘線上,在相應的脈衝時間上,[主設備]把信號發到MOSI實現「寫」,同時可對MISO採樣而實現「讀」,以下圖:spa
SPI有四種操做模式——模式0、模式一、模式2和模式3,它們的區別是定義了在時鐘脈衝的哪條邊沿轉換(toggles)輸出信號,哪條邊沿採樣輸入信號,還有時鐘脈衝的穩定電平值(就是時鐘信號無效時是高仍是低)。每種模式由一對參數刻畫,它們稱爲時鐘極(clock polarity)CPOL與時鐘期(clock phase)CPHA。.net
[主從設備]必須使用相同的工做參數——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位的字節;
-
第三,數據(幀)中的某些數據位用於控制通訊的開始、中止、方向(讀寫)和應答機制。
2、IIC協議
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緩衝區。另外,總線仲裁在高速模式下可屏蔽掉。更多的信息請參與總線標準文檔。
3、IIC與SPI
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更適合「字節設備」的多主設備應用。
4、小結
在數字通訊協議簇中,IIC和SPI常稱爲「小」協議,相對Ethernet, USB, SATA, PCI-Express等傳輸速度達數百上千兆字節每秒的總線。可是,咱們不能忘記的是各類總線的用途是什麼。「大」協議是用於系統外的整個系統之間通訊,「小」協議是用於系統內各芯片間的通訊,沒有跡象代表「大」協議有必要取代「小」協議。IIC和SPI的存在和流行體現了「夠用就好」的哲學。迴應文首,IIC和SPI如此的流行,它是任何一位嵌入式工程師必備的工具。