![]() |
發布時間: 2023-6-11 21:47
正文摘要:I2C對應的時序寫代碼: 延時函數:I2CDelay() {_nop_();_nop_();_nop_();_nop_();} 1.stop函數 void I2CStop() { I2C_SCL = 0; I2C_SDA = 0; I2CDelay(); &nbs ... |
第9行,也就是你提出的問題,沒有必要,函數進來默認scl是低電平,這時候可以立馬拉低對sda進行操作 第18行延時,這是為了給從機時間,并且延時使時鐘達到從機要求 第20行延時,給從機讀數據的時間 第24行,將sda恢復到高電平并在25行做延時是為了給從機操作sda,作為ask,防止發送字節最后一位為低電平產生誤判 I2C一般也就400k最大,你這4個空操作的時間夠嗎,這芯片頻率也太低了吧 |
哈蘭德 發表于 2023-6-12 13:21 I2C_SDA = 1;是釋放總線 |
哈蘭德 發表于 2023-6-12 13:21 只要注意啟動和停止那2段間隔符合即可,如1602開始的地址建立時間符合要求即可。 |
寫時序該如何理解了?? |
因為STOP之后要一定時間才能發起START,避免你發了STOP后馬上發起START,所以加了延時,這個延時根據你的器件的時序而定,有的器件要幾個us。而現代的單片機大部分速度都很快,如果發出STO跑步加延時馬上發START,間隔可能在1us以內。 |
SCL和SDA都是高電平了,不理解最后一行還使用I2CDelay()的原因 ? IIC通信速度一般都不快好像最快400K吧,單片機的速度一般遠遠大于IIC從設備;比如在調用程序里,發送Stop函數后 馬上又發Start函數,就會有類似 SCL=0;馬上又SCL=1;從設備會反應不過來; 加delay能夠讓通信更加穩定, 如果主機時鐘頻率和通信速率不高, 不加也是可以的; 個人習慣, 我一般會加幾個Nop的延時時間! 程序本身就是邊寫邊調試;剛開始能跑起來。可能到了后面你就會發現,噢,這個地方加個微妙級延時更穩定; 慢慢的這就成為經驗吧! |
I2C總線的位傳輸 起始條件:SCL為高電平時,SDA由高電平向低電平切換;表示開始傳送數據。 停止條件:SCL為高電平時,SDA由低電平向高電平跳變;表示結束傳送數據。 空閑條件:I2C總線的SDA和SCL兩條信號線同時處于高電平時;表示空閑狀態。 |