1. 程式人生 > 其它 >MCU之I2C協議

MCU之I2C協議

目錄

 

I2C協議

 I2C 物理層

I2C協議層

STM32的硬體I2C

軟體模擬I2C

部分通訊邏輯

附錄


  • I2C協議

I2C 通訊協議(Inter-Integrated Circuit)是由 Phiilps 公司開發的,由於它引腳少,硬體實現簡單,可擴充套件性強,不需要 USART、CAN 等通訊協議的外部收發裝置,現在被廣泛地使用在系統內多個積體電路(IC)間的通訊。

對於通訊協議,我們以分層的方式來理解,最基本的是把它分為物理層和協議層。物理層規定通訊系統中具有機械、電子功能部分的特性,確保原始資料在物理媒體的傳輸。協議層主要規定通訊邏輯,統一收發雙方的資料打包、解包標準。 

  •  I2C 物理層

物理層的特點

  1. 支援多個通訊主機和多個通訊從機。
  2. 使用兩條線 時鐘線(SCL)和資料線(SDA)。
  3. 每個連線到匯流排的裝置都有獨立的地址。
  4. 匯流排通過上拉電阻接到電源。
  5. 多個主機同時使用匯流排時,為了防止資料衝突,會利用仲裁方式決定哪個裝置佔用匯流排。
  6. 標準模式傳輸速率為 100kbit/s ,快速模式為 400kbit/s ,高速模式下可達 3.4Mbit/s,目前大多 I 2 C 裝置不支援高速模式。
  7. 連線到相同匯流排的 IC 數量受到匯流排的最大電容 400pF 限制 。
  • I2C協議層

  • 起始訊號 :當SCL高電平期間,SDA的下降沿為起始訊號;
  • 停止訊號 :當SCL高電平期間,SDA的上升沿為停止訊號;
  • 應答訊號 :在資料傳輸完成後第九個時鐘脈衝(SCL)期間,SDA為低電平,則為應答訊號;
  • 非應答訊號: 在資料傳輸完成後第九個時鐘脈衝(SCL)期間,SDA為高電平,則為非應答訊號;
  • STM32的硬體I2C

  1. I2C輸出引腳,應配置為複用開漏輸出。
  2. 控制通訊的頻率,標準模式100KHZ,快速模式400KHZ,快速模式下可以選擇SCL時鐘的佔空比,STM32的I2C在APB1總線上。
  3. 資料邏輯控制,資料移位暫存器的資料來源及目標是資料暫存器(DR)、地址暫存器(OAR)、PEC 暫存器以及 SDA 資料線。
  4. 整體控制邏輯,控制邏輯的工作模式根據我們配置的“控制暫存器(CR1/CR2)”的引數而改變。在外設工作時,控制邏輯會根據外設的工作狀態修改“狀態暫存器(SR1 和 SR2)”,我們只要讀取這些暫存器相關的暫存器位,就可以瞭解 I2C的工作狀態。除此之外,控制邏輯還根據要求,負責控制產生 I2C中斷訊號、DMA請求及各種 I2C的通訊訊號(起始、停止、響應訊號等)。

主傳送器傳送流程及事件說明如下:
(1) 控制產生起始訊號(S),當發生起始訊號後,它產生事件“EV5”,並會對 SR1 寄
存器的“SB”位置 1,表示起始訊號已經發送;
(2) 緊接著傳送裝置地址並等待應答訊號,若有從機應答,則產生事件“EV6”及
“EV8”,這時 SR1 暫存器的“ADDR”位及“TXE”位被置 1,ADDR 為 1 表
示地址已經發送,TXE 為 1表示資料暫存器為空;
(3) 以上步驟正常執行並對 ADDR 位清零後,我們往 I2C 的“資料暫存器 DR”寫入
要傳送的資料,這時 TXE 位會被重置 0,表示資料暫存器非空,I2C 外設通過
SDA 訊號線一位位把資料傳送出去後,又會產生“EV8”事件,即 TXE 位被置 1,
重複這個過程,就可以傳送多個位元組資料了;
(4) 當我們傳送資料完成後,控制 I2C 裝置產生一個停止訊號(P),這個時候會產生
EV8_2事件,SR1的 TXE 位及 BTF 位都被置 1,表示通訊結束。

假如我們使能了 I2C 中斷,以上所有事件產生時,都會產生 I2C 中斷訊號,進入同一個中斷服務函式,到 I2C中斷服務程式後,再通過檢查暫存器位來判斷是哪一個事件。

主接收器接收流程及事件說明如下:
(1) 同主傳送流程,起始訊號(S)是由主機端產生的,控制發生起始訊號後,它產生事
件“EV5”,並會對 SR1暫存器的“SB”位置 1,表示起始訊號已經發送;
(2) 緊接著傳送裝置地址並等待應答訊號,若有從機應答,則產生事件“EV6”這時
SR1暫存器的“ADDR”位被置 1,表示地址已經發送。
(3) 從機端接收到地址後,開始向主機端傳送資料。當主機接收到這些資料後,會產
生“EV7”事件,SR1 暫存器的 RXNE 被置 1,表示接收資料暫存器非空,我們
讀取該暫存器後,可對資料暫存器清空,以便接收下一次資料。此時我們可以控
制 I2C 傳送應答訊號(ACK)或非應答訊號(NACK),若應答,則重複以上步驟接收
資料,若非應答,則停止傳輸;
(4) 傳送非應答訊號後,產生停止訊號(P),結束傳輸。
在傳送和接收過程中,有的事件不只是標誌了我們上面提到的狀態位,還可能同時標
志主機狀態之類的狀態位,而且讀了之後還需要清除標誌位,比較複雜。我們可使用
STM32標準庫函式來直接檢測這些事件的複合標誌,降低程式設計難度。

  • 軟體模擬I2C

stm32的硬體IIC一直是令人詬病的地方,以至於很多情況下我們不得不選擇使用模擬IIC的方式來在stm32上進行iic通訊。 

軟體模擬I2C簡單方便,不必為繁瑣的事件檢測而費心。

  • 起始訊號 :當SCL高電平期間,SDA的下降沿為起始訊號;
  • 停止訊號 :當SCL高電平期間,SDA的上升沿為停止訊號;
  • 應答訊號 :在資料傳輸完成後第九個時鐘脈衝(SCL)期間,SDA為低電平,則為應答訊號;
  • 非應答訊號: 在資料傳輸完成後第九個時鐘脈衝(SCL)期間,SDA為高電平,則為非應答訊號;
  • 部分通訊邏輯

起始訊號

//起始訊號
void iic_start()
{
	SCL_1
	SDA_1
	iic_delay();   //簡單的延時函式
	SDA_0
	iic_delay();
	SCL_0
	iic_delay();
}

停止訊號

//結束訊號
void iic_stop()
{
	SDA_0
	SCL_1
	iic_delay();
	SDA_1
}

應答訊號

//應答訊號
void iic_ack()
{
	SDA_0
	iic_delay();
	SCL_1
	iic_delay();
	SCL_0
	iic_delay();
	SDA_1
}

非應答訊號

//非應答訊號
void iic_nack()
{
	SDA_1
	iic_delay();
	SCL_1
	iic_delay();
	SCL_0
	iic_delay();
}
  • 附錄

IIC程式碼(硬體IIC & 軟體IIC):https://github.com/kks1234/STM32/tree/master/13.IIC%E9%80%9A%E4%BF%A1