IIC 代码wait_ack

2019-09-03 13:26发布

其他地方我都理解了,下面红色字体的两个地方不理解。
用的是来自原子战舰板子的IIC代码
u8 IIC_Wait_Ack(void)
{
        u8 ucErrTime=0;
//        SDA_IN();      
        IIC_SDA=1;delay_us(1);          //IIC_SDA为什么要拉高?看不懂这里?
        IIC_SCL=1;delay_us(1);         
        while(READ_SDA)
        {
                ucErrTime++;
                if(ucErrTime>250)
                {
                        IIC_Stop();
                        return 1;
                }
        }
        IIC_SCL=0;
        return 0;  //这个return 返回的0 是给那个函数的用的?
}

其他地方我都理解了,下面红色字体的两个地方不理解。
用的是来自原子战舰板子的IIC代码
u8 IIC_Wait_Ack(void)
{
        u8 ucErrTime=0;
//        SDA_IN();      
        IIC_SDA=1;delay_us(1);          //IIC_SDA为什么要拉高?看不懂这里?
        IIC_SCL=1;delay_us(1);         
        while(READ_SDA)
        {
                ucErrTime++;
                if(ucErrTime>250)
                {
                        IIC_Stop();
                        return 1;
                }
        }
        IIC_SCL=0;
        return 0;  //这个return 返回的0 是给那个函数的用的?
}

6条回答
操作系统   
  •   
  •   实习生
    1楼-- · 2019-09-03 18:10
    IIC_SDA=1;delay_us(1);          //IIC_SDA为什么要拉高?看不懂这里?
    i2C总线都应该用开漏输出.拉高自然是相当于设置为输入状态.也就是释放总线控制权.让从机有机会控制.才有从机ASK
    查看更多
    gsndragon   
  •   
  •   实习生
    2楼-- · 2019-09-03 23:36
    主机释放了总线,从机才能给出应答信号,否则主机把SDA拉低如何检测应答?
    查看更多
    dingdi   
  •   
  •   实习生
    3楼-- · 2019-09-04 02:09
    gsndragon 发表于 2017-3-23 10:28
    主机释放了总线,从机才能给出应答信号,否则主机把SDA拉低如何检测应答?

    //IIC_SDA=1;delay_us(1);
    我把它屏蔽掉 如何。
    查看更多
    dingdi   
  •   
  •   实习生
    4楼-- · 2019-09-04 04:15
    gsndragon 发表于 2017-3-23 10:28
    主机释放了总线,从机才能给出应答信号,否则主机把SDA拉低如何检测应答?

    在第九时钟,拉高SDA吗?
    C语言是顺序执行的。
    SDA=1;
    SCL=1;
    我感觉这个在第九个时钟,不符合逻辑啊。
    第九个使用不是应该SCL=1,再SCL=0;吗!
    查看更多
    dingdi   
  •   
  •   实习生
    5楼-- · 2019-09-04 08:24
    gsndragon 发表于 2017-3-23 10:28
    主机释放了总线,从机才能给出应答信号,否则主机把SDA拉低如何检测应答?

    我理解了。经过示波器测试,在主机释放总线的瞬间,slave 就已经把SDA给拉低了。非常快。
    查看更多