標題: i2c的應答問題 求指教 [打印本頁]
作者: lzmonkey 時間: 2012-2-22 01:40
標題: i2c的應答問題 求指教
這東西搞了兩天了 ,好生郁悶
一個字節的數據傳完后 要返回一個ack
void respons() //應答
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<250))i++;
scl=0;
delay();
}
這個返回里并沒有對返回值操作呀 難道是器件自發的返回ack? 如果返回的標志是sda=0 那為什么有一定的時間限制呢? 求解答。。
作者: 青蘋果 時間: 2012-2-22 09:01
首先要知道I2C是低電平準備數據,高電平讀取數據
[此貼子已經被作者于2012-2-22 15:38:46編輯過]
作者: 青蘋果 時間: 2012-2-22 09:01
SCL=1;
準備讀取ACK
[此貼子已經被作者于2012-2-22 15:40:54編輯過]
作者: 青蘋果 時間: 2012-2-22 09:03
在SCL=1;的情況下,從機輸出是不變的
[此貼子已經被作者于2012-2-22 15:41:32編輯過]
作者: 青蘋果 時間: 2012-2-22 09:05
先不考慮I
如果這個時候SDA==1為假,也就是說有ACK信號了,那么跳過后面的語句,直接SCL=0
作者: 青蘋果 時間: 2012-2-22 09:05
ACK信號讀取成功
作者: 青蘋果 時間: 2012-2-22 09:07
在考慮I
如果SDA==1為真,也就是SDA是高,沒有收到ACK,這個時候通過I來做一段延時, 延時到再退出
[此貼子已經被作者于2012-2-22 15:43:12編輯過]
作者: 青蘋果 時間: 2012-2-22 09:10
如果在一定的時間內沒有讀到ACK,說明通訊失敗,在你上面的程序里,沒有標記失敗的變量,是按照正常情況來退出的,一般來說I2C器件都不會出現這種失敗的情況,但為了程序的可靠性,應該在以上一段程序后增加STOP,不知道你沒有帖出來的程序里時候有
以上僅供參考!
作者: lzmonkey 時間: 2012-2-22 13:17
謝謝耐心的解答 , 不過i2c不是clk高電平讀取數據 低電平是準備階段嗎 低電平的時候允許sda改變 還有個新問題 有人寫延時函數的時候是
void delay()
{; ;}
這是不是和
{_nop_();_nop_(); }是一樣的意思??
百度不讓查這個符號 麻煩大神解答一下。
作者: lzmonkey 時間: 2012-2-22 14:15
.應該不是一樣的意思 兩個延時時間不同 不過上面那個到底是什么意思呢。。
作者: 青蘋果 時間: 2012-2-22 15:38
這個不好意思,寫錯了,是低電平準備數據,高電平取數據
作者: lzzgg834483370 時間: 2014-9-14 14:17
SCL在高電平期間,SDA
作者: lzzgg834483370 時間: 2014-9-14 14:20
SCL在高電平期間,SDA被從設備拉為低電平表示應答。 首先第四行scl=1;表示先把SCL拉高,等待從設備將SDA拉低,也就是ack信號,等待250個操作后,不再等待SCL拉低退出
作者: YOUYOU18182002 時間: 2015-5-25 10:48
這對于我也是一個重難點
| 歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |