I2C總線被全球超過50個公司的1000+個ICs所使用,已然是一個世界標準.另外,I2C總線與多種不同的控制總線是兼容的,比如SMBus(系統(tǒng)管理總線),PMBus(電源管理總線),IPMI(智能平臺管理總線),DDC(顯示數(shù)據(jù)通道)以及ATCA(高級電信架構(gòu)).如果沒記錯的話,linux中的I2C框架是完全支持SMBus的.
要全面了解I2C,可以從《I2C-bus specification and user manual》看起.I2C最初是由Philips提出的,那么這文檔就是由NXP維護的.
我們接下來要了解I2C總線是如何工作的,在一個具體應(yīng)用中如何設(shè)計.I2C的數(shù)據(jù)傳輸,握手以及總線仲裁機制都需要了解.I2C總線在每種操作模式下的時序和電氣特性都需要了解,這里還是從嵌入式軟件工程師的角度著重了解時序特性.
I2C總線的特性:
在消費電子,通信以及工業(yè)電子中,看起來不相關(guān)的設(shè)計中有很多類似的地方.例如,基本上每個系統(tǒng)都包括:
2.通用的電路:LCD和LED驅(qū)動器,遠程IO口,RAM,EEPROM,RTC或者DACADC.
3.面向應(yīng)用的電路:比如收音機和視頻系統(tǒng)的數(shù)字調(diào)諧和信號處理電路,溫度傳感器和智能卡.
為了讓這些共同之處對于系統(tǒng)設(shè)計者和設(shè)備廠商都有用,也為了最大化硬件的有效性和電路的簡單性,Philips半導(dǎo)體開發(fā)了一個簡單的雙向2線的總線,實現(xiàn)了IC之間的有效控制.這個總線就被稱為I2C總線.所有兼容I2C總線的設(shè)備都包含一個片上的接口,允許它們直接通過I2C總線進行通信.這個設(shè)計解決了在設(shè)計數(shù)字控制電路時帶來的很多接口問題.
下面是I2C總線的一些特性:
1.只需要兩根線,一個串行數(shù)據(jù)線(SDA)額一個串行時鐘線(SCL).
2.可以通過軟件方式和一個唯一的地址來尋找到每一個連接到總線的設(shè)備,簡單的主從關(guān)系一直存在.主機可以作為主機發(fā)送器或者主機接收器.
3.它是真正的多主機總線,如果有兩個或多個主機初始化數(shù)據(jù)傳輸,可以通過沖突檢測和仲裁來防止數(shù)據(jù)被破壞.
4.串行的8位雙向數(shù)據(jù)傳輸在標準模式下達到100kb/s,快速模式下是400kb/s,超速模式下是3.4Mb/s.
5.串行的8位單向數(shù)據(jù)在快速模式下可以達到5Mb/s.
6.片上的濾波器可以保護數(shù)據(jù)完整性.
7.總線上連接的最大IC數(shù)量由總線最大的電容所限制.
系統(tǒng)設(shè)計者的好處:
由于I2C總線是個是一個標準的總線,不需要額外的接口.所以在系統(tǒng)升級或者修改時,可以簡單的換IC.
廠商的好處:
符合I2C總線的IC不僅幫助了設(shè)計者,同樣給設(shè)備廠商很多好處,因為:
1.I2C只有兩根線,所以IC的pin腳會少,PCB的面積會小,成本會降.
2.完整的I2C總線協(xié)議不需要地址譯碼器或其他邏輯電路.
這只是一些好處.另外,符合I2C總線的IC會增加系統(tǒng)設(shè)計的靈活性.IC很容易升級,比如需要一個更大的ROM,只需要選擇一個有更大ROM的微控制器就可以了.
IC設(shè)計者的好處:
微控制器的設(shè)計者經(jīng)常要考慮輸出pin腳.I2C協(xié)議允許在沒有單獨尋址信號和芯片使能信號的條件下各種外設(shè)的連接.另外,帶I2C接口的微控制器在市場上更受歡迎,因為有很多外設(shè)可以選.
I2c掃描
通過i2cdetect -l指令可以查看TX1上的I2C總線,從返回的結(jié)果來看TX1含有七個I2C總線。
ubuntu@tegra-ubuntu:/proc/device-tree$ i2cdetect -li2c-0 ? unknown ? ? ? ? Tegra I2C adapter ? ? ? ? ? ? ? ? ? ? ? N/Ai2c-1 ? unknown ? ? ? ? Tegra I2C adapter ? ? ? ? ? ? ? ? ? ? ? N/Ai2c-2 ? unknown ? ? ? ? Tegra I2C adapter ? ? ? ? ? ? ? ? ? ? ? N/Ai2c-3 ? unknown ? ? ? ? Tegra I2C adapter ? ? ? ? ? ? ? ? ? ? ? N/Ai2c-4 ? unknown ? ? ? ? Tegra I2C adapter ? ? ? ? ? ? ? ? ? ? ? N/Ai2c-5 ? unknown ? ? ? ? Tegra I2C adapter ? ? ? ? ? ? ? ? ? ? ? N/Ai2c-6 ? unknown ? ? ? ? Tegra I2C adapter ? ? ? ? ? ? ? ? ? ? ? N/A
I2C設(shè)備查詢
若總線上掛載I2C從設(shè)備,可通過i2cdetect掃描某個I2C總線上的所有設(shè)備。可通過控制臺輸入i2cdetect -y 2,結(jié)果如下所示。
ubuntu@tegra-ubuntu:/proc/device-tree$ sudo i2cdetect -y 20 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9 ?a ?b ?c ?d ?e ?f00: ? ? ? ? ?-- -- -- -- -- -- -- -- -- -- -- -- --10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --50: 50 -- -- -- -- -- -- 57 -- -- -- -- -- -- -- --60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --70: -- -- -- -- -- -- -- --
說明1:-y為一個可選參數(shù),如果有-y參數(shù)的存在則會有一個用戶交互過程,意思是希望用戶停止使用該I2C總線。如果寫入該參數(shù),則沒有這個交互過程,一般該參數(shù)在腳本中使用。
說明2:此處I2C總線共掛載兩個設(shè)備——PCF8574和AT24C04,從機地址0x50為board configure,從機地址0x57為AT24C04。
寄存器內(nèi)容導(dǎo)出
通過i2cdump指令可導(dǎo)出I2C設(shè)備中的所有寄存器內(nèi)容,例如輸入i2cdump -y 2 0x50,可獲得以下內(nèi)容:
ubuntu@tegra-ubuntu:/proc/device-tree$ sudo i2cdump -y 2 0x50No size specified (using byte-data access)0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9 ?a ?b ?c ?d ?e ?f ? ?0123456789abcdef00: 01 00 0d 00 84 08 e8 03 04 4a 00 00 00 00 00 00 ? ??.?.?????J......10: 00 00 35 02 36 39 39 2d 38 32 31 38 30 2d 31 30 ? ?..5?699-82180-1020: 30 30 2d 34 31 30 20 4a 2e 30 ff ff ff ff ff ff ? ?00-410 J.0......30: ff ff 35 2d 66 4b 04 00 36 2d 66 4b 04 00 00 00 ? ?..5-fK?.6-fK?...40: 00 00 00 00 37 2d 66 4b 04 00 30 33 32 33 32 31 ? ?....7-fK?.03232150: 36 31 33 30 35 36 35 ff ff ff ff ff ff ff ff ff ? ?6130565.........60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ? ?................70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ? ?................80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ? ?................90: ff ff ff ff ff ff 4e 56 43 42 1c 00 4d 31 00 00 ? ?......NVCB?.M1..a0: 35 2d 66 4b 04 00 36 2d 66 4b 04 00 37 2d 66 4b ? ?5-fK?.6-fK?.7-fKb0: 04 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ? ??...............c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ? ?................d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ? ?................e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ? ?................f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 96 ? ?...............?
i2cdump -y 2 0x50指令中,
-y????????代表取消用戶交互過程,直接執(zhí)行指令;
2? ? ?????代表I2C總線編號;
0x50????代表I2C設(shè)備從機地址,此處選擇配置芯片的高256字節(jié)內(nèi)容。
寄存器內(nèi)容寫入
如果向I2C設(shè)備中寫入某字節(jié),可輸入指令i2cset -y 2 0x50 0x00 0x13
-y? ??????代表曲線用戶交互過程,直接執(zhí)行指令
2? ? ?????代表I2C總線編號
0x50????代表I2C設(shè)備地址,此處選擇AT24C04的低256字節(jié)內(nèi)容
0x00? ? 代表存儲器地址
0x13? ? 代表存儲器地址中的具體內(nèi)容
寄存器內(nèi)容讀出
[plain]?view plain?copy
pi@raspberrypi:~$?i2cget?-y?2?0x50?0x00
0x13
如果從I2C從設(shè)備中讀出某字節(jié),可輸入執(zhí)行i2cget -y 2 0x50 0x00,可得到以下反饋結(jié)果
-y? ??????代表曲線用戶交互過程,直接執(zhí)行指令
2? ? ?????代表I2C總線編號
0x50????代表I2C設(shè)備地址,此處選擇AT24C04的低256字節(jié)內(nèi)容
0x00? ? 代表存儲器地址
?
評論
查看更多