標(biāo)題: 關(guān)于mpu6050的應(yīng)答信號(hào),整不明白了 [打印本頁(yè)]

作者: v115488    時(shí)間: 2023-3-2 01:06
標(biāo)題: 關(guān)于mpu6050的應(yīng)答信號(hào),整不明白了
其功能是51單片機(jī)向mpu寫(xiě)入一個(gè)字節(jié),然后有mpu在串行數(shù)據(jù)線(SDA)給51一個(gè)應(yīng)答信號(hào);
根據(jù)文檔的說(shuō)明:如下:




我對(duì)應(yīng)答信號(hào)的理解是:
51向mpu發(fā)送完8位數(shù)據(jù),如果mpu應(yīng)答,會(huì)在第9個(gè)時(shí)鐘時(shí),拉低數(shù)據(jù)線SDA.所以我的應(yīng)答代碼如下:
void Write_ACK()
{
     SCL=1;
     SDA=1;
     while(SDA);   //用while判斷SDA有沒(méi)有被拉低,
}


void Write_ACK()
{
     SCL=1;
     while(SCL);   //如果從設(shè)備忙,他會(huì)使SCL保持在低電平.用while判斷mpu是不是在忙,
}


事實(shí)情況是這兩種都不理想;第一個(gè)進(jìn)入死循環(huán),第二個(gè)沒(méi)收到過(guò)反饋;



這是在網(wǎng)上找的51單片機(jī)與mpu6050通信代碼的一段.
他是用PSW寄存器的進(jìn)位標(biāo)志位CY進(jìn)行數(shù)據(jù)發(fā)出的,

他接收應(yīng)答用的還是CY,返回CY后,并沒(méi)有對(duì)CY做任何判斷,

他是怎么判斷有沒(méi)有收到mpu的應(yīng)答信號(hào)的?
還是CY有什么特性?(我在網(wǎng)上沒(méi)找到相關(guān)知識(shí));


作者: glinfei    時(shí)間: 2023-3-2 08:31
你用while,就要加個(gè)延時(shí)自動(dòng)退出的判斷,否則容易死循環(huán),你找的程序只是接收了應(yīng)答,沒(méi)判斷,普通應(yīng)用經(jīng)常這么處理。
作者: rctty    時(shí)間: 2023-3-2 11:55
一般模擬總線,時(shí)鐘由主機(jī)控制,不可能像第二個(gè)去判斷時(shí)鐘,這個(gè)沒(méi)啥意義;第一個(gè)程序,先是SCL拉高,然后再SDA拉高,好嘛,總線通信結(jié)束了
作者: v115488    時(shí)間: 2023-3-2 15:18
rctty 發(fā)表于 2023-3-2 11:55
一般模擬總線,時(shí)鐘由主機(jī)控制,不可能像第二個(gè)去判斷時(shí)鐘,這個(gè)沒(méi)啥意義;第一個(gè)程序,先是SCL拉高,然后 ...

謝謝,受教了
作者: rctty    時(shí)間: 2023-3-2 17:07
v115488 發(fā)表于 2023-3-2 15:18
謝謝,受教了

關(guān)于第二個(gè)問(wèn)題,CY單純是一個(gè)變量吧,理論上來(lái)將,他的第214行應(yīng)該是
if(I2C_RecvACK() == 0)
{
    //應(yīng)答成功,繼續(xù)執(zhí)行其他
}
這樣,不過(guò)這個(gè)估計(jì)是默認(rèn)了應(yīng)答能成功,簡(jiǎn)化掉了;
模擬總線一般用
while(--i);
這樣的操作去等待,i 為 0 的時(shí)候就直接獲取數(shù)據(jù)了,
至于i的值,應(yīng)該和你翻轉(zhuǎn)SCL的延時(shí)是一致的,保證時(shí)鐘的準(zhǔn)確性,雖然說(shuō)IIC對(duì)時(shí)鐘要求不高
用死循環(huán)硬等是不行的




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1