久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1701|回復: 8
收起左側

i2C應答要判斷再進行下一步嗎?附單片機程序

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

    如圖所示這樣寫是不是不夠嚴謹,如果從機都沒應答也發送地址或數據,但是如果要等有應答再做下一步,那不是要嵌套幾層if判斷?

    void At24c02Write(uchar ADDR, DAT)

{
I2cStart();//I2C起始信號
I2cSendByte(At24c02ADDR + I2cWrite);/發送器件地址加讀寫方向位
if(ReadACK()) //讀從機應答
   AckFlag = 1; //無應答
Else
{
   AckFlag = 0; //應答
   I2cSendByte(ADDR);//發送儲存單元地址字節
   if(ReadACK())//讀從機應答
       AckFlag = 1; //無應答
   Else
   {
      AckFlag = 0; //應答
     I2cSendByte(DAT);//發送一字節數據
     if(ReadACK())//讀從機應答
        AckFlag = 1; //無應答
     Else        
     {
      AckFlag = 0; //應答
      I2cStop(); //I2c停止信號
     }
   }  
  }
}
回復

使用道具 舉報

ID:452475 發表于 2023-12-5 14:40 | 顯示全部樓層
確保時序正確能調通檢不檢測應答我覺得沒啥關系。如果需要檢測應答的話就判斷應答信號,如果錯誤的話就return出來返回一個標志位這樣吧。
回復

使用道具 舉報

ID:1102699 發表于 2023-12-5 15:01 | 顯示全部樓層
要是能確保時序正確,可以不要應答,直接給個空時鐘,這個時鐘必須給了才行連續操作。否則只能一個BYTE訪問。
回復

使用道具 舉報

ID:600469 發表于 2023-12-5 15:30 | 顯示全部樓層
建議直接抄網上代碼
回復

使用道具 舉報

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

使用道具 舉報

ID:1034262 發表于 2023-12-5 23:05 | 顯示全部樓層
需要,假如沒有應答,則馬上發送停止條件退出。
回復

使用道具 舉報

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

那這部分具體要怎樣有沒有例子發來看下是退出還是用循環等待
回復

使用道具 舉報

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

等待比退出是不是更好點。要不退出不是會影響到后面程序
回復

使用道具 舉報

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

void Write_Byte(unsigned char byte)                        //寫入器件的應答信號由從機給出
{
         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;                   //給出一個上升沿,用于產生應答信號
        Delay();
        SDA=1;
        while((SDA==1)&&(k<1000))
                {
                k++;
                Delay();
                } //等待SDA出現低電平,出現低電平就表示器件已經應答
        SCL=1;
        SDA=0;
        Delay();
}
對于應答的處理,每個人有每個人處理方式,或者是說場合不同,代碼也會有所不同
對于無應答,有幾種處理方法,看你代碼應用場合來決定:
1,不理會有沒有應答,直接寫入下一個字節
2,返回一個IIC錯誤信息,可以是提示IIC錯誤,或者是有屏幕提示無應答之類的處理
3,重新啟動IIC,再給一個啟始信號,繼續進行IIC通訊

不管是用那個方法,IIC一定是要有應答系統的,而且,應答是不能死等的,要有一個時間限制的,不然容易卡死

回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线免费看黄网站 | 黄色av免费看| 一级免费av| 伊人久久综合 | 亚洲精品少妇 | 超碰免费观看 | 51免费看成人啪啪片 | 成人三级小说 | 日韩黄色视屏 | 在线日韩视频 | 一区二区三区不卡视频 | av综合网站 | 成人毛片在线 | 久久av一区二区 | 欧美日韩国产成人 | 午夜高清| 亚洲精品18在线观看 | 免费看a级片| 成人在线一区二区 | 日韩有码在线视频 | 黄色成人免费网站 | 国产美女免费 | 天天干天天插 | 日韩a视频| 中文字幕在线观看一区二区 | 欧美日韩一区二区三区四区 | 狠狠干综合网 | 天天视频国产 | 日韩香蕉视频 | 岛国av在线免费观看 | www.亚洲视频 | 99精品视频免费观看 | 国产在线一 | 欧美精品一区在线观看 | 精品视频免费观看 | 天天操夜夜 | 欧美日韩一区在线 | 亚洲一区二区在线免费观看 | 国产农村妇女aaaaa视频 | 日韩一级黄色片 | 在线免费看毛片 |