标题: 关于IIC通信中从机对C51单片机主机模拟应答信号的子程序的疑问 [打印本页]

作者: 15119014737    时间: 2021-2-13 00:23
标题: 关于IIC通信中从机对C51单片机主机模拟应答信号的子程序的疑问
      小弟近来在学习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;不需要手动操作?

作者: catlu    时间: 2021-2-13 09:20
看着比清翔的教程还麻烦,主机只要发送数据完成保证释放总线即SCL = 0和SDA = 1,下一步判断从机应答,把SCL拉高5微秒,判断SDA电平,高电平从机非应答拉低SCL电平,主机发出停止信号;低电平从机应答拉低SCL,准备下一组数据发送。根本不需要多余的循环检测
作者: xhaity    时间: 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;
       }
作者: 卢卢    时间: 2021-2-13 16:48
回答1,可以用延时函数的,用完就break,跳出while
作者: 15119014737    时间: 2021-2-13 22:08
xhaity 发表于 2021-2-13 14:28
仔细看看iic协议,再看这个函数,实际上这个个函数是正确的;最好带返回参数,可以判断应答是否正确:
boo ...

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

嗯嗯,看懂了,谢谢!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1