linux i2c驱动协议
1、I2C
I2C Bus(Inter-Integrated Circuit Bus)最早是由Philips半導(dǎo)體(現(xiàn)被NXP收購(gòu))開(kāi)發(fā)的兩線時(shí)串行總線,常用于微控制器與外設(shè)之間的連接。
2、硬件連接
I2C僅需兩根線就可以支持一主多從或者多主連接,I2C使用兩個(gè)雙向開(kāi)漏線,配合上拉電阻進(jìn)行連接,上拉電阻阻值大小有最大值和最小值的限制。
3、硬件拉低(Open-Drain Pulling Low)
????????下圖代表了總線電平拉低過(guò)程,當(dāng)總線要傳輸?shù)碗娖?時(shí),Logic會(huì)控制FET使其導(dǎo)通VBUS總線連接到地,將總線拉低,注意在快速模式下最大的灌電流不超過(guò)3mA,這限制了上拉電阻的最小值。
?
4、硬件拉高(Open-Drain Releasing Bus)
????????下圖代表了總線電平高電平過(guò)程,當(dāng)總線要傳輸高電平1時(shí),Logic會(huì)控制FET使其關(guān)斷VBUS總線上拉到電源,將總線拉高。
5、軟件通訊協(xié)議
????????I2C是串行傳輸總線,按照下面格式進(jìn)行一位一位傳輸,協(xié)議傳輸如下:
6、總線速度
雙向傳輸總線:
單向傳輸總線:
7、起始和停止條件及重復(fù)起始條件
起始和終止條件都是由主機(jī)(master)發(fā)起產(chǎn)生。總線在起始條件之后處于忙碌狀態(tài),在停止條件之后又處于空閑狀態(tài)。
8、字節(jié)格式
????????SDA數(shù)據(jù)線上的每個(gè)字節(jié)必須是8位,每次傳輸?shù)淖止?jié)數(shù)量沒(méi)有限制。每個(gè)字節(jié)后必須跟一個(gè)響應(yīng)位(ACK)。首先傳輸?shù)臄?shù)據(jù)是最高位(MSB),SDA上的數(shù)據(jù)必須在SCL高電平周期時(shí)保持穩(wěn)定,數(shù)據(jù)的高低電平翻轉(zhuǎn)變化發(fā)生在SCL低電平時(shí)期。
?
9、響應(yīng)ACK和非響應(yīng)NACK
????????每個(gè)字節(jié)傳輸必須帶響應(yīng)位,相關(guān)的響應(yīng)時(shí)鐘也由主機(jī)產(chǎn)生,在響應(yīng)的時(shí)鐘脈沖期間(第9個(gè)時(shí)鐘周期),發(fā)送端釋放SDA線,接收端把SDA拉低。以上圖傳輸101010101為例,SCL第9位時(shí)鐘高電平信號(hào)期間,SDA拉低其代表了有ACK響應(yīng)位。
當(dāng)在SCL第9位時(shí)鐘高電平信號(hào)期間,SDA仍然保持高電平,這種情況定義為NACK非響應(yīng)位。這種情況下,主機(jī)可以直接產(chǎn)生STOP條件終止以后的傳輸或者繼續(xù)重新START開(kāi)始一個(gè)新的傳輸。以下情況會(huì)導(dǎo)致出現(xiàn)NACK位:
10、7-bit地址格式和讀寫(xiě)位
一個(gè)7-bit的地址是從最高位(MSB)開(kāi)始發(fā)送的,這個(gè)地址后面會(huì)緊跟1-bit(R/W)的操作符,1表示讀操作,0表示寫(xiě)操作。接下來(lái)的一個(gè)bit是NACK/ACK,當(dāng)這個(gè)幀中前面8 bit發(fā)送完后,接收端的設(shè)備獲得SDA控制權(quán),此時(shí)接收設(shè)備應(yīng)該在第9個(gè)時(shí)鐘脈沖之前回復(fù)一個(gè)ACK(將SDA拉低)以表示接收正常,如果接收設(shè)備沒(méi)有將SDA拉低,則說(shuō)明接收設(shè)備可能沒(méi)有收到數(shù)據(jù)(如尋址的設(shè)備不存在或設(shè)備忙)或無(wú)法解析收到的消息,如果是這樣,則由master來(lái)決定如何處理(stop或repeated start condition)。
?
總結(jié)
以上是生活随笔為你收集整理的linux i2c驱动协议的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php正则表达式如何找到匹配模式中的最后
- 下一篇: UnixLinux技术文章目录(2015