新手被I2C总线弄得头疼 请大神帮忙分析下 下面两个同为应答函数代码区别

2019-07-15 09:57发布

一个是有参数的应答函数,一个是没有参数的应答函数
另问:在应答过程中当SCL为高电平时,SDA的电平是不是根据数据的接收情况自动决定是高电平还是低电平?
代码一中参数的作用是什么?
每次发送一个字节结束后,都要用这样的应答函数吗?
void Ack_I2c(bit a)     //a作为应答标志
{  
  if(a==0)sda=0;              /*在此发出应答或非应答信号 */
  else sda=1;      /*0为发出应答,1为非应答信号 */
  _nop_();
  _nop_();
  _nop_();      
  scl=1;
  _nop_();
  _nop_();                    /*时钟低电平周期大于4μs*/
  _nop_();
  _nop_();
  _nop_();  
  scl=0;                     /*清时钟线,住I2C总线以便继续接收*/
  _nop_();
  _nop_();   
}


bit Ask()
{
bit ack_bit;
SDA=1;
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
ack_bit=SDA;
SCL=0;
reurn ack_bit;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
Night1ngale
1楼-- · 2019-07-15 11:20
哇, 这个函数我还真是没看懂,应该是主机等待应答的函数,但是不应该没有返回值呀。我觉得正确的代码应该是这样:
bit responds()
{
     uchar i=0;
     SDA=1
     _nop_();
     _nop_();
     SCL=1;
     _nop_();
     _nop_();
     delay();
     while((SDA==1)&&(i<255))
              i++;
     if(i>=255)
          return 1;
     else
          return 0
     SCL=0;
     delay();
}
这样只有从机在主机的255个机器时钟内应答了,就可以检测到。
你原来那个函数我也没看懂,如果运行的话,其实没有任何结果,只是延迟的作用。

一周热门 更多>