![]() |
發布時間: 2021-10-27 14:39
正文摘要:如圖,iic通信有起始位,終止位,寫字節,讀字節,還有寫應答和讀應答 在讀字節里,一開始把數據線和時鐘線同時拉低,讀出的字節全部是00,而把數據線拉高,時鐘線拉低讀出的數據正常 或者只把時鐘線拉低 ... |
本帖最后由 yzwzfyz 于 2021-10-30 11:19 編輯 樓主需要補一下硬件知識。硬件上0、1是如何表達的,重點是輸出端的電路形式,注意0、1輸出各是多少伏電壓。 當兩個輸出端口接在一起時呢? |
把 拉高 拉低的說法換成釋放和占用就好理解些吧 |
信號輸入腳配置成了輸入模式,再設置輸出應該是沒用的啊 |
zhangzhao2423 發表于 2021-10-28 10:07 你置了1 才能被拉低. 你置了0 永遠拉不高, 你不信邪可以做實驗, 置0以后, 用5V接限流電阻到IO, 看看能不能讀出個1 來? |
參與人數 1 | 黑幣 +5 | 收起 理由 |
---|---|---|
![]() | + 5 |
zhangzhao2423 發表于 2021-10-28 10:10 數據線置1只是8051的操作 SDA=1;可以讓8051內部讀取到這個端口的電平狀態,可以理解為釋放這個端口 而不是說讓這個端口輸出高電平 而別的單片機就不一定是這樣的了 所謂硬件置1...... 24Cxx的數據輸出是OD輸出,它只能輸出低電平,也就是說它只能吸入電流,沒法輸出電流,這就是為什么要上拉電阻的原因 所以,軟件輸出0,端口就是0 |
參與人數 1 | 黑幣 +5 | 收起 理由 |
---|---|---|
![]() | + 5 | 很給力! |
yzwzfyz 發表于 2021-10-28 09:41 我軟件置0,它硬件置1,數據線電平信號不會改變為1 嗎? |
188610329 發表于 2021-10-27 16:48 電平只能被拉低不能被拉高,那為什么還要置1呢 不是說不能拉高嗎 |
A和B之間在一根線D上通訊。如果A出1,B出0,D上是1是0呢。 明白這個道理之后就知道【為什么不能把數據線拉低。】了。 |
昨天有人發的“I2C總線讀寫應答機制詳解”,你不妨看看: http://www.zg4o1577.cn/bbs/dpj-213612-1.html |
這IIC其實是很簡單的,把IIC協議秒一遍基本就能明白一個大概了 1,IIC沒有起始位和停止位,那叫起始信號,的停止信號,協議中有說明,這個信號由主機發送 2,應答信號,每次發送或者接收完一個字節的數據,后面要跟上一個一天天信號 發送數據的時候,應答信號由從機給出,用來告訴主機,已經接收完數據了,下一步要干嘛,這是接收到緩存而已,并沒有寫入IIC器件 讀取數據的時候,應答信號由主機給出,用來告訴已經讀取完數據了,下一步要干嘛 |
然后現在來回答,你的應答問題, 數據線時鐘線“ 同時拉低” 是不可以的,因為理論上是不存在“同時”的必定有先后,正常操作,除了發送 開始/終止 信號, 都是必須先 拉低 時鐘線, 然后拉高/拉低數據線。 然后,接受應答信號時,其實就是返回 ACK/NAK 也就是說,會返回 0/1 , 我們知道電平只能被拉低不能被拉高,所以你必須先把數據線置1,然后發送時鐘后,客戶機才能返回 0/1,拉低/拉高數據線,讓你知道返回的是 ACK/NAK , 當然如果你不判斷是ACK/NAK 也沒有關系。這個位忽略,不讀結果就可以了。 |
zhangzhao2423 發表于 2021-10-27 15:50 你在理解上, 有一個誤區, 那就是: I2C 通信,不存在終止位,和起始位。 不同于 Uart 傳輸,有起始位,和終止位,因為他們是占位的,因此我們Uart傳輸一個字節的數據,需要10個bit傳輸,就是 起始位 + 8位數據 + 終止位。 但是,I2C 沒有 起始位,終止位,只存在 起始信號 和 終止信號 他們是不占位的。 換句話說,他們可以在任何時候發出。 只要 時鐘線(CLK) 在高電平, 這個時候數據線 從0=>1 就是終止信號, 數據線 從1=>0 就是起始信號,數據線 從1=>0=>1 就是再啟動信號(說白了,就是停了在開)。 因此,在I2C傳輸時,數據線是只能在 時鐘線(CLK)低電平時發生變化,不然,就是在發送 起始/終止信號,那么后續,你以為的“數據傳輸”,一定是不會正常發生的。 |
笨笨兔 發表于 2021-10-27 15:29 講啊,沒看協議我就不再上面問了。有時候你就是看十遍也不一定能想得通,但是經別人一點撥,就云開霧散了。言歸正傳。。。 在發送字節時,數據線和時鐘線我都拉低,然后字節的最高位與0X80按位與運算,給數據線,時鐘線拉高延時,時鐘線拉低,循環八次。沒問題 在讀字節時,為什么數據線不能拉高?比如我先發送字節(地址字節尋找從機),從機發送應答后數據線拉高,問題來了,我在讀字節里先給數據線拉低會是什么結果?請高手指點一下 |
你還是好好讀一讀I2C協議吧. |