嵌入式系統(tǒng)中的I2C總線時序
I2C 總線在嵌入式系統(tǒng)中非常常見,本文詳細講解 I2C 總線的時序規(guī)則。
許多電子工程師第一次接觸 I2C 總線,都是通過 EEPROM 或 ROM 通信。實際上,I2C 的應(yīng)用遠不止存儲芯片,其使用場景與 RS?485、SPI 等總線類似。

EEPROM內(nèi)存系統(tǒng)架構(gòu)圖
1. 位傳輸
I2C 是由飛利浦公司開發(fā)的雙向兩線同步串行總線,只需要 SCL(時鐘線) 和 SDA(數(shù)據(jù)線) 兩根線,就能實現(xiàn)總線上多個芯片之間的控制與數(shù)據(jù)傳輸。

I2C 總線位傳輸
I2C 總線上的數(shù)據(jù)是逐位傳輸的:
SCL 為高電平時:SDA 上的數(shù)據(jù)必須保持穩(wěn)定,不允許變化。
SCL 為低電平時:SDA 可以改變電平狀態(tài)。
關(guān)鍵時序條件
起始條件:SCL 為高電平時,SDA 從高電平變?yōu)榈碗娖?→ 表示傳輸開始。
停止條件:SCL 為高電平時,SDA 從低電平變?yōu)楦唠娖?→ 表示傳輸結(jié)束。
空閑狀態(tài):SDA 與 SCL 均保持高電平 → 表示總線空閑。
2. 數(shù)據(jù)傳輸
字節(jié)傳輸
主機發(fā)送數(shù)據(jù)時,先發(fā)出起始信號,然后將 SDA 設(shè)為輸出模式,先發(fā)送最高位(MSB),依次發(fā)送 8 位數(shù)據(jù)。
發(fā)送完 8 位后,主機會將 SDA 切換為輸入模式,等待從機回復(fù) ACK(應(yīng)答) 或 NAK(非應(yīng)答),之后再發(fā)送下一個字節(jié)。
從機地址
I2C 總線上的每個設(shè)備都有固定地址,通常由芯片上的 A0、A1、A2 引腳配置。
地址字節(jié)包含:
7 位地址位(D7~D1)
1 位讀寫方向位(D0)
設(shè)備地址的高 4 位(D7~D4)通常由廠商固定為 1111,低 3 位(D3~D1)由 A2、A1、A0 引腳設(shè)置。
D0 = 0:寫操作
D0 = 1:讀操作
這就是常見地址如 0xA0、0xA1 的由來。

EEPROM設(shè)備地址
3. 讀 / 寫流程
① 寫操作流程
主機發(fā)送停止信號,避免總線忙碌導(dǎo)致寫入失敗。
主機發(fā)送總線復(fù)位信號,確保總線空閑。
主機發(fā)送起始信號,啟動寫操作。
主機發(fā)送從機地址 + 寫位(W/R=0),等待從機 ACK。
收到 ACK 后,主機連續(xù)寫入多個字節(jié),每寫完 1 字節(jié)等待從機 ACK。
收到最后一次 ACK 后,主機發(fā)送停止信號,釋放總線。
② 讀操作流程
主機發(fā)送停止信號,避免總線忙碌導(dǎo)致讀取失敗。
主機發(fā)送總線復(fù)位信號,確??偩€空閑。
主機發(fā)送起始信號,啟動讀操作。
主機發(fā)送從機地址 + 讀位(W/R=1),等待從機 ACK。
收到 ACK 后,主機連續(xù)讀取多個字節(jié),每讀完 1 字節(jié)向從機回復(fù) ACK。
讀完最后 1 字節(jié)并回復(fù) ACK 后,主機發(fā)送停止信號,釋放總線。
I2C 在嵌入式領(lǐng)域應(yīng)用廣泛,在各類電源、工控、消費電子設(shè)備中都十分常見。













評論