I2C和SPI總線對比

最近2週一直在調試IIC和SPI總線設備,這裏記錄一下2種總線,以備後忘。

一 IIC總線

I2C--INTER-IC串行總線的縮寫,是PHILIPS公司推出的芯片間串行傳輸總線。它以1根串行數據線(SDA)和1根串行時鐘線(SCL)實 現了雙工的同步數據傳輸。具有接口線少,控制方式簡化,器件封裝形式小,通信速率較高等優點。在主從通信中,可以有多個I2C總線器件同時接到I2C總線 上,通過地址來識別通信對象。

IIC 接口的協議裏面包括設備地址信息,可以同一總線上連接多個從設備,通過應答來互通數據及命令。但是傳輸速率有限,標準模式下可達到100Kbps,快速模式下可達到400Kbps(我們開發板一般在130Kbps),高速模式下達到4Mbps,不能實現全雙工,不適合傳輸很多的數據。

IIC總線是一個真正的多主機總線,總線上多個主機初始化傳輸,可以通過傳輸檢測和仲裁來防止數據被破壞 。

下來詳細瞭解IIC總線時序:

1.1 總線數據有效性

IIC總線是單工,因此同一時刻數據只有一個流向,因此採樣有效時鐘也是單一的,是在SCL時鐘的高電平採樣數據。

IIC總線上SDA數據在SCL時鐘低電平是可以發生變化,但是在時鐘高電平時必須穩定,以便主從設備根據時鐘採樣數據,如下圖:



1.2 總線空閒條件

IIC總線上設備都釋放總線(發出傳輸停止)後,IIC總線根據上拉電阻變成高電平,SDA SCL都是高電平。


1.3 總線數據傳輸起始和結束條件

IIC總線SCL高電平時SDA出現由高到低的跳變,標誌總線上數據傳輸的開始條件

IIC總線SCL高電平時SDA出現由低到高的跳變,標誌總線上數據傳輸的結束條件



1.4 總線數據傳輸順序以及ACK應答

IIC總線上數據傳輸室MSB在前,LSB在後,從示波器上看,從左向右依次讀出數據即可

IIC總線傳輸的數據不收限制,但是每次發到SDA上的必須是8位,並且主機發送8位後釋放總線,從機收到數據後必須拉低SDA一個時鐘,迴應ACK表示數據接收成功,我們如果示波器上看到的波形就是每次9位數據,8bit+1bit ack。如下:


從機收到一字節數據後,如果需要一些時間處理,則會拉低SCL,讓傳輸進入等待狀態,處理完成,釋放SCL,繼續傳輸,如下:



1.5 總線讀寫時序

數據的傳輸在起始條件之後,發送一個7位的從機地址,緊接着第8位是數據方向(R/ W),0-表示發送數據(寫),1-表示接收數據(讀)。數據傳輸一般由主機產生的停止位(P)終止。但是如果主機仍希望在總線上通訊,它可以產生重複起始條件(Sr),和尋址另一個從機,而不是首先產生一個停止條件。在這種傳輸中,可能有不同的讀/寫格式結合。

IIC總線主設備讀寫從設備,一般都是與從設備的寄存器打交道,這個可以通過閱讀從設備的datasheet獲取。總線寫時序如下:

master start + master addr|w + slave ack + master reg|w + slave ack + master data + slave ack + master restart。。master data + slave nack + master stop

總線讀時序如下:

master start + master addr|w + slave ack + master reg|w + slave ack + master restart + master addr|r + slave ack + slave data + master nack + master stop

總線讀時序與寫的不同之處在於讀需要2次傳輸才能完成一次讀取,首先要寫寄存器地址到從設備,其實是寫到了從設備的控制寄存器或者命令寄存器,從設備內部會根據這個地址來尋址所要操作的寄存器。

我在讀我們的bios和內核時發現,2者在總線讀時序上的實現不太一樣,在於第一次寄存器地址寫入後,一個發的是restart,一個發的是stop,然後再start開始讀取數據,示波器抓波形發現讀取數據都正確,說明這2種時序都是正確的。

IIC總線的讀寫時序比較固定,設備通信嚴格遵循協議,因此iIC總線設備驅動程序的編寫也就相對簡單一些。

主要應用的iIc總線設備有touchscreen rtc 外擴io等


二 SPI總線

SPI--Serial Peripheral Interface,串行外圍設備接口,是Motorola公司推出的一種同步串行通訊方式,是一種三線同步總線,因其硬件功能很強,與SPI有關的軟件就相當簡單,使CPU有更多的時間處理其他事務。
 SPI通常有SCK時鐘,STB片選,DATA數據信號三個信號。 I2C通常有 SDA數據和SCL時鐘兩個信號。

SPI總線真正實現了全雙工數據傳輸,SPI 有3線跟4線兩種,4線的話,就是多了一條叫SDC的線,用來告知從設備現在傳輸的是數據還是指令。這個接口較快,可以傳輸較連續的數據。SPI要想連接多個從設備,就需要給每個從設備配備一根片選信號。如果要可以實現全雙工,也是需要多加一根數據線(MOSI MISO)。

也就是說SPI總線是通過片選來選擇從設備。

spi總線速度要比iic要快,我們開發板最快能達到30MHZ。


spi總線特點:

1. 採用主-從模式(Master-Slave) 的控制方式
       SPI 規定了兩個 SPI 設備之間通信必須由主設備 (Master) 來控制次設備 (Slave). 一個 Master 設備可以通過提供 Clock 以及對 Slave 設備進行片選 (Slave Select) 來控制多個 Slave 設備, SPI 協議還規定 Slave 設備的 Clock 由 Master 設備通過 SCK 管腳提供給 Slave 設備, Slave 設備本身不能產生或控制 Clock, 沒有 Clock 則 Slave 設備不能正常工作.

2. 採用同步方式(Synchronous)傳輸數據
       Master 設備會根據將要交換的數據來產生相應的時鐘脈衝(Clock Pulse), 時鐘脈衝組成了時鐘信號(Clock Signal) , 時鐘信號通過時鐘極性 (CPOL) 和 時鐘相位 (CPHA) 控制着兩個 SPI 設備間何時數據交換以及何時對接收到的數據進行採樣, 來保證數據在兩個設備之間是同步傳輸的.

3. 數據交換(Data Exchanges)
       SPI 設備間的數據傳輸之所以又被稱爲數據交換, 是因爲 SPI 協議規定一個 SPI 設備不能在數據通信過程中僅僅只充當一個 "發送者(Transmitter)" 或者 "接收者(Receiver)". 也就是說是全雙工的,在每個 Clock 週期內, SPI 設備都會發送並接收一個 bit 大小的數據, 相當於該設備有一個 bit 大小的數據被交換了.
       一個 Slave 設備要想能夠接收到 Master 發過來的控制信號, 必須在此之前能夠被 Master 設備進行訪問 (Access). 所以, Master 設備必須首先通過 SS/CS pin 對 Slave 設備進行片選, 把想要訪問的 Slave 設備選上.
       在數據傳輸的過程中,  每次接收到的數據必須在下一次數據傳輸之前被採樣. 如果之前接收到的數據沒有被讀取, 那麼這些已經接收完成的數據將有可能會被丟棄,  導致 SPI 物理模塊最終失效. 因此, 在程序中一般都會在 SPI 傳輸完數據後, 去讀取 SPI 設備裏的數據, 即使這些數據(Dummy Data)在我們的程序裏是無用的.

具體spi工作原理可以看博客另外一篇文章

SPI和IIC是2種不同的通信協議,現在已經廣泛的應用在IC之間的通信中。並且不少單片機已經整和了SPI和IIC的藉口。但像51這種不支持SPI和IIC的單片機,也可以用模擬時鐘的工作方式進行SPI和IIC的通信的。

下面主要總結一下2種總線的異同點:

1 iic總線不是全雙工,2根線SCL SDA。spi總線實現全雙工,4根線SCK CS MOSI MISO

2 iic總線是多主機總線,通過SDA上的地址信息來鎖定從設備。spi總線只有一個主設備,主設備通過CS片選來確定從設備

3 iic總線傳輸速度在100kbps-4Mbps。spi總線傳輸速度更快,可以達到30MHZ以上。

4 iic總線空閒狀態下SDA SCL都是高電平。spi總線空閒狀態MOSI MISO也都是 SCK是有CPOL決定的

5 iic總線scl高電平時sda下降沿標誌傳輸開始,上升沿標誌傳輸結束。spi總線cs拉低標誌傳輸開始,cs拉高標誌傳輸結束

6 iic總線是SCL高電平採樣。spi總線因爲是全雙工,因此是沿採樣,具體要根據CPHA決定。一般情況下master device是SCK的上升沿發送,下降沿採集

7 iic總線和spi總線數據傳輸都是MSB在前,LSB在後(串口是LSB在前)

8 iic總線和spi總線時鐘都是由主設備產生,並且只在數據傳輸時發出時鐘

9 iic總線讀寫時序比較固定統一,設備驅動編寫方便。spi總線不同從設備讀寫時序差別比較大,因此必須根據具體的設備datasheet來實現讀寫,相對複雜一些。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章