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