聊聊通訊協(xié)議 I2C 子系統(tǒng)
I2C Transfer
Definition of timing
想要深入探討 I2C 協(xié)議,必須深刻理解各種時間的定義(F/S-mode)
標識符 | 定義 |
tf | 信號下降時間 |
tr | 信號上升時間 |
tLOW | 信號低電平時間 |
tHIGH | 信號高電平時間 |
tHD;DAT | 數(shù)據(jù)保持時間 |
tSU;DAT | 數(shù)據(jù)建立時間 |
tSP | 輸入濾波器必須抑制的毛刺脈寬 |
tBUF | 啟動和停止條件的空閑時間 |
tHD;STA | 重復(fù)起始條件的保持時間 |
tSU;STA | 重復(fù)起始條件的建立時間 |
tSU;STO | 停止條件建立時間 |
Sr 重新啟動,S 啟動,P 停止。
note:SCL 高電平的時候,SDA 是高就是 1,是低就是 0。SCL 低電平期間,SDA 變換數(shù)據(jù)。
note:起始條件很容易理解,重復(fù)起始條件就是沒有STOP,再來了一個 START,然后發(fā)送另外一個從設(shè)備 ID,訪問其他從設(shè)備。
定義術(shù)語
1.數(shù)據(jù)有效性
在 SCL 高電平期間,SDA 必須穩(wěn)定,所以一般情況下,SCL 高電平寬度小,SDA 高電平寬度大,用示波器看也是這樣的。
2.起始條件和停止條件
起始條件:SCL 高電平時,SDA 由高變低。
停止條件:SCL 高電平時,SDA 由低變高。
一般每傳輸一個字節(jié)(8 bit),就會重新開始。SDA 在 SCL 是低電平期間變換數(shù)據(jù),不可以在 SCL 高電平期間變換數(shù)據(jù),否則會認為是 起始和停止條件。
- 傳輸長度必須是一個字節(jié)(8 bit)
- 每次傳輸?shù)淖止?jié)不受限制
- 數(shù)據(jù)必須以 MSB 開頭進行傳輸,也就是先傳輸最高位
- 從機可以將時鐘線 SCL 保持在低位,迫使主機進入等待狀態(tài)。
3.ACK or NACK
每次傳輸完一個字節(jié)以后,從設(shè)備要進行一個回應(yīng),回應(yīng) ACK 或者 NACK。
ACK :在傳輸 8 bit 以后,在第九個 bit ,SCL 高電平,如果 SDA 是低電平,說明回應(yīng)了 ACK。
NACK:在傳輸 8 bit 以后,在第九個 bit ,SCL 高電平,如果 SDA 是高電平,說明回應(yīng)了 NACK。
4.write data
5.read data
6.復(fù)合格式
7.I2C Transfer Regulation
- 以 START 條件開始
- 以 STOP 條件結(jié)束
- 傳輸?shù)牡谝粋€字節(jié)為 7bit 從機地址 + 1bit 讀寫位
- 每個總線上的設(shè)備都會比較 STRAT 信號后面的 7bit 地址與自己的地址是否匹配
- 每個 byte(8 bits) 后面都會有 ACK 或者 NACK
- 在 START 信號或者 repeated START 信號后,從機必須重置自己的總線邏輯
- 一個 START 后面緊跟著一個 STOP 信號,是非法格式
- 主機 master 可以不產(chǎn)生 STOP 信號,而是直接產(chǎn)生一個 repeated START 信號+另外一個設(shè)備地址,直接開始訪問另外一個設(shè)備
8.10-bit addressing
解析如下:
A9-A0 表示 10bits 地址
9、示波器波形圖
10.補充
I2C 不支持從設(shè)備在 SCL 和 SDA 總線上發(fā)起一個中斷,通知主設(shè)備來讀數(shù)據(jù)。有中斷需求的從設(shè)備需要額外接一根中斷線,通知主控數(shù)據(jù)已經(jīng)準備好,讓主控發(fā)起讀數(shù)據(jù)的操作。