(
1)概述
i2c(inter-integrated circuit bus)
積體電路匯流排,該匯流排由
nxp(原
philips
)公司設計,多用於主控制器和從器件間的主從通訊,在小資料量場合使用,傳輸距離短,任意時刻只能有乙個主機等特性。經常
i2c和
spi介面被認為指定是一種硬體裝置,但其實這樣的說法是不盡準確的,嚴格的說他們都是人們所定義的軟硬結合體,分為物理層(四線結構)和協議層(主機,從機,時鐘極性,時鐘相位)。
i2c,
spi的區別不僅在與物理層,
i2c比
spi有著一套更為複雜的協議層定義。下面來分別說明一下
i2c的物理層和協議層。(2
)i2c
的物理層
a. 只要求兩條匯流排線路,一條是序列資料線
sda,一條是序列時鐘線
scl。(
iic是半雙工,而不是全雙工)。
b. 每個連線到匯流排的器件都可以通過唯一的位址和其它器件通訊,主機
/從機角色和位址可配置,主機可以作為主機傳送器和主機接收器。
c. iic
是真正的多主機匯流排,(而這個
spi在每次通訊前都需要把主機定死,而
iic可以在通訊過程中,改變主機),如果兩個或更多的主機同時請求匯流排,可以通過衝突檢測和仲裁防止匯流排資料被破壞。
d. 傳輸速率在標準模式下可以達到
100kb/s
,快速模式下可以達到
400kb/s
。e.
連線到匯流排的
ic數量只是受到匯流排的最大負載電容
400pf
限制。乙個典型的
iic介面如下圖(
1)所示
圖(1)(3)
iic的協議層
iic的協議層才是掌握
iic的關鍵。現在簡單概括如下:
a.資料的有效性
在時鐘的高電平週期內,
sda線上的資料必須保持穩定,資料線僅可以在時鐘
scl為低電平時改變。如圖(
2)所示:
圖(2)b.
起始和結束條件
起始條件:當
scl為高電平的時候,
sda線上由高到低的跳變被定義為起始條件;
結束條件:當
scl為高電平的時候,
sda線上由低到高的跳變被定義為停止條件;
要注意起始和終止訊號都是由主機發出的,連線到
i2c匯流排上的器件,若具有
i2c匯流排的硬體介面,則很容易檢測到起始和終止訊號。匯流排在起始條件之後,視為忙狀態,在停止條件之後被視為空閒狀態,對起始條件和結束條件的描述如下圖(
3)所示。
圖(3)c.
應答每當主機向從機傳送完乙個位元組的資料,主機總是需要等待從機給出乙個應答訊號,以確認從機是否成功接收到了資料,從機應答主機所需要的時鐘仍是主機提供的,應答出現在每一次主機完成8
個資料位傳輸後緊跟著的時鐘週期,低電平
0表示應答,
1表示非應答,如圖(
4)所示。
圖(4)d.
資料幀格式
i2c匯流排上傳送的資料訊號是廣義的,既包括位址訊號,又包括真正的資料訊號。
在起始訊號後必須傳送乙個從機的位址(
7位),第
8位是資料的傳送方向位(
r/t),用
"0"表示主機傳送資料(t),
"1"表示主機接收資料(
r)。每次資料傳送總是由主機產生的終止訊號結束。但是,若主機希望繼續占用匯流排進行新的資料傳送,則可以不產生終止訊號,馬上再次發出起始訊號對另一從機進行定址。
。在匯流排的一次資料傳輸過程中,可以有以下幾種組合方式:
[1]
主機向從機傳送資料,資料傳送方向在整個傳送過程中不變:
注:有陰影部分表示資料由主機向從機傳送,無陰影部分則表示資料由從機向主機傳送。
a表示應答
(低電平),
a非表示非應答(高電平)。
s表示起始訊號,
p表示終止訊號。
[2]主機在第乙個位元組後,立即從從機讀資料
:[3]在傳送過程中,當需要改變傳送方向時,起始訊號和從機位址都被重複產生一次,但兩次讀
/寫方向位正好反相:
一般情況下,
[3]是比較常見的,比如
mpu6050
模組,傳送起始訊號
等待從機應答
寫乙個從機位址
+0(表示寫),
等待從機應答
傳送乙個位元組的
mpu6050
加速度儲存暫存器位址,
等待從機應答
再傳送一次起始訊號
等待從機應答
寫乙個從機位址
+1(表示讀)
等待從機應答
讀取mpu6050
感測器資料
主機非應答
e. iic
訊號的模擬
主機可以採用不帶
i2c匯流排介面的微控制器,如
80c51
、at89c2051
等微控制器,利用軟體實現
i2c匯流排的資料傳送,即軟體與硬體結合的訊號模擬。即使是含有
iic硬體的微控制器(如
stm32 103
系列)也有一定的缺陷,所以一般也會模擬
iic的時序。現將具體時間截圖如下
具體的程式**如下:12
3456
78910
1112
1314
1516
1718
1920
2122
2324
2526
2728
2930
3132
3334
3536
3738
3940
4142
4344
4546
4748
4950
5152
5354
5556
5758
5960
6162
6364
6566
6768
6970
7172
7374
7576
//產生起始訊號
void
i2c_start(void)
//產生停止訊號
void
i2c_stop(void)
//主機產生應答訊號
ackvoid
i2c_ack(void)
//主機不產生應答訊號
nack
void
i2c_nack(void)
//等待從機應答訊號,我們只負責主機應答訊號的產生,從機應答訊號
//我們不控制。
//返回值:
1 接收應答失敗
// 0
接收應答成功
u8 i2c_wait_ack(void) }
i2c_scl_l;
return
0; //
如果有響應的話就返回0.}
針對於不同的
iic裝置,
iic協議可能會有一定的區別,有的位址需要左移一位,把最低位騰出來做讀寫位。
SPI和IIC協議解析3
本來不打算整理nrf24l01了,但是看了看發現還是很重要,而且有點東西,還是整理一下吧。同樣標頭檔案中的巨集定義很多。1 先看標頭檔案定義的函式 void nrf24l01 init void void nrf24l01 rx mode void void nrf24l01 tx mode voi...
IIC匯流排協議
i2c匯流排進行資料傳送時,時鐘訊號為高電平期間,資料線上的資料必須保持穩定,只有在時鐘線上的訊號為低電平期間,資料線上的高電平或低電平狀態才允許變化。起始和終止訊號 scl線為高電平期間,sda線由高電平向低電平的變化表示起始訊號 scl線為高電平期間,sda線由低電平向高電平的變化表示終止訊號。...
IIC匯流排協議
iic匯流排狀態 讀寫時序時的匯流排狀態 iic 即inter integrated circuit 積體電路匯流排 這種匯流排型別是由飛利浦半導體公司在八十年代初設計出來的一種簡單 雙向 二線制 同步序列匯流排 兩根訊號線 sda,scl 其中sda為雙向的資料訊號線,scl為時鐘訊號線 主從裝置...