搜索
查看: 8231|回复: 10

[已解决] 关于I2C代码对应答失败的处理

[复制链接]

该用户从未签到

3

主题

9

帖子

0

蝴蝶豆

初级会员

最后登录
2018-7-14
发表于 2018-3-28 21:45:10 | 显示全部楼层 |阅读模式
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);         
}

回复

使用道具 举报

该用户从未签到

74

主题

3420

帖子

82

蝴蝶豆

社区小助手

最后登录
2023-11-12
发表于 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

查看全部评分

回复

使用道具 举报

该用户从未签到

18

主题

648

帖子

338

蝴蝶豆

金牌会员

最后登录
2021-1-7
发表于 2018-3-29 08:05:36 | 显示全部楼层
我来继续解释一下
IIC_Wait_Ack()和IIC_NAck()这两个函数并不是等待什么 而是发送相应的电平。所以并不是楼主理解的接收电平

评分

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

查看全部评分

回复

使用道具 举报

该用户从未签到

4

主题

17

帖子

5

蝴蝶豆

初级会员

最后登录
2018-3-29
发表于 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

查看全部评分

回复

使用道具 举报

该用户从未签到

4

主题

17

帖子

5

蝴蝶豆

初级会员

最后登录
2018-3-29
发表于 2018-3-29 08:36:11 | 显示全部楼层
IIC_Wait_Ack()没有处理应答,你可以自己添加相应的处理,比如应答错误的话,重新开始IIC通讯过程等等。
比如IIC写EEPROM时,可以不处理应答,通过写入再读取的方式判断是否成功;当然也可以通过处理应答的方式来判断是否成功;就看个人而已。
回复

使用道具 举报

该用户从未签到

3

主题

9

帖子

0

蝴蝶豆

初级会员

最后登录
2018-7-14
 楼主| 发表于 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()这个函数。
也像楼下说的,这个应答是成功还是失败可以自己再写相应的程序去处理,只不过这里没有管应答成功还是失败就继续传下一个字节了,这个理解对吗?
回复

使用道具 举报

该用户从未签到

3

主题

9

帖子

0

蝴蝶豆

初级会员

最后登录
2018-7-14
 楼主| 发表于 2018-3-29 09:25:11 | 显示全部楼层
bargagebaobei 发表于 2018-3-29 08:05
我来继续解释一下
IIC_Wait_Ack()和IIC_NAck()这两个函数并不是等待什么 而是发送相应的电平。所以并不是楼 ...

“发送相应的电平”,指的是主机发送SCL上升下降的脉冲,来读由从机发来的应答信号吗
然后再问一下,主机如果是发送设备,是不需要用IIC_NAck()的对吧?只有从机是接受设备,而且接受完一个字节的时候,才需要发送一个IIC_NAck(),用来释放SDA
回复

使用道具 举报

  • TA的每日心情
    奋斗
    2021-4-15 11:47
  • 签到天数: 537 天

    [LV.9]

    29

    主题

    2176

    帖子

    127

    蝴蝶豆

    论坛元老

    最后登录
    2024-4-24
    发表于 2018-3-29 09:39:52 | 显示全部楼层
    这个ACK相当于是IIC从设备给主设备的一个回执,通常我们假定是正确的,当然也可以添加自己的错误处理机制。
    但是主设备从设备读取多条字节指令时,最后一条要求主设备应答NACK,然后停止IIC总线。

    评分

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

    查看全部评分

    回复

    使用道具 举报

    该用户从未签到

    74

    主题

    3420

    帖子

    82

    蝴蝶豆

    社区小助手

    最后登录
    2023-11-12
    发表于 2018-3-29 09:50:32 | 显示全部楼层
    guyii54 发表于 2018-3-29 09:20
    也就是说发完一个字节的数据必须空出一个SCL脉冲的时间去读这个应答,而不能继续发数据,所以就有了IIC_W ...

    如果器件没有接收到正确的数据,自然不会返回正确的应答信号。以此来判断本次通讯成功与否。
    如楼主所述:“这个应答是成功还是失败可以自己再写相应的程序去处理”。
    回复

    使用道具 举报

    该用户从未签到

    3

    主题

    9

    帖子

    0

    蝴蝶豆

    初级会员

    最后登录
    2018-7-14
     楼主| 发表于 2018-3-29 09:54:26 | 显示全部楼层
    wenyangzeng 发表于 2018-3-29 09:50
    如果器件没有接收到正确的数据,自然不会返回正确的应答信号。以此来判断本次通讯成功与否。
    如楼主所述: ...

    好的,谢谢您的解答!
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

    GMT+8, 2024-4-28 02:40 , Processed in 0.195410 second(s), 41 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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