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來實現讀寫,相對復雜一些。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的I2C与SPI总线对比的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DB9公母头引脚定义
- 下一篇: SPI及其工作原理浅析