一、I2C基礎概念
I2C通信是一種串行通信協議,由兩根線組成——數據線(SDA)和時鐘線(SCL)。I2C通信是主從式的通信協議,主設備由遠程控制器控制,從設備則是被控制的器件。I2C總線上可以連接多個從設備,每個從設備都有唯一的地址。
I2C總線協議具有兩種常見的模式:標準模式和快速模式。標準模式時鐘頻率為100kHz,快速模式時鐘頻率可以達到400kHz。
二、I2C時序
在I2C通信中,時序控制非常重要。I2C通信總共有兩種傳輸模式:數據傳輸模式和地址傳輸模式。
1.數據傳輸模式
數據傳輸模式是I2C常用的傳輸模式之一。它分為數據發送和數據接收兩個部分,以下是數據發送時序:
SDA: ----______----______----______----______---- SCL: --________--________--________--________--
I2C的數據傳輸模式是在時鐘的上升沿(SCL=HIGH)時,數據線上才能進行數據傳輸。在數據發送時,首先將數據放在數據線(SDA)上,然後通過時鐘線(SCL)上升沿的觸發,將數據發送出去。在下降沿時,數據線上應答位(ACK)的值為0則表示接收成功,反之,則表示接收失敗
以下是數據接收時序:
SDA: ----______----______----______----______---- SCL: --________--________--________--________--
在數據接收時,主設備首先向從設備發送讀取指令,然後從設備才將數據從數據線(SDA)上發送出去,主設備在接受到數據時通過應答位(ACK)來告訴從設備接收是否成功。
2.地址傳輸模式
在I2C通信中,為了向一個從設備傳遞數據,主設備需要向該從設備發送數據所對應的地址。以下是地址傳輸模式時序圖:
SDA: ----______----______----______----______---- SCL: --________--________--________--________--
在地址傳輸模式中,主設備會先發送起始信號(S),然後發送從設備地址,最後傳輸方向位(R/W)。從設備接收到地址後,將通過應答位(ACK)表示接收成功,並且等待主設備傳輸數據。
三、I2C代碼實例
以下是I2C通信的STM32代碼示例:
#include "Wire.h" void setup() { Wire.begin(); // 初始化I2C總線 Serial.begin(9600); // 初始化串口波特率 } void loop() { int addr = 0x3F; // 從設備地址 int data = 0xAA; // 發送的數據 Wire.beginTransmission(addr); // 開始發送 Wire.write(data); // 發送數據 Wire.endTransmission(); // 結束髮送 delay(100); Wire.requestFrom(addr, 1); // 請求數據 if (Wire.available() > 0) { int val = Wire.read(); // 讀取數據 Serial.println(val); // 輸出數據 } delay(1000); }
代碼中使用了Wire.h庫初始化了I2C總線。在setup()函數中,初始化了I2C總線和串口。在loop()函數中,定義從設備地址和發送的數據,然後開啟傳輸並發送數據。接着,等待從設備向主設備發回數據,讀取數據並輸出到串口。
原創文章,作者:DSMSL,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/368166.html