找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1497|回復(fù): 8
收起左側(cè)

i2C應(yīng)答要判斷再進(jìn)行下一步嗎?附單片機(jī)程序

[復(fù)制鏈接]
ID:1095802 發(fā)表于 2023-12-5 10:48 | 顯示全部樓層 |閱讀模式
51hei截圖_20231205104810.png

    如圖所示這樣寫(xiě)是不是不夠嚴(yán)謹(jǐn),如果從機(jī)都沒(méi)應(yīng)答也發(fā)送地址或數(shù)據(jù),但是如果要等有應(yīng)答再做下一步,那不是要嵌套幾層if判斷?

    void At24c02Write(uchar ADDR, DAT)

{
I2cStart();//I2C起始信號(hào)
I2cSendByte(At24c02ADDR + I2cWrite);/發(fā)送器件地址加讀寫(xiě)方向位
if(ReadACK()) //讀從機(jī)應(yīng)答
   AckFlag = 1; //無(wú)應(yīng)答
Else
{
   AckFlag = 0; //應(yīng)答
   I2cSendByte(ADDR);//發(fā)送儲(chǔ)存單元地址字節(jié)
   if(ReadACK())//讀從機(jī)應(yīng)答
       AckFlag = 1; //無(wú)應(yīng)答
   Else
   {
      AckFlag = 0; //應(yīng)答
     I2cSendByte(DAT);//發(fā)送一字節(jié)數(shù)據(jù)
     if(ReadACK())//讀從機(jī)應(yīng)答
        AckFlag = 1; //無(wú)應(yīng)答
     Else        
     {
      AckFlag = 0; //應(yīng)答
      I2cStop(); //I2c停止信號(hào)
     }
   }  
  }
}
回復(fù)

使用道具 舉報(bào)

ID:452475 發(fā)表于 2023-12-5 14:40 | 顯示全部樓層
確保時(shí)序正確能調(diào)通檢不檢測(cè)應(yīng)答我覺(jué)得沒(méi)啥關(guān)系。如果需要檢測(cè)應(yīng)答的話就判斷應(yīng)答信號(hào),如果錯(cuò)誤的話就return出來(lái)返回一個(gè)標(biāo)志位這樣吧。
回復(fù)

使用道具 舉報(bào)

ID:1102699 發(fā)表于 2023-12-5 15:01 | 顯示全部樓層
要是能確保時(shí)序正確,可以不要應(yīng)答,直接給個(gè)空時(shí)鐘,這個(gè)時(shí)鐘必須給了才行連續(xù)操作。否則只能一個(gè)BYTE訪問(wèn)。
回復(fù)

使用道具 舉報(bào)

ID:600469 發(fā)表于 2023-12-5 15:30 | 顯示全部樓層
建議直接抄網(wǎng)上代碼
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2023-12-5 23:02 | 顯示全部樓層
用IIC就得等待應(yīng)答,一定要的
大多人寫(xiě)IIC并不是只為一個(gè)程序?qū)懙?而是封裝一個(gè)完整的.C文件,然后可以在任何地方都能用的
你去掉了等待應(yīng)答,再把這個(gè)代碼用到別的地方就會(huì)出問(wèn)題的
回復(fù)

使用道具 舉報(bào)

ID:1034262 發(fā)表于 2023-12-5 23:05 | 顯示全部樓層
需要,假如沒(méi)有應(yīng)答,則馬上發(fā)送停止條件退出。
回復(fù)

使用道具 舉報(bào)

ID:1095802 發(fā)表于 2023-12-6 09:46 | 顯示全部樓層
Y_G_G 發(fā)表于 2023-12-5 23:02
用IIC就得等待應(yīng)答,一定要的
大多人寫(xiě)IIC并不是只為一個(gè)程序?qū)懙?而是封裝一個(gè)完整的.C文件,然后可以在任 ...

那這部分具體要怎樣有沒(méi)有例子發(fā)來(lái)看下是退出還是用循環(huán)等待
回復(fù)

使用道具 舉報(bào)

ID:1095802 發(fā)表于 2023-12-6 09:48 | 顯示全部樓層
coody_sz 發(fā)表于 2023-12-5 23:05
需要,假如沒(méi)有應(yīng)答,則馬上發(fā)送停止條件退出。

等待比退出是不是更好點(diǎn)。要不退出不是會(huì)影響到后面程序
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2023-12-6 16:24 | 顯示全部樓層
殿堂之上 發(fā)表于 2023-12-6 09:46
那這部分具體要怎樣有沒(méi)有例子發(fā)來(lái)看下是退出還是用循環(huán)等待

void Write_Byte(unsigned char byte)                        //寫(xiě)入器件的應(yīng)答信號(hào)由從機(jī)給出
{
         unsigned char i,temp;
        unsigned int k;
         temp=byte;                
        SCL=0;
        Delay();
                 for(i=0;i<8;i++)
                         {
                        if(temp&0x80)SDA=1;
                        else SDA=0;
                        Delay();
                        SCL=1;
                        Delay();               
                        SCL=0;
                        Delay();
                        temp=temp<<1;
                        }
        SCL=1;                   //給出一個(gè)上升沿,用于產(chǎn)生應(yīng)答信號(hào)
        Delay();
        SDA=1;
        while((SDA==1)&&(k<1000))
                {
                k++;
                Delay();
                } //等待SDA出現(xiàn)低電平,出現(xiàn)低電平就表示器件已經(jīng)應(yīng)答
        SCL=1;
        SDA=0;
        Delay();
}
對(duì)于應(yīng)答的處理,每個(gè)人有每個(gè)人處理方式,或者是說(shuō)場(chǎng)合不同,代碼也會(huì)有所不同
對(duì)于無(wú)應(yīng)答,有幾種處理方法,看你代碼應(yīng)用場(chǎng)合來(lái)決定:
1,不理會(huì)有沒(méi)有應(yīng)答,直接寫(xiě)入下一個(gè)字節(jié)
2,返回一個(gè)IIC錯(cuò)誤信息,可以是提示IIC錯(cuò)誤,或者是有屏幕提示無(wú)應(yīng)答之類(lèi)的處理
3,重新啟動(dòng)IIC,再給一個(gè)啟始信號(hào),繼續(xù)進(jìn)行IIC通訊

不管是用那個(gè)方法,IIC一定是要有應(yīng)答系統(tǒng)的,而且,應(yīng)答是不能死等的,要有一個(gè)時(shí)間限制的,不然容易卡死

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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