熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2023-6-11 21:47
正文摘要:I2C對(duì)應(yīng)的時(shí)序?qū)懘a: 延時(shí)函數(shù):I2CDelay() {_nop_();_nop_();_nop_();_nop_();} 1.stop函數(shù) void I2CStop() { I2C_SCL = 0; I2C_SDA = 0; I2CDelay(); &nbs ... |
第9行,也就是你提出的問題,沒有必要,函數(shù)進(jìn)來默認(rèn)scl是低電平,這時(shí)候可以立馬拉低對(duì)sda進(jìn)行操作 第18行延時(shí),這是為了給從機(jī)時(shí)間,并且延時(shí)使時(shí)鐘達(dá)到從機(jī)要求 第20行延時(shí),給從機(jī)讀數(shù)據(jù)的時(shí)間 第24行,將sda恢復(fù)到高電平并在25行做延時(shí)是為了給從機(jī)操作sda,作為ask,防止發(fā)送字節(jié)最后一位為低電平產(chǎn)生誤判 I2C一般也就400k最大,你這4個(gè)空操作的時(shí)間夠嗎,這芯片頻率也太低了吧 |
哈蘭德 發(fā)表于 2023-6-12 13:21 I2C_SDA = 1;是釋放總線 |
哈蘭德 發(fā)表于 2023-6-12 13:21 只要注意啟動(dòng)和停止那2段間隔符合即可,如1602開始的地址建立時(shí)間符合要求即可。 |
寫時(shí)序該如何理解了?? |
因?yàn)镾TOP之后要一定時(shí)間才能發(fā)起START,避免你發(fā)了STOP后馬上發(fā)起START,所以加了延時(shí),這個(gè)延時(shí)根據(jù)你的器件的時(shí)序而定,有的器件要幾個(gè)us。而現(xiàn)代的單片機(jī)大部分速度都很快,如果發(fā)出STO跑步加延時(shí)馬上發(fā)START,間隔可能在1us以內(nèi)。 |
SCL和SDA都是高電平了,不理解最后一行還使用I2CDelay()的原因 ? IIC通信速度一般都不快好像最快400K吧,單片機(jī)的速度一般遠(yuǎn)遠(yuǎn)大于IIC從設(shè)備;比如在調(diào)用程序里,發(fā)送Stop函數(shù)后 馬上又發(fā)Start函數(shù),就會(huì)有類似 SCL=0;馬上又SCL=1;從設(shè)備會(huì)反應(yīng)不過來; 加delay能夠讓通信更加穩(wěn)定, 如果主機(jī)時(shí)鐘頻率和通信速率不高, 不加也是可以的; 個(gè)人習(xí)慣, 我一般會(huì)加幾個(gè)Nop的延時(shí)時(shí)間! 程序本身就是邊寫邊調(diào)試;剛開始能跑起來?赡艿搅撕竺婺憔蜁(huì)發(fā)現(xiàn),噢,這個(gè)地方加個(gè)微妙級(jí)延時(shí)更穩(wěn)定; 慢慢的這就成為經(jīng)驗(yàn)吧! |
I2C總線的位傳輸 起始條件:SCL為高電平時(shí),SDA由高電平向低電平切換;表示開始傳送數(shù)據(jù)。 停止條件:SCL為高電平時(shí),SDA由低電平向高電平跳變;表示結(jié)束傳送數(shù)據(jù)。 空閑條件:I2C總線的SDA和SCL兩條信號(hào)線同時(shí)處于高電平時(shí);表示空閑狀態(tài)。 |
Powered by 單片機(jī)教程網(wǎng)