S5PV210开发 -- I2C 你知道多少?(三)
如需轉載請注明出處:https://blog.csdn.net/qq_29350001/article/details/78835639
I2C部分已經接近尾聲了,接下來我們回過頭來看一下剩下的一些小知識點。如 I2C 仲裁、Linux I2C 工具查看配置I2C設備、什么是漏極開路等等。
一、動手畫出I2C時序圖
看了那么多東西,都記不牢的或者理解不透。只有親自畫出時序圖,你才能明白的。
就畫 MT9P031 寫操作,設備寫地址為0xBA,片內寄存器地址為0x09,發送數據 0000 0010 和 1000 0100
、
我只畫了起始位、設備寫地址為0xBA、ACK 這幾部分,詳細的看下圖。
?
當你畫的時候,你就會注意到I2C協議的一些知識了:
1、SCL 為低電平,SDA 可以進行修改;
2、SCL 為高電平,SDA 保持穩定不變;
3、SCL 為高電平時,如果 SDA 有變動則視為特殊狀況:啟動(啟始,SDA 由高轉為低)或停止(結束,SDA 由低轉為高)。?
上面三條定義剛好把SCL和SDA三條訊號線會發生的訊號全部都包括了。
4、除了Start(啟始)和Stop(結束)二個訊號之外,所有的信號傳輸固定8 bits(1 字節)為一組,這一個字節可能是一個設備地址,寄存器地址或寫入或讀取從機的數據,數據首先傳輸最高有效位(MSB)。
5、發送端在每組(8位)信號發出后,需讀取接收端所回應的一個 ACK 位(信號為低)或 NACK 位(信號為高)。 (注意:發送端不一定是master。例如:讀取資料時,發送端為slave)。
6、設備地址讀/寫位,0 表示主設備向從設備寫數據,1 表示主設備向從設備讀數據。
以AT24C02存儲器為例:
通過芯片手冊,得到設備地址相關的內容:
? 1010A2A1A0R/W:設備地址不包含讀寫位,右移1位,高位補0?=》?01010A2A1A0(A2A1A0都接地)=01010000=》AT24C02在開發板上的設備地址為0x50
? 讀設備地址 = 設備地址 << 1 | 讀寫位(1) = 0xA1
? 寫設備地址 = 設備地址 << 1 | 讀寫位(0) = 0xA0
二、I2C仲裁機制
?
我們曉得 I2C 允許多個主設備和多個從設備。如果兩個或兩個以上的主設備同時向總線上發送啟動信號并開始傳送數據,這樣就形成了沖突。要解決這種沖突,就要進行仲裁的判決,這就是 I2C 總線上的仲裁。
?
I2C總線上的仲裁分兩部分:SCL線的同步和SDA線的仲裁。
?
(1)同步
所有主機在 SCL 線上產生它們自己的時鐘來傳輸 I2C 總線上的報文。數據只在時鐘的高電平周期有效。因此,需要一個確定的時鐘進行逐位仲裁。
時鐘同步通過?線“與”(Wired-AND)連接 I2C 接口到 SCL 線來執行。這就是說: SCL 線的高到低切換會使器件開始數它們的低電平周期,而且一旦器件的時鐘變低電平,它會使 SCL 線保持這種狀態直到到達時鐘的高電平。但是,如果另一個時鐘仍處于低電平周期,這個時鐘的低到高切換不會改變 SCL 線的狀態。因此,SCL 線被有最長低電平周期的器件保持低電平。此時,低電平周期短的器件會進入高電平的等待狀態。
當所有有關的器件數完了它們的低電平周期后,時鐘線被釋放并變成高電平。之后,器件時鐘和 SCL 線的狀態沒有差別。而且所有器件會開始數它們的高電平周期。首先完成高電平周期的器件會再次將 SCL 線拉低。
這樣,產生的同步 SCL 時鐘的低電平周期由低電平時鐘周期最長的器件決定,而高電平周期由高電平時鐘周期最短的器件決定。
(2)仲裁
主機只能在總線空閑的時侯啟動傳輸。兩個或多個主機可能在起始條件的最小持續時間(tHD;STA)內產生一個起始條件,結果在總線上產生一個規定的起始條件。
當 SCL 線是高電平時,仲裁在 SDA 線發生;這樣,在其他主機發送低電平時,發送高電平的主機將斷開它的數據輸出級,因為總線上的電平與它自己的電平不相同。
仲裁可以持續多位。它的第一個階段是比較地址位。如果每個主機都嘗試尋址相同的器件,仲裁會繼續比較數據位(如果是主機-發送器)或者比較響應位(如果是主機-接收器)。因為 I2C 總線的地址和數據信息由贏得仲裁的主機決定,在仲裁過程中不會丟失信息。丟失仲裁的主機可以產生時鐘脈沖直到丟失仲裁的該字節末尾。
由于 Hs 模式的主機有一個唯一的 8 位主機碼,因此一般在第一個字節就可以結束仲裁。如果主機也結合了從機功能 而且在尋址階段丟失仲裁,它很可能就是贏得仲裁的主機在尋址的器件。因此,丟失仲裁的主機必須立即切換到它的從機模式。
下圖顯示了兩個主機的仲裁過程。當然,可能包含更多的內容(由連接到總線的主機數量決定)。此時,產生 DATA1 的主機的內部數據電平與 SDA 線的實際電平有一些差別,如果關斷數據輸出,這就意味著總線連接了一個高輸出電平。這不會影響由贏得仲裁的主機初始化的數據傳輸。
由于 I2C 總線的控制只由地址或主機碼以及競爭主機發送的數據決定,沒有中央主機,總線也沒有任何定制的優先權。
必須特別注意的是:在串行傳輸時,當重復起始條件或停止條件發送到 I2C 總線的時侯,仲裁過程仍在進行。如果可能產生這樣的情況,有關的主機必須在幀格式相同位置發送這個重復起始條件或停止條件。也就是說,仲裁不能在下面的情況之間進行:
1、重復起始條件和數據位
2、停止條件和數據位
3、重復起始條件和停止條件
4、從機不被卷入仲裁過程
?
I2C 仲裁機制,理解了?線“與”(Wired-AND),就一目了然了。
或者再簡單說,它遵循“低電平優先”的原則,即誰先發送低電平誰就會掌握對總線的控制權。
三、Linux I2C 工具查看配置I2C設備
(1)下載安裝
參看:i2c-tools -- 維基百科
i2c-tools軟件包包含一組用于Linux的異構I2C工具:
總線探測工具,芯片翻轉器,寄存器級SMBus訪問助手,EEPROM解碼腳本,EEPROM編程工具以及用于SMBus訪問的python模塊。 只要內核包含I2C支持,所有版本的Linux都受支持。
下載:i2c-tools 下載
修改 Makefile ,編譯器改為交叉編譯:
?
COMPILE_PREFIX := /home/tarena/esd1503/arm-2009q3/bin/CC := $(COMPILE_PREFIX)arm-none-linux-gnueabi-gccAR := $(COMPILE_PREFIX)arm-none-linux-gnueabi-ar生成?i2cdetect, i2cdump, i2cget, i2cset,i2ctransfer
使用 file 指令檢查一下:
?
?
# file i2cdetect i2cdetect: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped(2)使用
使用 tftp 將?i2cdetect, i2cdump, i2cget, i2cset,i2ctransfer 拷貝到開發板中。
然后執行 i2cdetect,出現錯誤:
?
# ./i2cdetect -l ./i2cdetect: error while loading shared libraries: libi2c.so.0: cannot open shared object file: No such file or directory缺少共享庫?libi2c.so.0,將i2c-tools-4.0/lib/libi2c.so.0.1.0 拷貝到開發板 lib 目錄下,然后增加權限 chmod 777?libi2c.so.0.1.0,然后重命名為?libi2c.so.0。
?
PS:本來想拷貝libi2c.so.0的,但是它和libi2c.so.0.1.0是硬鏈接關系,拷貝出現錯誤。
?
# stat libi2c.so.0文件:"libi2c.so.0" -> "libi2c.so.0.1.0"大小:15 塊:0 IO 塊:4096 符號鏈接 設備:801h/2049d Inode:2128654 硬鏈接:1 權限:(0777/lrwxrwxrwx) Uid:( 0/ root) Gid:( 0/ root) 最近訪問:2017-12-20 10:31:47.155123897 +0800 最近更改:2017-12-20 10:24:43.174893417 +0800 最近改動:2017-12-20 10:24:43.174893417 +0800 創建時間:-然后直接用?libi2c.so.0.1.0 也不行,需要重命名為?libi2c.so.0
?
到此可以在開發板上執行 i2cdetect:
]# ./i2cdetect -l i2c-0 i2c s3c2410-i2c I2C adapter i2c-1 i2c s3c2410-i2c I2C adapter i2c-2 i2c s3c2410-i2c I2C adapter(3)詳解指令
現在挨個來看一下這些指令都該如何使用。
參看:Configuring_Aptina_MT9P031_using_i2c-tools
因為我購買的 S5PV210 開發板沒有 AT24C02 和 S3C2410 芯片,所以沒法測試。為了測試,找出塵封了好久的 DM368 開發板,主要看MT9P031。
1、i2cdetect 指令
查看它的選項:
# i2cdetect Error: No i2c-bus specified! Usage: i2cdetect [-y] [-a] [-q|-r] I2CBUS [FIRST LAST]i2cdetect -F I2CBUSi2cdetect -lI2CBUS is an integer or an I2C bus nameIf provided, FIRST and LAST limit the probing range.?
首先在你的主板的終端中運行 i2cdetect -l 命令:
# i2cdetect -l i2c-1 i2c DaVinci I2C adapter I2C adapter該命令將顯示任何可用的I2C總線。而輸出的結果告訴我們有一個 I2C 總線,其ID是 i2c-1
?
一旦獲得了I2C總線名稱,就可以通過運行 i2cdetect -y I2CBUS?得到總線上都掛載的所有設備的設備地址
其中,I2CBUS?是一個整數或I2C總線名稱。
# i2cdetect -y 10 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- 08 -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- UU -- -- 60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- 70: -- -- -- UU -- -- -- --?
通過,參看:S5PV210開發 -- I2C 你知道多少?(一)?知道 MT9P031 的設備地址為 0x5d。
然后查看下圖可以發現 I2C 總線上是有掛載 MT9P031 設備地址的。
?
如果不確定,那么來做個測試,關閉電源,去除攝像頭,然后再次執行 i2cdetect -y 1
結果如下,可以得出 0x5d 就是sensor MT9P031 的設備地址。
# i2cdetect -y 10 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- 08 -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- 70: -- -- -- UU -- -- -- --2、i2cdump 指令
查看它的選項
# i2cdump Error: No i2c-bus specified! Usage: i2cdump [-f] [-y] [-r first-last] I2CBUS ADDRESS [MODE [BANK [BANKREG]]]I2CBUS is an integer or an I2C bus nameADDRESS is an integer (0x03 - 0x77)MODE is one of:b (byte, default)w (word)W (word on even register addresses)s (SMBus block)i (I2C block)c (consecutive byte)Append p for SMBus PEC
如果想要導出I2C設備中的所有寄存器內容,運行指令 i2cdump -f -y I2CBUS ADDRESS
其中 I2CBUS 是一個整數或I2C總線名稱,ADDRESS是一個整數(0x03 - 0x77)。
例如,我們查看 MT9P031的寄存器內容。
# i2cdump -f -y 1 0x5d No size specified (using byte-data access)0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef 00: 18 00 00 07 0a 00 00 1f 00 07 80 00 00 00 00 00 ?..??..?.??..... 10: 00 64 00 00 00 00 00 00 00 00 00 00 00 00 40 00 .d............@. 20: 00 00 00 00 00 00 00 00 00 04 10 00 00 00 00 00 .........??..... 30: 00 00 00 00 00 00 00 00 00 00 00 00 12 00 80 00 ............?.?. 40: 00 00 00 00 02 10 10 10 00 00 00 00 00 0e 10 00 ....????.....??. 50: 80 00 80 00 00 00 00 00 80 00 00 00 00 2d 41 23 ?.?.....?....-A# 60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 70: 00 a7 a7 0c 06 56 6b 6b a5 ab a9 a7 a7 ff a9 a9 .????Vkk?????.?? 80: 00 1f 00 1b 1d 00 18 1a 00 00 00 00 00 00 00 00 .?.??.??........ 90: 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ?............... a0: 00 00 00 00 00 00 00 00 00 00 00 07 0a ca 00 44 ...........???.D b0: bc 48 be 48 b8 c2 e0 06 01 09 09 09 03 0b 09 08 ?H?H???????????? c0: 02 01 04 06 06 0e 05 0b d2 c4 1a 49 a4 46 b0 60 ???????????I?F?` d0: 44 08 d0 34 ee 4d 27 92 8d 5e a0 0f 91 24 9c 95 D??4?M'??^???$?? e0: 78 6c 11 d1 b4 13 59 1e 7c ad a1 3e e4 a1 14 13 xl????Y?|??>???? f0: 00 00 00 00 00 00 00 00 00 00 a3 0a 56 71 00 18 ..........??Vq.?3、i2cget 指令
查看它的選項
# i2cget Usage: i2cget [-f] [-y] I2CBUS CHIP-ADDRESS [DATA-ADDRESS [MODE]]I2CBUS is an integer or an I2C bus nameADDRESS is an integer (0x03 - 0x77)MODE is one of:b (read byte data, default)w (read word data)c (write byte/read byte)Append p for SMBus PEC上面 i2cdump 是讀取所有寄存器的內容,那么如果只是想要讀取特定寄存器的內容呢。
運行指令 i2cget -f -y I2CBUS CHIP-ADDRESS MODE
其中 I2CBUS 是一個整數或 I2C 總線名稱,ADDRESS 是一個整數(0x03 - 0x77)。
MODE是以下之一:
? ? ?b(讀取字節數據,默認)
? ? ?w(讀取字數據)
? ? ?c(寫入字節/讀取字節)
還是以 MT9P031 為例,我們看它的時序圖,片內寄存器地址是 0x09。那我們就看這個寄存器的內容好了。
由于MT9P031有16位寄存器,所以我們必須使用讀取字數據(w)。
?
# i2cget -f -y 1 0x5d 0x09 w 0x9707我們看到MT9P031的數據表,你會看到正確的芯片版本寄存器的值是0x0284。就算是由于大小端的原因得出的結果最多也會是 0x8402,但是我們得到的卻是 0x9707 我就不曉得為什么了。
?
再舉個例子:
# i2cget -f -y 1 0x5d 0x00 w 0x0118想要查看 MT9P031 的芯片 ID。片內寄存器地址為 0x00,得出的值為 0x0118,大小端轉換其結果應為 0x1801.
然后再查看,內核啟動信息里的這段話。
mt9p031 1-005d: Detected a MT9P031 chip ID 1801 mt9p031 1-005d: mt9p031 1-005d decoder driver registered !! vpfe-capture vpfe-capture: v4l2 sub device mt9p031 registered vpfe_register_ccdc_device: DM365 ISIF DM365 ISIF is registered with vpfe.發現 MT9P031的chip ID 確實是 1801。
4、i2cset 指令
查看它的選項
# i2cset Usage: i2cset [-f] [-y] [-m MASK] I2CBUS CHIP-ADDRESS DATA-ADDRESS [VALUE] [MODE]I2CBUS is an integer or an I2C bus nameADDRESS is an integer (0x03 - 0x77)MODE is one of:c (byte, no value)b (byte data, default)w (word data)Append p for SMBus PEC
如果你想在特定的寄存器內容寫入呢?運行指令?i2cset -f -y I2CBUS CHIP-ADDRESS VALUE MODE
其中?I2CBUS 是一個整數或 I2C 總線名稱,ADDRESS 是一個整數(0x03 - 0x77),VALUE是要寫入寄存器的值。
MODE是以下之一:
? ? ?b(讀取字節數據,默認)
? ? ?w(讀取字數據)
? ? ?c(寫入字節/讀取字節)
?
我們將 MT9P031 片內寄存器 0x09, 以讀取字數據(w),這次我們寫入正確的值 0x0284。
# i2cset -f -y 1 0x5d 0x09 0x8402 w再讀取: # i2cget -f -y 1 0x5d 0x09 w 0x8402說明可以內容寫入的,重啟開發板發現數據沒有被重置,依舊是 0x8402 。
?
再舉個例子:
之前我的DM368開發板主頻為270Mhz,CVDD電壓為1.2V,而只有當電壓為1.35v才能實現主頻為432Mhz。
我用的電源管理芯片是TVP65023RSB,這個芯片該如何配置,使其生成1.35v呢?
查看芯片手冊,如下這段話,得出TVP65023 的設備地址為 0x48
The TPS65023 has a 7-bit address:?1001000, other addresses are available upon contact with the factory # i2cdetect -y 1? 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- 08 -- -- -- -- -- -- --? 10: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- --? 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --? 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --? 40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --? 50: -- -- -- -- -- -- -- -- -- -- -- -- -- UU -- --? 60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --? 70: -- -- -- UU -- -- -- --?
然后繼續查看芯片手冊:
?
通過i2ctool修改寄存器: 主要有關的寄存器為05和06如下圖:
i2cset -f -y 1 0x48 0x05 0x80
i2cset -f -y 1 0x48 0x06 0x16
ok!!! ? 有電壓1.35v。
到這步又有問題了,通過I2Ctool可以獲得1.35v,但是掉電后會恢復默認的1.2v。
所以最后還是更改硬件電路實現的。
(4)Linux 下 i2c 的其他操作
查看 i2c-1總線:
/sys/devices/platform/i2c_davinci.1/i2c-1# ls 1-001b 1-0049 1-0073 name 1-0025 1-0050 delete_device new_device 1-002c 1-005d device subsystem 1-0039 1-0068 i2c-dev uevent然后進入 1-005d 目錄,查看 name:
/sys/devices/platform/i2c_davinci.1/i2c-1/1-005d# ls driver ? ? modalias ? name ? ? ? subsystem ?uevent/sys/devices/platform/i2c_davinci.1/i2c-1/1-005d# cat name mt9p031查看I2C設備:
/sys/bus/i2c/drivers# ls PCA9543A dummy rtc-ds1307 tvp514x aic3x I2C Codec mt9p031 ths7303 dev_driver pcf857x tps65023我這個只有一個 i2c-1 總線,如果是多個總線的話,通過這種方法就可以知道從設備是在哪個總線上了。
(當然文件系統不一樣,可能位置也不同,僅供參考)
四、漏極開路
我們知道?I2C 器件連接到總線輸出級必須是集電極開路或漏極開路形式才能實現線“與”的邏輯功能。
那么問題來了,什么是漏極開路或者集電極開路呢?
之前簡單介紹過三極管,參看:S5PV210開發 -- 驅動開發相關硬件簡介
再參看:如何正確的理解漏極開路輸出跟推挽輸出? —— 知乎
再參看:集電極開路 -- 維基百科
(1)推挽(push-pull)輸出
要理解推挽輸出,首先要理解好三極管(晶體管)的原理。下面這種三極管有三個端口,分別是基極(Base)、集電極(Collector)和發射極(Emitter)。下圖是NPN型晶體管。
這種三極管是電流控制型元器件,注意關鍵詞電流控制。意思就是說,只要基極B有輸入(或輸出)電流就可以對這個晶體管進行控制了。
下面請允許我換一下概念,把基極B視為控制端,集電極C視為輸入端,發射極E視為輸出端。這里輸入輸出是指電流流動的方向。
當控制端有電流輸入的時候,就會有電流從輸入端進入并從輸出端流出。
而PNP管正好相反,當有電流從控制端流出時,就會有電流從輸入端流到輸出端。
那么推挽電路:
上面的三極管是N型三極管,下面的三極管是P型三極管,請留意控制端、輸入端和輸出端。
當Vin電壓為V+時,上面的N型三極管控制端有電流輸入,Q3導通,于是電流從上往下通過,提供電流給負載。
經過上面的N型三極管提供電流給負載(Rload),這就叫「推」。
當Vin電壓為V-時,下面的三極管有電流流出,Q4導通,有電流從上往下流過。
經過下面的P型三極管提供電流給負載(Rload),這就叫「挽」。
以上,這就是推挽(push-pull)電路。
(2)漏極開路(Open-Drain)
要理解開漏,可以先理解開集。
如圖,開集(Open Collector)的意思,就是集電極C一端什么都不接,直接作為輸出端口。
如果要用這種電路帶一個負載,比如一個LED,必須接一個上拉電阻(Pull up 電阻),就像這樣。
當Vin沒有電流,Q5斷開時,LED亮。
當Vin流入電流,Q5導通時,LED滅。
開漏電路,就是把上圖中的三極管換成場效應管(MOSFET)。
N型場效應管各個端口的名稱:
場效應管是電壓控制型元器件,只要對柵極施加電壓,DS就會導通。結型場效應管有一個特性就是它的輸入阻抗非常大,這意味著:沒有電流從控制電路流出,也沒有電流進入控制電路。沒有電流流入或流出,就不會燒壞控制電路。而雙極型晶體管不同,是電流控制性元器件,如果使用開集電路,可能會燒壞控制電路。這大概就是我們總是聽到開漏電路而很少聽到開集電路的原因吧?因為開集電路被淘汰了。
(3)、I2C電氣特性
那我們現在分析一下 I2C 的電氣特性。
參看:Understanding the I 2C Bus
I2C在同一條線上使用一個漏極開路/集電極開路的輸入緩沖器,從而允許一條數據線 用于雙向數據流。
1、雙向通信的開漏?
漏極開路指的是一種輸出,它可以將總線拉低到一個電壓(接地),或者“釋放”總線,并通過一個上拉電阻來拉起它。 如果總線在由主機或從機釋放,線上的上拉電阻(Rpu)負責拉總線電壓直至電源軌。 由于沒有設備可能會迫使一個高線,這意味著總線永遠不會遇到一個通信問題,一個設備可能試圖發送一個高,另一個發送一個低, 造成短路(電源導軌接地)。 I2C 要求如果多主環境中的主設備傳輸一個高,但看到的線路是低的(另一個設備拉下來),以停止通信,因為另一臺設備正在使用該總線(這也就是仲裁機制,線“與”)。推挽接口不允許這種類型的自由,這是一個 I2C 的好處。
上圖顯示了 SDA / SCL 線上從設備或主設備內部結構的簡化視圖,由讀取輸入數據的緩沖器和下拉式FET來傳輸數據組成。?一個設備是只能將總線拉低(提供對地短路)或釋放總線(高阻接地),并允許上拉電阻提高電壓。?這是處理 I2C 時要實現的一個重要概念,因為沒有設備可以保持高總線。這個屬性是允許雙向通信發生。
2、漏極開路拉低
如前一節所述,漏極開路設置可能只會拉低總線或“釋放”它,并讓一個電阻拉高。?
下圖顯示了拉低總線電流的流程。?想要傳送一個邏輯低電平時將激活下拉FET(場效應管),從而提供短路接地,拉低線路。
3、漏極開路釋放總線
當從設備或主設備希望傳輸一個邏輯高電平時,只能通過關閉下拉FET(場效應管)來釋放總線。?這使得總線懸空,上拉電阻將把電壓拉高到電壓軌,這將被解釋為一個高電平。?下圖顯示了通過上拉電阻的電流流動,拉高總線。
?
五、總結
I2C 總結用了十多天的時間,寫了三篇文章,可算是講完了,不容易啊。
而且我覺得講的相當細致了,結合了之前開發時需要的問題,I2C 的軟硬件都有涉及到。
以后開發再遇到 I2C 通信,絕對的不用愁了。哈哈...
如需轉載請注明出處:https://blog.csdn.net/qq_29350001/article/details/78835639
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的S5PV210开发 -- I2C 你知道多少?(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop:HDFS的概念理解和体系架
- 下一篇: 最优化学习笔记(十三)——基本共轭方向算