I2C總線被全球超過50個(gè)公司的1000+個(gè)ICs所使用,已然是一個(gè)世界標(biāo)準(zhǔn).另外,I2C總線與多種不同的控制總線是兼容的,比如SMBus(系統(tǒng)管理總線),PMBus(電源管理總線),IPMI(智能平臺(tái)管理總線),DDC(顯示數(shù)據(jù)通道)以及ATCA(高級(jí)電信架構(gòu)).如果沒記錯(cuò)的話,linux中的I2C框架是完全支持SMBus的.
要全面了解I2C,可以從《I2C-bus specification and user manual》看起.I2C最初是由Philips提出的,那么這文檔就是由NXP維護(hù)的.
我們接下來要了解I2C總線是如何工作的,在一個(gè)具體應(yīng)用中如何設(shè)計(jì).I2C的數(shù)據(jù)傳輸,握手以及總線仲裁機(jī)制都需要了解.I2C總線在每種操作模式下的時(shí)序和電氣特性都需要了解,這里還是從嵌入式軟件工程師的角度著重了解時(shí)序特性.
I2C總線的特性:
在消費(fèi)電子,通信以及工業(yè)電子中,看起來不相關(guān)的設(shè)計(jì)中有很多類似的地方.例如,基本上每個(gè)系統(tǒng)都包括:
2.通用的電路:LCD和LED驅(qū)動(dòng)器,遠(yuǎn)程IO口,RAM,EEPROM,RTC或者DACADC.
3.面向應(yīng)用的電路:比如收音機(jī)和視頻系統(tǒng)的數(shù)字調(diào)諧和信號(hào)處理電路,溫度傳感器和智能卡.
為了讓這些共同之處對(duì)于系統(tǒng)設(shè)計(jì)者和設(shè)備廠商都有用,也為了最大化硬件的有效性和電路的簡(jiǎn)單性,Philips半導(dǎo)體開發(fā)了一個(gè)簡(jiǎn)單的雙向2線的總線,實(shí)現(xiàn)了IC之間的有效控制.這個(gè)總線就被稱為I2C總線.所有兼容I2C總線的設(shè)備都包含一個(gè)片上的接口,允許它們直接通過I2C總線進(jìn)行通信.這個(gè)設(shè)計(jì)解決了在設(shè)計(jì)數(shù)字控制電路時(shí)帶來的很多接口問題.
下面是I2C總線的一些特性:
1.只需要兩根線,一個(gè)串行數(shù)據(jù)線(SDA)額一個(gè)串行時(shí)鐘線(SCL).
2.可以通過軟件方式和一個(gè)唯一的地址來尋找到每一個(gè)連接到總線的設(shè)備,簡(jiǎn)單的主從關(guān)系一直存在.主機(jī)可以作為主機(jī)發(fā)送器或者主機(jī)接收器.
3.它是真正的多主機(jī)總線,如果有兩個(gè)或多個(gè)主機(jī)初始化數(shù)據(jù)傳輸,可以通過沖突檢測(cè)和仲裁來防止數(shù)據(jù)被破壞.
4.串行的8位雙向數(shù)據(jù)傳輸在標(biāo)準(zhǔn)模式下達(dá)到100kb/s,快速模式下是400kb/s,超速模式下是3.4Mb/s.
5.串行的8位單向數(shù)據(jù)在快速模式下可以達(dá)到5Mb/s.
6.片上的濾波器可以保護(hù)數(shù)據(jù)完整性.
7.總線上連接的最大IC數(shù)量由總線最大的電容所限制.
系統(tǒng)設(shè)計(jì)者的好處:
由于I2C總線是個(gè)是一個(gè)標(biāo)準(zhǔn)的總線,不需要額外的接口.所以在系統(tǒng)升級(jí)或者修改時(shí),可以簡(jiǎn)單的換IC.
廠商的好處:
符合I2C總線的IC不僅幫助了設(shè)計(jì)者,同樣給設(shè)備廠商很多好處,因?yàn)?
1.I2C只有兩根線,所以IC的pin腳會(huì)少,PCB的面積會(huì)小,成本會(huì)降.
2.完整的I2C總線協(xié)議不需要地址譯碼器或其他邏輯電路.
這只是一些好處.另外,符合I2C總線的IC會(huì)增加系統(tǒng)設(shè)計(jì)的靈活性.IC很容易升級(jí),比如需要一個(gè)更大的ROM,只需要選擇一個(gè)有更大ROM的微控制器就可以了.
IC設(shè)計(jì)者的好處:
微控制器的設(shè)計(jì)者經(jīng)常要考慮輸出pin腳.I2C協(xié)議允許在沒有單獨(dú)尋址信號(hào)和芯片使能信號(hào)的條件下各種外設(shè)的連接.另外,帶I2C接口的微控制器在市場(chǎng)上更受歡迎,因?yàn)橛泻芏嗤庠O(shè)可以選.
I2c掃描
通過i2cdetect -l指令可以查看TX1上的I2C總線,從返回的結(jié)果來看TX1含有七個(gè)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掃描某個(gè)I2C總線上的所有設(shè)備??赏ㄟ^控制臺(tái)輸入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為一個(gè)可選參數(shù),如果有-y參數(shù)的存在則會(huì)有一個(gè)用戶交互過程,意思是希望用戶停止使用該I2C總線。如果寫入該參數(shù),則沒有這個(gè)交互過程,一般該參數(shù)在腳本中使用。
說明2:此處I2C總線共掛載兩個(gè)設(shè)備——PCF8574和AT24C04,從機(jī)地址0x50為board configure,從機(jī)地址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總線編號(hào);
0x50????代表I2C設(shè)備從機(jī)地址,此處選擇配置芯片的高256字節(jié)內(nèi)容。
寄存器內(nèi)容寫入
如果向I2C設(shè)備中寫入某字節(jié),可輸入指令i2cset -y 2 0x50 0x00 0x13
-y? ??????代表曲線用戶交互過程,直接執(zhí)行指令
2? ? ?????代表I2C總線編號(hào)
0x50????代表I2C設(shè)備地址,此處選擇AT24C04的低256字節(jié)內(nèi)容
0x00? ? 代表存儲(chǔ)器地址
0x13? ? 代表存儲(chǔ)器地址中的具體內(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總線編號(hào)
0x50????代表I2C設(shè)備地址,此處選擇AT24C04的低256字節(jié)內(nèi)容
0x00? ? 代表存儲(chǔ)器地址
?
評(píng)論