找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于IIC通信中从机对C51单片机主机模拟应答信号的子程序的疑问

[复制链接]
跳转到指定楼层
楼主
ID:609281 发表于 2021-2-13 00:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
      小弟近来在学习IIC通信协议,看的是郭天祥的C51单片机课本,其中对于应答信号的模拟子程序书里面是这样的:
        void respons( )
       {
               uchar i = 0;
               SCL     = 1;
               delay( );
              while((SDA == 1) &&(i<255));
                      i ++;
              SCL     = 0;
              delay( );
       }
           为什么要有 while((SDA == 1) &&(i<255)); ? 课本里是这样解释的,(SDA == 1) &&(i<255); 是相与的关系,表示若在一段时间内没有收到从器件的应答,则主器件默认从器件已经收到数据而不再等待应答信号,因为如果不加这个延时退出,一旦器件没有发出应答信号,程序将永远停止在这里,而真正的程序中是不允许这样的。
        小弟的问题是:1、while((SDA == 1) &&(i<255));       i ++; 能不能换成delay( )  ?因为无论C51是否接收到了从机的应答,都会往下执行SCL = 0; 并不会说程序停在那里不动, while((SDA == 1) &&(i<255)); 的功能也就相当于等待从机进行应答,一旦SDA被从机拉为低电平就开始执行SCL = 0;所以我觉得while((SDA == 1) &&(i<255));       i ++; 可以换成delay( )。

                              2、这一个模拟应答信号子函数中,为什么没有SDA = 0;这个语句?是不是因为从机是具有IIC协议功能的,一旦接受了一个字节的信息后,自动会使SDA = 0;不需要手动操作?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:880987 发表于 2021-2-13 09:20 | 只看该作者
看着比清翔的教程还麻烦,主机只要发送数据完成保证释放总线即SCL = 0和SDA = 1,下一步判断从机应答,把SCL拉高5微秒,判断SDA电平,高电平从机非应答拉低SCL电平,主机发出停止信号;低电平从机应答拉低SCL,准备下一组数据发送。根本不需要多余的循环检测

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:373388 发表于 2021-2-13 14:28 | 只看该作者
仔细看看iic协议,再看这个函数,实际上这个个函数是正确的;最好带返回参数,可以判断应答是否正确:
bool respons( )
       {       uchar i = 0;
               SCL     = 1;
               delay( );
              while((SDA == 1) &&(i<255));
                      i ++;
              SCL     = 0;
              delay( );
             if(i<255)  return true;
             else         return false;
       }
回复

使用道具 举报

地板
ID:872416 发表于 2021-2-13 16:48 来自手机 | 只看该作者
回答1,可以用延时函数的,用完就break,跳出while
回复

使用道具 举报

5#
ID:609281 发表于 2021-2-13 22:08 | 只看该作者
xhaity 发表于 2021-2-13 14:28
仔细看看iic协议,再看这个函数,实际上这个个函数是正确的;最好带返回参数,可以判断应答是否正确:
boo ...

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

使用道具 举报

6#
ID:609281 发表于 2021-2-13 22:10 | 只看该作者
catlu 发表于 2021-2-13 09:20
看着比清翔的教程还麻烦,主机只要发送数据完成保证释放总线即SCL = 0和SDA = 1,下一步判断从机应答,把SC ...

嗯嗯,看懂了,谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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