找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2379|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

關(guān)于IIC通信中從機(jī)對C51單片機(jī)主機(jī)模擬應(yīng)答信號的子程序的疑問

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:609281 發(fā)表于 2021-2-13 00:23 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
      小弟近來在學(xué)習(xí)IIC通信協(xié)議,看的是郭天祥的C51單片機(jī)課本,其中對于應(yīng)答信號的模擬子程序書里面是這樣的:
        void respons( )
       {
               uchar i = 0;
               SCL     = 1;
               delay( );
              while((SDA == 1) &&(i<255));
                      i ++;
              SCL     = 0;
              delay( );
       }
           為什么要有 while((SDA == 1) &&(i<255)); ? 課本里是這樣解釋的,(SDA == 1) &&(i<255); 是相與的關(guān)系,表示若在一段時間內(nèi)沒有收到從器件的應(yīng)答,則主器件默認(rèn)從器件已經(jīng)收到數(shù)據(jù)而不再等待應(yīng)答信號,因?yàn)槿绻患舆@個延時退出,一旦器件沒有發(fā)出應(yīng)答信號,程序?qū)⒂肋h(yuǎn)停止在這里,而真正的程序中是不允許這樣的。
        小弟的問題是:1、while((SDA == 1) &&(i<255));       i ++; 能不能換成delay( )  ?因?yàn)闊o論C51是否接收到了從機(jī)的應(yīng)答,都會往下執(zhí)行SCL = 0; 并不會說程序停在那里不動, while((SDA == 1) &&(i<255)); 的功能也就相當(dāng)于等待從機(jī)進(jìn)行應(yīng)答,一旦SDA被從機(jī)拉為低電平就開始執(zhí)行SCL = 0;所以我覺得while((SDA == 1) &&(i<255));       i ++; 可以換成delay( )。

                              2、這一個模擬應(yīng)答信號子函數(shù)中,為什么沒有SDA = 0;這個語句?是不是因?yàn)閺臋C(jī)是具有IIC協(xié)議功能的,一旦接受了一個字節(jié)的信息后,自動會使SDA = 0;不需要手動操作?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:880987 發(fā)表于 2021-2-13 09:20 | 只看該作者
看著比清翔的教程還麻煩,主機(jī)只要發(fā)送數(shù)據(jù)完成保證釋放總線即SCL = 0和SDA = 1,下一步判斷從機(jī)應(yīng)答,把SCL拉高5微秒,判斷SDA電平,高電平從機(jī)非應(yīng)答拉低SCL電平,主機(jī)發(fā)出停止信號;低電平從機(jī)應(yīng)答拉低SCL,準(zhǔn)備下一組數(shù)據(jù)發(fā)送。根本不需要多余的循環(huán)檢測

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

板凳
ID:373388 發(fā)表于 2021-2-13 14:28 | 只看該作者
仔細(xì)看看iic協(xié)議,再看這個函數(shù),實(shí)際上這個個函數(shù)是正確的;最好帶返回參數(shù),可以判斷應(yīng)答是否正確:
bool respons( )
       {       uchar i = 0;
               SCL     = 1;
               delay( );
              while((SDA == 1) &&(i<255));
                      i ++;
              SCL     = 0;
              delay( );
             if(i<255)  return true;
             else         return false;
       }
回復(fù)

使用道具 舉報

地板
ID:872416 發(fā)表于 2021-2-13 16:48 來自手機(jī) | 只看該作者
回答1,可以用延時函數(shù)的,用完就break,跳出while
回復(fù)

使用道具 舉報

5#
ID:609281 發(fā)表于 2021-2-13 22:08 | 只看該作者
xhaity 發(fā)表于 2021-2-13 14:28
仔細(xì)看看iic協(xié)議,再看這個函數(shù),實(shí)際上這個個函數(shù)是正確的;最好帶返回參數(shù),可以判斷應(yīng)答是否正確:
boo ...

好的,感謝您的解答!
回復(fù)

使用道具 舉報

6#
ID:609281 發(fā)表于 2021-2-13 22:10 | 只看該作者
catlu 發(fā)表于 2021-2-13 09:20
看著比清翔的教程還麻煩,主機(jī)只要發(fā)送數(shù)據(jù)完成保證釋放總線即SCL = 0和SDA = 1,下一步判斷從機(jī)應(yīng)答,把SC ...

嗯嗯,看懂了,謝謝!
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表