你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于I2C代码对应答失败的处理

[复制链接]
guyii54 提问时间:2018-3-28 21:45 /
悬赏1ST金币未解决
原子哥在I2C的代码有些没有看懂下面这段代码里,IIC_Wait_Ack()函数应该会返回一个0或1,这里并没有用它的返回值,而是直接往下运行了,那如果这里的返回值是0,代码里并没有给出相应的处理啊,求大佬帮助一下,多谢多谢


void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{                                                                                                                                                                                          
    IIC_Start();  
        if(EE_TYPE>AT24C16)
        {
                IIC_Send_Byte(0XA0);            //发送写命令
                IIC_Wait_Ack();
                IIC_Send_Byte(WriteAddr>>8);//发送高地址,即WriteAddr高八位  
        }else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据          
        IIC_Wait_Ack();          
        IIC_Send_Byte(WriteAddr%256);   //发送低地址,即WriteAddr低八位
        IIC_Wait_Ack();                                                                                                              
        IIC_Send_Byte(DataToWrite);     //发送字节                                                          
        IIC_Wait_Ack();                                
    IIC_Stop();//产生一个停止条件
        delay_ms(10);         
}

收藏 评论9 发布时间:2018-3-28 21:45

举报

9个回答
wenyangzeng 回答时间:2018-3-28 22:16:24
本帖最后由 wenyangzeng 于 2018-3-28 22:25 编辑

IIC_Wait_Ack()应答信号只是回复1个低电平;
IIC_NAck()回复1个高电平而已。
AT24CXX_WriteOneByte()里 执行IIC_Send_Byte()后就要一直等到低电平的到来。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

bargagebaobei 回答时间:2018-3-29 08:05:36
我来继续解释一下
IIC_Wait_Ack()和IIC_NAck()这两个函数并不是等待什么 而是发送相应的电平。所以并不是楼主理解的接收电平

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

清/ts囸図 回答时间:2018-3-29 08:31:56
bargagebaobei 发表于 2018-3-29 08:05
我来继续解释一下
IIC_Wait_Ack()和IIC_NAck()这两个函数并不是等待什么 而是发送相应的电平。所以并不是楼 ...

光从函数名来看,IIC_Wait_Ack()就应该是等待应答,而不是发送相应的电平。
IIC_NAck()才是发送相应的电平

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

清/ts囸図 回答时间:2018-3-29 08:36:11
IIC_Wait_Ack()没有处理应答,你可以自己添加相应的处理,比如应答错误的话,重新开始IIC通讯过程等等。
比如IIC写EEPROM时,可以不处理应答,通过写入再读取的方式判断是否成功;当然也可以通过处理应答的方式来判断是否成功;就看个人而已。
guyii54 回答时间:2018-3-29 09:20:16
wenyangzeng 发表于 2018-3-28 22:16
IIC_Wait_Ack()应答信号只是回复1个低电平;
IIC_NAck()回复1个高电平而已。
AT24CXX_WriteOneByte()里  ...

也就是说发完一个字节的数据必须空出一个SCL脉冲的时间去读这个应答,而不能继续发数据,所以就有了IIC_Wait_Ack()这个函数。
也像楼下说的,这个应答是成功还是失败可以自己再写相应的程序去处理,只不过这里没有管应答成功还是失败就继续传下一个字节了,这个理解对吗?
guyii54 回答时间:2018-3-29 09:25:11
bargagebaobei 发表于 2018-3-29 08:05
我来继续解释一下
IIC_Wait_Ack()和IIC_NAck()这两个函数并不是等待什么 而是发送相应的电平。所以并不是楼 ...

“发送相应的电平”,指的是主机发送SCL上升下降的脉冲,来读由从机发来的应答信号吗
然后再问一下,主机如果是发送设备,是不需要用IIC_NAck()的对吧?只有从机是接受设备,而且接受完一个字节的时候,才需要发送一个IIC_NAck(),用来释放SDA
stm1024 回答时间:2018-3-29 09:39:52
这个ACK相当于是IIC从设备给主设备的一个回执,通常我们假定是正确的,当然也可以添加自己的错误处理机制。
但是主设备从设备读取多条字节指令时,最后一条要求主设备应答NACK,然后停止IIC总线。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

wenyangzeng 回答时间:2018-3-29 09:50:32
guyii54 发表于 2018-3-29 09:20
也就是说发完一个字节的数据必须空出一个SCL脉冲的时间去读这个应答,而不能继续发数据,所以就有了IIC_W ...

如果器件没有接收到正确的数据,自然不会返回正确的应答信号。以此来判断本次通讯成功与否。
如楼主所述:“这个应答是成功还是失败可以自己再写相应的程序去处理”。
guyii54 回答时间:2018-3-29 09:54:26
wenyangzeng 发表于 2018-3-29 09:50
如果器件没有接收到正确的数据,自然不会返回正确的应答信号。以此来判断本次通讯成功与否。
如楼主所述: ...

好的,谢谢您的解答!

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版