1. 程式人生 > >IIC協議層

IIC協議層

常見 驅動 幀格式 strong 周期 mpu6050 nts 陰影 pos

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)。{這裏小編在驅動MPU6050模塊的時候,就犯過這樣的錯誤,它寫的MPU6050從機地址是0x68,因為發送從機地址的時候,要加一位讀寫方向位,因為剛開始應該是向這個MPU6050裏寫從機裏某個寄存器的地址,所以應該是7位地址 0x68(1101000)+二進制位0=11010000)也就是0xD0,表示要向該IIC設備裏寫東西,然後再緊接著寫入IIC設備裏的寄存器地址,而我直接寫入了0x68,導致出錯},
每次數據傳送總是由主機產生的終止信號結束。但是,若主機希望繼續占用總線進行新的數據傳送,則可以不產生終止信號,馬上再次發出起始信號對另一從機進行尋址。
在總線的一次數據傳輸過程中,可以有以下幾種組合方式: [1] 主機向從機發送數據,數據傳送方向在整個傳送過程中不變: 技術分享圖片 註:有陰影部分表示數據由主機向從機傳送,無陰影部分則表示數據由從機向主機傳送。 A表示應答(低電平), A非表示非應答(高電平)。S表示起始信號,P表示終止信號。 [2]主機在第一個字節後,立即從從機讀數據: 技術分享圖片
[3]在傳送過程中,當需要改變傳送方向時,起始信號和從機地址都被重復產生一次,但兩次讀/寫方向位正好反相:
技術分享圖片
一般情況下,[3]是比較常見的,比如MPU6050模塊, 發送起始信號 等待從機應答 寫一個從機地址+0(表示寫), 等待從機應答 發送一個字節的MPU6050加速度存儲寄存器地址, 等待從機應答 再發送一次起始信號 等待從機應答 寫一個從機地址+1(表示讀) 等待從機應答 讀取MPU6050傳感器數據 主機非應答

IIC協議層