I2C從驅動到應用(上篇)

I2C(Intel-Integrated Circuit)總線是由Phliphs公司開發的一種兩線式串行總線,用於鏈接外圍設備和微控制器。應用很是普遍,能夠用在鏈接E2ROM來保存各類接口卡、顯示器上的ROM信息 ,也能夠用在BMC上來鏈接各類溫度、電壓、電流等傳感器,還能夠用來鏈接內存條DIMM上,用來獲取內存條的信息。Smbus兼容i2c,雖然信號引腳定義上有出入,但從軟件的角度上基本上能夠視做I2C,I2C的應用幾乎不要任何修改就能夠運行在Smbus上。ide


硬件上I2C只有兩個信號線,數據線SDA和時鐘SCL,經過二者不一樣的相位組合表示不一樣的幀,起始幀、地址數據幀、結束幀構成一次I2C傳輸,具體的時序圖請見下面的示意圖:
 wKiom1Ykx5ayBW4CAACdvCqar5c251.jpgui

由上面的圖能夠看到,當SCL電平爲高時,SDA的降低沿表示一次I2C傳輸的開始S,SDA的上升沿表示一次I2C傳輸的結束P。在SCL每一個時鐘週期的高電平時,按序採樣SDA的值,依次獲得B1/B2..../B3,做爲鏈路上傳輸的原始數據。鏈路上傳輸的原始數據能夠分爲三大類:1.邏輯地址;2邏輯數據;3.確認字符。其中邏輯地址是由發起I2C傳輸的設備指定的,邏輯地址的最低一位,指定了數據的傳輸方向:爲1表示數據從I2C設備上讀回到CPU,爲0表示數據從CPU寫到i2C設備。邏輯數據能夠是CPU發送到I2c設備上的數據,也多是從I2C設備讀回的數據。確認字符表示I2C從設備返回給主設備的確認幀。 一次I2C傳輸能夠完成讀寫一個或多個byte,這就省去了每傳輸一個byte都須要從新確認的時間,連續讀寫多個byte的時序圖以下:
 wKioL1Ykx9Kg_p7NAAC6A_7TBII672.jpg除了上述的這中簡單讀寫的方式外,還有下面的組合傳輸訪問方式:
 S Addr Rd [A] [Data] NA S Addr Wr [A] Data [A] P
上面各個符號的定義以下:
S     (1 bit) : Start bit
P     (1 bit) : Stop bit
Rd/Wr (1 bit) : Read/Write bit. Rd equals 1, Wr equals 0.
A, NA (1 bit) : Accept and reverse accept bit.
Addr  (7 bits): I2C 7 bit address. Note that this can be expanded as usual to
                get a 10 bit I2C address.
Comm  (8 bits): Command byte, a data byte which often selects a register on
                the device.
Data  (8 bits): A plain data byte. Sometimes, I write DataLow, DataHigh
                for 16 bit data.
Count (8 bits): A data byte containing the length of a block operation.
[..]: Data sent by I2C device, as opposed to data sent by the host adapter.this

理解了i2c基本時序後,咱們就把握了i2c控制器的工做原理。基於這點,在須要鏈接i2c設備但主機上又沒有i2c控制器的狀況下,能夠用兩根GPIO線分別來模擬SDA和SCL,只要聽從上面的i2c時序,就能模擬出i2c控制器的行爲,進而控制i2c設備。編碼


根據上面的時序圖,咱們還能夠看到i2c的地址位有7個bit(bit7~bit1),最低一位(bit0)是讀寫位。前面7個bit 來自i2c設備的物理地址。物理地址的bit7~bit4表明設備類型,由設備廠家固定好,不一樣類型的編碼對應不一樣的group,統一由http://dlnware.com/theory/I2C-Address-Allocation-Table約定, 例以下面的Group9 和 Group10:
 wKiom1Ykx7_yllyRAADXSPCnyWI617.jpgblog

物理地址的bit3~bit1是地址線字段,對應i2c的SAD,由硬件經過上下拉電阻固定,用來區別鏈接到同一個i2c控制器上的不一樣設備。因爲地址線字段只有3個bit,因此同一個 i2c控制器上最多隻能鏈接8個i2c設備。以BIOS內存自檢時讀取SPD的i2c控制器爲例,每一個DIMM都連到了CPU的i2c控制器上去了,以下圖所示,不一樣的DIMM上的SA0/SA1/SA2信號上下拉不同:接口

wKiom1YkyHPz0k6YAAEerpkCrYo824.jpg 
由於DIMM屬於group10,所以上面的兩個DIMM對應的i2c地址分別是:0xa0,0xa2。
若是須要鏈接更多的設備,要用到i2c switch。好比在須要檢測多個溫度傳感器、電壓傳感器的BMC裏面,就常常用到i2c switch。以下面圖所示,須要用i2c switch拓展i2c上掛載的設備:ip

 

wKioL1YkyBySpYINAACckZDOvqU636.jpg和i2c控制器直接訪問i2c設備相比,跨過i2c橋訪問i2c設備多的一個步驟就是:在start condition以後,發送橋後面的一個從設備的地址和待寫到從設備控制寄存器的內容到i2c bus上去。從設備的地址須要根據實際使用的i2c switch芯片來肯定,若是swtich芯片是PCA9543A,它後面能夠擴展出兩路i2c通道,從設備的地址格式以下:
 wKiom1YkyAbhD30JAAA8JJb9Rjk158.jpg內存

其中A0/A1就是來選擇使能哪一路通道的。而控制寄存器中的內容須要參考芯片手冊來肯定。好比對PCA9543A,實現的定義以下:開發

wKioL1YkyEXgpmU2AADhifP1XFM780.jpg

一旦完成上述兩步操做,橋片後的設備和i2c控制器之間的鏈路就創建起來了,用戶能夠像直接訪問i2c設備同樣訪問橋片後的設備。固然,不一樣的i2c設備的訪問方式因爲設備類型、廠家實現會略有不一樣。有的i2c設備要求把讀寫的起始地址發送到i2c總線上去,並且這個偏移地址只能佔用一個byte,此時若是它的存儲容量超過了2**8=256byte,那麼這個設備可能有多個i2c 從設備地址。固然,若是偏移地址容許兩個byte,只要訪問的地址偏移不超過2**16byte便可。此外,因爲芯片實現的差別,有的i2c設備對連續讀寫的起始地址限制在芯片內頁或扇區的起始地址。但總的說來,只要掌握了i2c的基本原理,同時可以注意到具體板卡和芯片的差別,咱們就可以實現對i2c設備的控制和管理。get

相關文章
相關標籤/搜索