標(biāo)題: 關(guān)于用51單片機模擬IIC總線通信(主機給從機發(fā)信號,從機無應(yīng)答時應(yīng)該終止發(fā)送數(shù)據(jù)) [打印本頁]

作者: blossom99    時間: 2018-9-3 19:51
標(biāo)題: 關(guān)于用51單片機模擬IIC總線通信(主機給從機發(fā)信號,從機無應(yīng)答時應(yīng)該終止發(fā)送數(shù)據(jù))
最近認(rèn)真的學(xué)習(xí)了IIC總線通信,并看了郭天祥老師的書和視頻講解。
但是我有一點疑問:在IIC總線協(xié)議里規(guī)定當(dāng)主機給從機發(fā)信號,從機無應(yīng)答時應(yīng)該終止發(fā)送數(shù)據(jù),但是郭老師的例程里并沒有這一內(nèi)容,在其他的IIC通信例程中也沒有看到類似內(nèi)容。這是說明這個部分不重要嗎?如果要實現(xiàn)是不是需要用到goto語句?



作者: 人中狼    時間: 2018-9-3 22:36
這部分應(yīng)該都有的,這里的從機應(yīng)答應(yīng)該不是應(yīng)答相應(yīng)的數(shù)據(jù),而是在協(xié)議里主機發(fā)送一個字節(jié)數(shù)據(jù)后,從機都會返回一個應(yīng)答的位,只有一個BIT,注意看協(xié)議
作者: 馬帥    時間: 2018-9-4 00:27
低電平應(yīng)答ACK,高電平NACK
作者: blossom99    時間: 2018-9-4 01:30
你們都沒有理解我的意思。我是說,主機給從機發(fā)數(shù)據(jù),從機沒有給主機應(yīng)答,即沒有在SCK高電平時把SDA拉低(1bit)時,主機應(yīng)該中斷傳輸才對。但是我看的所有例程里(包括不少12864LCD例程)都沒有相關(guān)語句,大多只是后面加了一個時鐘,都不管SDA是什么,只為了能夠順利進(jìn)行數(shù)據(jù)傳輸。還有AT24C02中讀完一節(jié)數(shù)據(jù)應(yīng)該先非應(yīng)答,再停止之類的小細(xì)節(jié)……可能是我摳的太仔細(xì)了……
作者: blossom99    時間: 2018-9-4 01:31
人中狼 發(fā)表于 2018-9-3 22:36
這部分應(yīng)該都有的,這里的從機應(yīng)答應(yīng)該不是應(yīng)答相應(yīng)的數(shù)據(jù),而是在協(xié)議里主機發(fā)送一個字節(jié)數(shù)據(jù)后,從機都會 ...

看樓下我的解釋
作者: blossom99    時間: 2018-9-4 01:32
馬帥 發(fā)表于 2018-9-4 00:27
低電平應(yīng)答ACK,高電平NACK

看樓下我的解釋
作者: 726434632    時間: 2018-9-4 08:31
可以不去理從機、主機自己模擬一個應(yīng)答位就好了。
類似這種
即應(yīng)答信號由主機自己模擬、不理會從機。只要芯片沒有壞、不影響使用。
void iic_slave_NOACK()//默認(rèn)非應(yīng)答信號
{
        SDA=1;
        _nop_();
        SCL=1;
        _nop_();
        SCL=0;       
        _nop_();
}

void MSA300_WriteBytes(unsigned char RegAddr,unsigned char Data)
{
            I2C_Start();//主機準(zhǔn)備好了
        I2C_Write(G_SlaveAddr_W);//主機要給從機發(fā)數(shù)據(jù),知會從機一下
        iic_Ack();//主機當(dāng)從機默認(rèn)知道了
        I2C_Write(RegAddr);//主機告訴從機要操縱的地址
        iic_Ack();//主機當(dāng)從機默認(rèn)知道了
        I2C_Write(Data);//主機告訴從機要修改的地址中內(nèi)容
        iic_Ack();//主機當(dāng)從機默認(rèn)知道了
        I2C_Stop();//主機掛斷了電話
}
作者: 726434632    時間: 2018-9-4 08:37
blossom99 發(fā)表于 2018-9-4 01:30
你們都沒有理解我的意思。我是說,主機給從機發(fā)數(shù)據(jù),從機沒有給主機應(yīng)答,即沒有在SCK高電平時把SDA拉低( ...

從機如果沒有給主機應(yīng)答、即說明從機壞了或者時序不對。讀出來的數(shù)據(jù)肯定是不對的。所以一般簡單用途都不去理會從機是否應(yīng)答。如果要去理會從機應(yīng)答那就while等待從機應(yīng)答、然后加個超時機制,規(guī)定時間內(nèi)while沒有檢測到從機應(yīng)答、就return 錯誤標(biāo)志,如果成功發(fā)送就return 成功標(biāo)志。主程序里判斷是錯誤標(biāo)志就輸出錯誤信息即可,比如“通信錯誤、請更換芯片”
作者: 人中狼    時間: 2018-9-4 10:19
最好可以貼上你所看的例程,或許有的例程為了方便并沒有去檢測應(yīng)答,我也是看例程學(xué)的IIC,里面就有對從機應(yīng)答的檢測和處理。多看一些例程,現(xiàn)在都用C語言寫程序,所以有的例程不需要局限在51,也可以看看如STM32中相關(guān)操作的例程
作者: zyaq123    時間: 2018-9-4 11:41
你可以加延時判斷啊。定時過后如果沒有收到應(yīng)答,則退出此次發(fā)送
作者: zyaq123    時間: 2018-9-4 11:43
從機無應(yīng)答,可能總線有問題哦,你可以在主機上加延時判斷。盡可能少用while,或者while中做一個技術(shù),不然很容易卡機
作者: 溫xyz    時間: 2018-10-24 23:44
郭老師的教材只能入門,有很多東西是粗糙的,不嚴(yán)謹(jǐn)?shù)摹?




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