I2C总线协议
1. 簡(jiǎn)介
??????I2C (Inter-Integrated Circuit),是一種串行通信總線,用于連接微控制器及其外圍設(shè)備,實(shí)現(xiàn)主控制器和從器件間的主從雙向通信,是一種同步半雙工通信(兩端時(shí)鐘頻率一致,雙向通信,但不能同時(shí)進(jìn)行數(shù)據(jù)收發(fā))。
2. 原理
??????I2C通信屬于串行通信,具有兩根串行信號(hào)線:數(shù)據(jù)線(SDA),時(shí)鐘線(SCL)。如下圖所示,主控制器與從器件(一個(gè)或多個(gè))都通過(guò)兩根信號(hào)線連接,信號(hào)線上主機(jī)和從機(jī)都可以扮演發(fā)送器和接收器的角色。為確保傳輸過(guò)程的指向準(zhǔn)確性,每個(gè)接到I2C總線上的器件都有唯一的地址(7位從器件專用地址碼),可實(shí)現(xiàn)制定從機(jī)的定向傳輸與群發(fā)傳輸。
2.1 信號(hào)類型
??????同時(shí),為確保傳輸穩(wěn)定,所有連接在同一I2C總線上的設(shè)備共用一個(gè)時(shí)鐘。I2C 總線在傳送數(shù)據(jù)過(guò)程中共有以下幾種類型信號(hào):
(1) 開始信號(hào)/結(jié)束信號(hào)
- SCL 為高電平時(shí),SDA 由高電平向低電平跳變,開始傳送數(shù)據(jù)。
- SCL 為高電平時(shí),SDA 由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù)。
(2) 應(yīng)答信號(hào)/非應(yīng)答信號(hào)
- IIC 總線協(xié)議規(guī)定,每傳送一個(gè)字節(jié)數(shù)據(jù)后(8bit),都要有一個(gè)應(yīng)答信號(hào)以確定數(shù)據(jù)傳送是否被對(duì)方收到。即一個(gè)字節(jié)傳輸?shù)?個(gè)時(shí)鐘過(guò)后的第9個(gè)時(shí)鐘期間,接收器必須回一個(gè)ACK應(yīng)答信號(hào)給發(fā)送器,這樣才能進(jìn)行數(shù)據(jù)傳輸。
- 應(yīng)答信號(hào)由接受設(shè)備產(chǎn)生,在SCL為高電平期間,接受設(shè)備將SDA拉低為低電平,表示數(shù)據(jù)傳輸正確,產(chǎn)生應(yīng)答(ACK),SDA拉高則表示數(shù)據(jù)傳輸失敗,產(chǎn)生非應(yīng)答位(NACK)。
(3) 閑置狀態(tài)/被占用狀態(tài)
- 在主機(jī)發(fā)送起始信號(hào)后,且未發(fā)送終止信號(hào)期間,總線處于被占用狀態(tài)。
- 發(fā)送終止信號(hào)后,總線處于閑置狀態(tài),SCL與SDA同時(shí)為高電平。
2.2 總線讀寫流程
??????I2C總線進(jìn)行數(shù)據(jù)傳送時(shí),SCL時(shí)鐘信號(hào)為高電平期間,SDA數(shù)據(jù)線上的數(shù)據(jù)必須保持穩(wěn)定,只有在時(shí)鐘線上的信號(hào)為低電平期間,數(shù)據(jù)線上的高電平或低電平狀態(tài)才允許變化。 當(dāng)一個(gè)字節(jié)按數(shù)據(jù)位從高位到低位的順序傳輸完后,緊接著從機(jī)將拉低SDA線,回傳給主設(shè)備一個(gè)應(yīng)答位ACK, 此時(shí)才認(rèn)為一個(gè)字節(jié)真正的被傳輸完成 ,如果一段時(shí)間內(nèi)沒(méi)有收到從機(jī)的應(yīng)答信號(hào),則自動(dòng)認(rèn)為從機(jī)已正確接收到數(shù)據(jù)。
I2c總線寫通信過(guò)程:
- 主機(jī)在檢測(cè)到總線空閑的狀況下,首先發(fā)送一個(gè)START信號(hào)掌管總線;
- 發(fā)送一個(gè)地址字節(jié)(8 bit),其中bit0-6位為從機(jī)地址,存放從機(jī)唯一地址;bit7位為讀寫位(R/W),0表示write主機(jī) ->從機(jī),1表示read 從機(jī)->主機(jī);
- 主機(jī)發(fā)送地址時(shí),總線上每個(gè)從機(jī)都會(huì)將7位地址與自己的地址進(jìn)行比較,若相同,則將匹配成功,發(fā)送應(yīng)答信號(hào)(ACK),確定發(fā)送器和接收器;
- 主機(jī)收到ACK后開始發(fā)送第一個(gè)字節(jié)(Command),對(duì)應(yīng)從機(jī)中要寫入的寄存器;
- 從機(jī)接收到Command后,從機(jī)發(fā)送ACK;
- 主機(jī)收到ACK后開始發(fā)送第一個(gè)數(shù)據(jù)字節(jié):bit0-7(8bit數(shù)據(jù),高到低),從機(jī)收到數(shù)據(jù)后,發(fā)送應(yīng)答ACK;
- 繼續(xù)發(fā)送數(shù)據(jù),n幀;
- 主控發(fā)送完全部數(shù)據(jù)后,發(fā)送一個(gè)停止位STOP,結(jié)束整個(gè)通訊并且釋放總線;
*ps 叢機(jī)尋址方式除了常規(guī)的7位尋址外,還有10位尋址方式,通過(guò)兩個(gè)字節(jié)發(fā)送,并在第一個(gè)字節(jié)高位添加固定標(biāo)志數(shù)據(jù)以坐區(qū)分尋址方式。
I2c總線讀通信過(guò)程:
*方向仍然是寫,待接收到從機(jī)發(fā)送的ACK應(yīng)答后,配對(duì)成功。
*方向設(shè)置為讀,主機(jī)設(shè)置為接收模式
*主機(jī)不向從機(jī)發(fā)送應(yīng)答信號(hào),接收完畢后直接發(fā)起終止信號(hào)。
3. 應(yīng)用實(shí)例:I2C控制溫感IC
以溫度傳感器MAX1617A為例,對(duì)照手冊(cè)可查找到以下數(shù)據(jù):
-
Command 寄存器對(duì)照表如下,可根據(jù)Command表查找從機(jī)對(duì)應(yīng)寄存器地址。
-
溫度數(shù)據(jù)返回格式如下所示:
通過(guò)以上數(shù)據(jù),我們即可有思路,對(duì)照寫入讀寫過(guò)程:
- 寫入時(shí),輸入Command 使用: 0x0B,0x0C 寫入溫度上限與下限值;
- 讀取時(shí),輸入Command使用:0x00,0x05,0x06 讀當(dāng)前溫度,與前面設(shè)置的溫度上限與下限值;
邏輯分析儀數(shù)據(jù)采樣如下所示:
- 寫入過(guò)程:
0x30為 從機(jī)地址0x18<<1 + 讀寫位(0);
0x0B為 Command,對(duì)應(yīng)從機(jī)寄存器存放地址;
0x00位 將寫入的數(shù)據(jù);
波形如下所示:
- 讀取過(guò)程:
讀當(dāng)前溫度
讀過(guò)程中,方向先為寫入,后為讀取
0x31,為 從機(jī)地址0x18<<1 + 讀寫位(1);
0x1A,為返回溫度值,換算得到正好是小編當(dāng)前溫度26度。
讀溫度上限:
??????
??????
??????
3.讀溫度下限:
??????
??????
??????
總結(jié)
- 上一篇: JS递归算法经典案例与分析
- 下一篇: 文档中根元素后面的标记格式必须正确。