注意:硬件I2C的引腳是固定的
SDA和SCL都是復用到外部引腳。
SDA發送時數據寄存器的數據在數據移位寄存器空閑的狀態下進入數據移位寄存器,此時會置狀態寄存器的TXE為1,表示發送寄存器為空,然后往數據控制寄存器中一位一位的移送數據。接收時數據控制寄存器中的數據一位一位的從引腳移位到數據移位寄存器中,當一個數據以為完成后就從數據移位寄存器中轉移到數據寄存器,同時置RXNE表示接收寄存器非空。自身地址寄存器時STM32作為從機時的地址,比較器會比較主機的發出的地址與自身地址是否匹配,如果匹配就響應主機的召喚。STM32支持同時響應兩個主機的召喚,所以有雙低地址寄存器。PEC是用來數據校驗的模塊,執行CRC數據校算。
SCL的時鐘控制是用來控制SCL的,時鐘控制寄存器寫對應的位,電路就會啟用對應的功能,控制邏輯電路寫入控制寄存器可以對電路進行控制,讀取狀態寄存器,可以讀取電路的狀態。
注意:使用I2C的時候,兩個GPIO口都要配置成復用開漏輸出的模式。此時是片上外設控制引腳電平。
圖中線路對應SDA的GPIO的連個箭頭。分別對應輸出和輸入。
硬件I2C的操作流程:
7位主發送:
1.產生開始條件
2.EV5標志位,表示起始條件已發送,發送從機地址,然后等待從機應答A,如果沒有應答就會產生中斷
3.EV6事件:表示地址發送結束
4.EV8_1事件:準備好發送
5.EV8事件:表示可以寫入下一個數據
6.EV8_2:表示數據發送完,可以產生終止條件
7位主接收:
1.EV5:起始條件已經發送
2.尋址接收應答A
3.EV6:代表尋址已完成
4.EV6_1:表示數據正在移位
5.EV7:表示收到一個字節的數據
6.EV7_1:表示想要結束