標籤:
轉自:http://blog.csdn.net/skyflying2012/article/details/8237881/
最近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來實現讀寫,相對複雜一些。
I2C和SPI匯流排對比【轉】