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