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