找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 401|回复: 8
打印 上一主题 下一主题
收起左侧

i2C应答要判断再进行下一步吗?附单片机程序

[复制链接]
跳转到指定楼层
楼主


    如图所示这样写是不是不够严谨,如果从机都没应答也发送地址或数据,但是如果要等有应答再做下一步,那不是要嵌套几层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停止信号
     }
   }  
  }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:452475 发表于 2023-12-5 14:40 | 只看该作者
确保时序正确能调通检不检测应答我觉得没啥关系。如果需要检测应答的话就判断应答信号,如果错误的话就return出来返回一个标志位这样吧。
回复

使用道具 举报

板凳
ID:1102699 发表于 2023-12-5 15:01 | 只看该作者
要是能确保时序正确,可以不要应答,直接给个空时钟,这个时钟必须给了才行连续操作。否则只能一个BYTE访问。
回复

使用道具 举报

地板
ID:600469 发表于 2023-12-5 15:30 | 只看该作者
建议直接抄网上代码
回复

使用道具 举报

5#
ID:401564 发表于 2023-12-5 23:02 | 只看该作者
用IIC就得等待应答,一定要的
大多人写IIC并不是只为一个程序写的,而是封装一个完整的.C文件,然后可以在任何地方都能用的
你去掉了等待应答,再把这个代码用到别的地方就会出问题的
回复

使用道具 举报

6#
ID:1034262 发表于 2023-12-5 23:05 | 只看该作者
需要,假如没有应答,则马上发送停止条件退出。
回复

使用道具 举报

7#
ID:1095802 发表于 2023-12-6 09:46 | 只看该作者
Y_G_G 发表于 2023-12-5 23:02
用IIC就得等待应答,一定要的
大多人写IIC并不是只为一个程序写的,而是封装一个完整的.C文件,然后可以在任 ...

那这部分具体要怎样有没有例子发来看下是退出还是用循环等待
回复

使用道具 举报

8#
ID:1095802 发表于 2023-12-6 09:48 | 只看该作者
coody_sz 发表于 2023-12-5 23:05
需要,假如没有应答,则马上发送停止条件退出。

等待比退出是不是更好点。要不退出不是会影响到后面程序
回复

使用道具 举报

9#
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 单片机教程网

快速回复 返回顶部 返回列表