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