i2c总线协议简介
文章目錄
- 1.簡介
- 2.I2C總線時序圖
- 2.1 起始位
- 2.2 停止位
- 2.3 數(shù)據(jù)傳輸
- 2.4 地址幀/讀寫位/ACK位
- 2.5 空閑狀態(tài)
- 2.6 應答信號
- 3.I2C寫時序
- 4.I2C讀時序
- 5.I2C的優(yōu)缺點
1.簡介
I2C 是很常見的一種總線協(xié)議, I2C 是 NXP 公司設計的, I2C 使用兩條線在主控制器和從機之間進行數(shù)據(jù)通信。一條是 SCL(串行時鐘線),另外一條是 SDA(串行數(shù)據(jù)線),由于不接上拉電阻,這兩個引腳為懸空狀態(tài),由于懸空狀態(tài)引腳的電平是無法確定的,所以這兩條數(shù)據(jù)線需要接上拉電阻,一般是4.7K,總線空閑的時候SCL 和 SDA都處于高電平。 I2C 總線標準模式下速度可以達到 100Kb/S,快速模式下可以達到 400Kb/S。 I2C 總線工作是按照一定的協(xié)議來運行的,I2C 是支持多從機的,也就是一個 I2C 控制器下可以掛多個 I2C 從設備,這些不同的 I2C從設備有不同的器件地址,這樣 I2C 主控制器就可以通過 I2C 設備的器件地址訪問指定的 I2C設備 了,一個 I2C 總線連接多個 I2C 設備,如圖
2.I2C總線時序圖
2.1 起始位
I2C開始通信的標志,主機通過這個標志告訴從機要開始進行通信了,當SCL為高電平,SDA出現(xiàn)下將沿時表示起始位
2.2 停止位
I2C通信結束的標志,當SCL為高電平,SDA出現(xiàn)上升沿時表示停止位
2.3 數(shù)據(jù)傳輸
I2C數(shù)據(jù)總線傳輸要保證在SCL為高電平時,SDA數(shù)據(jù)穩(wěn)定,所以SDA上數(shù)據(jù)變化只能在SCL為低電平時
2.4 地址幀/讀寫位/ACK位
地址幀:這是一個 8 位的數(shù)據(jù),其中高 7 位是設備地址,最后 1 位是讀寫位,為1 的話表示這是一個讀操作,為 0 的話表示這是一個寫操作
讀/寫位:0:低電平,主設備向從設備寫數(shù)據(jù),1:高電平從機讀數(shù)據(jù)
ACK:消息的每一個幀都有一個確認位,如果設備接收到了地址幀或者數(shù)據(jù)幀,都會給發(fā)送設備返回一個ACK
2.5 空閑狀態(tài)
當IIC總線的數(shù)據(jù)線SDA和時鐘線SCL兩條信號線同時處于高電平時,規(guī)定為總線的空閑狀態(tài)。此時各個器件的輸出級場效應管均處在截止狀態(tài),即釋放總線,由兩條信號線各自的上拉電阻把電平拉高
2.6 應答信號
發(fā)送器每發(fā)送一個字節(jié)(8個bit),就在時鐘脈沖9期間釋放數(shù)據(jù)線,由接收器反饋一個應答信號。
應答信號為低電平時,規(guī)定為有效應答位(ACK,簡稱應答位),表示接收器已經(jīng)成功地接收了該字節(jié);
應答信號為高電平時,規(guī)定為非應答位(NACK),一般表示接收器接收該字節(jié)沒有成功
接收器在第9個時鐘脈沖之前的低電平期間將數(shù)據(jù)線SDA拉低,并且確保在該時鐘的高電平期間為穩(wěn)定的低電平,發(fā)送一個ACK信號, 如果接收器是主機端,則在它收到最后一個字節(jié)后,發(fā)送一個NACK信號,以通知被控發(fā)送器結束數(shù)據(jù)發(fā)送,并釋放數(shù)據(jù)線SDA,以便主機端發(fā)送一個停止信號P
3.I2C寫時序
主機向從機寫,紅色部分表示主機發(fā)送,藍色部分表示從機發(fā)送。A表示應答,NA表示非應答(高電平)。S表示起始信號,P表示終止信號
1.開始信號:在SCL從高電平切換為低電平之前,主設備通過將SDA從高電平切換到低電平,啟動信號與停止信號始終是由主設備控制產(chǎn)生的
2.主設備向每個從設備發(fā)送要與之通信的從設備的7位或10位地址,通過發(fā)送具體的設備地址來決定要訪問哪個I2C設備,這是一個8位的數(shù)據(jù),其中高8位是設備地址,最后1位是讀寫位,1表示讀操作,0表示寫操作
3.每一個從設備會根據(jù)主設備發(fā)過來的地址與自身的地址做比較,如果地址匹配,那么從設備會將SDA拉低來返回ACK應答信號,地址不匹配時,從設備會將SDA拉高,在從設備沒有將SDA拉低會將Master視為超時,將放棄數(shù)據(jù)傳送,發(fā)送“Stop”
4.重新發(fā)送開始信號
5.主機發(fā)送要寫入的叢機的寄存器地址
6.從機發(fā)送ACK信號
7.發(fā)送要寫入寄存器的數(shù)據(jù)幀,傳輸完每個數(shù)據(jù)幀后,即8位數(shù)據(jù),主機將SDA拉高,等待從機將SDA拉低,即返回ACK,以確認已成功接收到該幀
9.結束信號:主設備將SCL切換為高電平,再將SDA切換為高電平,從而向從設備發(fā)送停止信號
4.I2C讀時序
讀時序主要分為四個大步驟:1.發(fā)送設備地址。2.發(fā)送要讀取的寄存器值,3.重新發(fā)送設備地址,4.I2C 從設備輸出要
讀取的寄存器值
1.主機發(fā)送起始信號
2.主機發(fā)送要讀寫的從設備地址
3.讀寫控制位,因為是向 I2C 從設備發(fā)送數(shù)據(jù),因此是寫信號
4.從機發(fā)送 ACK 應答信號
5.重新發(fā)送start信號
6.主機發(fā)送要讀取的寄存器地址
7.從機發(fā)送的 ACK 應答信號
8.重新發(fā)送 START 信號
9.重新發(fā)送要讀取的 I2C 從設備地址
10.讀寫控制位,這里是讀信號,表示接下來是從 I2C 從設備里面讀取數(shù)據(jù)
11.從機發(fā)送的 ACK 應答信號
12.從 I2C 器件里面讀取數(shù)據(jù)
13.在讀到最后8位數(shù)據(jù)時,主機要將SDA置1,主機發(fā)出 NO ACK 信號,表示讀取完成,不需要從機再發(fā)送 ACK 信號了
14.主機發(fā)出 STOP 信號,停止 I2C 通信
注意:SCL一直由主機端控制,SDA依照數(shù)據(jù)傳送的方向,讀數(shù)據(jù)時由從機控制SDA,寫數(shù)據(jù)時由主機控制SDA。當8位數(shù)據(jù)傳送完畢之后,應答位或者否應答位的SDA控制權與數(shù)據(jù)位傳送時相反
5.I2C的優(yōu)缺點
優(yōu)點:僅使用兩根信號線,支持多個主設備和多個從設備,ACK / NACK位用于確認每個幀都已成功傳輸,硬件沒有UART復雜
缺點:數(shù)據(jù)傳輸速率比SPI慢,數(shù)據(jù)幀的大小限制為8位,硬件設計比SPI復雜
總結
- 上一篇: layout_gravity 和 gra
- 下一篇: [转载]《STL源码剖析》阅读笔记之 迭