只需一步,快速開始
熱門: 51單片機 | 24小時必答區 | 單片機教程 | 單片機DIY制作 | STM32 | Cortex M3 | 模數電子 | 電子DIY制作 | 音響/功放 | 拆機樂園 | Arduino | 嵌入式OS | 程序設計
這東西搞了兩天了 ,好生郁悶
一個字節的數據傳完后 要返回一個ack
void respons() //應答{ uchar i; scl=1; delay(); while((sda==1)&&(i<250))i++; scl=0; delay();}
這個返回里并沒有對返回值操作呀 難道是器件自發的返回ack? 如果返回的標志是sda=0 那為什么有一定的時間限制呢? 求解答。。
使用道具 舉報
SCL=1;
準備讀取ACK
先不考慮I
如果這個時候SDA==1為假,也就是說有ACK信號了,那么跳過后面的語句,直接SCL=0
ACK信號讀取成功
在考慮I
如果SDA==1為真,也就是SDA是高,沒有收到ACK,這個時候通過I來做一段延時, 延時到再退出
如果在一定的時間內沒有讀到ACK,說明通訊失敗,在你上面的程序里,沒有標記失敗的變量,是按照正常情況來退出的,一般來說I2C器件都不會出現這種失敗的情況,但為了程序的可靠性,應該在以上一段程序后增加STOP,不知道你沒有帖出來的程序里時候有
以上僅供參考!
謝謝耐心的解答 , 不過i2c不是clk高電平讀取數據 低電平是準備階段嗎 低電平的時候允許sda改變 還有個新問題 有人寫延時函數的時候是
void delay(){; ;}這是不是和{_nop_();_nop_(); }是一樣的意思??百度不讓查這個符號 麻煩大神解答一下。
本版積分規則 發表回復 回帖后跳轉到最后一頁
手機版|小黑屋|51黑電子論壇 | 管理員QQ:125739409;技術交流QQ群281945664
Powered by 單片機教程網