一、IIC的特點
I2C(Inter IC Bus)又成為(愛方C I2C)是由Philips公司開發的一種通用數據總線
兩根通信線:SCL(Serial Clock)、SDA(Serial Data)
同步,半雙工
帶數據應答
支持總線掛載多設備(一主多從、多主多從)
二、外設硬件
STM32內部集成了硬件I2C收發電路,可以由硬件自動執行時鐘生成、起始終止條件生成、應答位收發、數據收發等功能,減輕CPU的負擔
支持多主機模型
支持7位/10位地址模式
支持不同的通訊速度,標準速度(高達100 kHz),快速(高達400 kHz)
支持DMA
兼容SMBus協議
STM32F103C8T6 硬件I2C資源:I2C1、I2C2
上圖設備都能夠支持IIC通信的設備。在通信過程當中,每個設備都有一個相應的地址,比如說第一個MPU6050,地址一般是1101?000,第三個AT24C02的地址一般是101 0000,不同型號的設備的地址都不一樣,相同型號的設備可以在拓展口接入1條線來防止地址沖突。例:MPU6050AD0引腳接高電平就是1101 001.
三、硬件電路
所有I2C設備的SCL連在一起,SDA連在一起
設備的SCL和SDA均要配置成開漏輸出模式
SCL和SDA各添加一個上拉電阻,阻值一般為4.7KΩ左右
首先看上圖左側,IIC主要有兩個線組成,SDA和SCL這兩根線。SDA是數據線,SCL是時鐘線,他們的都是由主機CPU控制,主機CPU具有對SCL(時鐘線)的完全控制,而從機只有短暫的控制SDA(數據線)的能力,只有在從機發送數據的時候才能夠控制SDA,而且需要主機主動發送接收邀請,從機接收到邀請并且應答,然后主機接收到應答才轉交SDA控制權給從機。
由于為了避免電路短路以及引腳電平頻繁轉換的原因,規定了設備的SCL和SDA均要配置成開漏輸出模式 (開漏輸出模式當引腳輸出高電平的狀態為高阻態,輸出低電平的時候才是低電平)。上拉電阻的引入讓這兩條線一直處于弱上拉的狀態,只允許設備下拉。
由于只能夠下拉,當某一個設備下拉了某條線,這整條線都處于低電平的狀態,除非全部設備對這根線都是高阻態(上拉)這條線才是高電平。這樣的特性讓IIC能夠實現多主機時鐘同步和總線總裁。
四、時序
起始與結束
起始條件:SCL處于高電平,在此期間SDA從高電平切換到低電平,隨后主機將SCL電平。平拉低從機接收到這個信號就開始復位準備接收數據?。
終止條件:主機將SCL放開,SCL回到高電平,在SCL高電平期間,SDA從低電平切換到高電平
接收發送與應答
發送一個字節:SCL低電平期間,主機將數據位依次放到SDA線上(高位先行),然后釋放SCL,從機將在SCL高電平期間讀取數據位,所以SCL高電平期間SDA不允許有數據變化,依次循環上述過程8次,即可發送一個字節
接收一個字節:SCL低電平期間,從機將數據位依次放到SDA線上(高位先行),然后釋放SCL,主機將在SCL高電平期間讀取數據位,所以SCL高電平期間SDA不允許有數據變化,依次循環上述過程8次,即可接收一個字節(主機在接收之前,需要釋放SDA)
無論是主機發送還是主機接收,SDA只有在SCL低電平期間才能夠改變,這為了在SCL高電平期間讀取到的數據穩定可靠。
發送應答:主機在接收完一個字節之后,在下一個時鐘發送一位數據,數據0表示應答,數據1表示非應答
接收應答:主機在發送完一個字節之后,在下一個時鐘接收一位數據,判斷從機是否應答,數據0表示應答,數據1表示非應答(主機在接收之前,需要釋放SDA)
主機接收前都會釋放SDA,當從機拉低了SDA也就是0的時候代表從機應答了,從機并沒有拉低SDA,還是1那就表示未應答。
總結
只需兩根線:
????????SDA(Serial Data Line): 串行數據線,用于傳輸數據。
????????SCL(Serial Clock Line): 串行時鐘線,由主設備產生,用于同步數據。
主從模式:
????????主設備(Master): 負責發起和終止傳輸、產生時鐘信號。通常由微處理器(如單片機)擔任。
????????從設備(Slave): 響應主設備的命令。每個從設備都有一個唯一的設備地址(7位或10位),主設備通過該地址來選擇與哪個從機通信。一個總線上可以掛載多個從設備(由地址空間和總線電容限制)。
多主從支持: 總線可以支持多個主設備(多主模式),通過仲裁機制防止數據沖突。
一次典型的 I2C 通信流程如下:
起始條件(START):
????????主設備在 SCL 為高電平時,將 SDA 線從高電平拉低。這個下降沿表示一次傳輸的開始。
發送從機地址:
????????主設備發送一個7位或10位的從設備地址,后面緊跟一個讀寫位(R/W#)。
????????讀寫位為 0 表示主設備要向從設備寫入(Write) 數據。
????????讀寫位為 1 表示主設備要向從設備讀取(Read) 數據。
????????這8位數據(7位地址+1位讀寫)在 SCL 高電平時必須保持穩定。
應答信號(ACK/NACK):
????????每傳輸完一個字節(8位)的數據(包括地址字節),接收方(無論是主還是從)必須在第9個時鐘脈沖期間發送一個應答(ACK)信號。
????????ACK: 接收方將 SDA 線拉低,表示成功收到字節。
????????NACK: 接收方保持 SDA 線為高,通常表示傳輸結束或接收失敗。
數據傳輸:
????????寫操作: 主設備繼續向 SDA 線上發送數據字節,從設備每個字節后回應 ACK。
讀操作: 從設備向 SDA 線上發送數據字節,主設備每個字節后回應 ACK(如果需要繼續讀)或 NACK(表示讀取結束)。
停止條件(STOP):
????????主設備在 SCL 為高電平時,將 SDA 線從低電平拉高。這個上升沿表示本次傳輸的結束,總線恢復空閑狀態。