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