I2C是一種由飛利浦公司開發的串行通信協定,它使用兩條信号線SDA和SCL進行資料傳輸和同步,可以連接配接多個主機和從機裝置,具有低成本、高可擴充性和簡單易用的特點。
STM32晶片上有内置的I2C外設,可以實作硬體I2C通信,也就是說,隻需要配置好外設的寄存器,它就會自動根據協定要求産生通訊信号,收發資料并緩存起來,CPU隻要檢測外設的狀态和通路資料寄存器,就能完成資料收發。
硬體I2C的GPIO引腳是固定的,如下表所示:
STM32F10X | SDA | SCL |
I2C1 | PB7 | PB6 |
I2C1 | PB9 | PB8 |
I2C2 | PB11 | PB10 |
硬體I2C的通信速率可以通過CCR寄存器來設定,可以選擇标準模式(100kbit/s)或快速模式(400kbit/s),還可以選擇SCL時鐘的占空比。
硬體I2C的通信過程分為以下幾個步驟:
- 主機發送起始信号S,表示開始通信。
- 主機發送從機位址SLAVE_ADDRESS和資料方向位R/W,表示要讀或寫從機的資料。
- 從機接收到位址後,如果比對,則傳回應答信号A。
- 主機根據資料方向位R/W,選擇主發送器模式或主接收器模式。
- 主發送器模式下,主機向從機發送一個位元組資料,并等待從機的應答信号A。重複這個過程直到發送完所有資料。
- 主接收器模式下,主機接收從機發送的一個位元組資料,并傳回應答信号A。重複這個過程直到接收完所有資料。最後一個位元組時,主機傳回非應答信号NACK。
- 主機發送停止信号P,表示結束通信。