关于I2C的应答信号,钻牛角尖了,求高手解答

2019-10-16 03:25发布

u8 I2C_Wait_ACK(void)
{
               
                u16 errtime=1;
                 SDA_IN()
                 IIC_SDA=1;
                 IIC_SCL=1;
                while(READ_SDA)
                {
                        errtime++;
                        if(errtime>250)
                        {
                                I2C_Stop();
                                return 1;
                        }
                }
                IIC_SCL=0;
                printf("errtime=%d ",errtime);
                return 0;
}
上面这样写,一点问题都没有但是这样写,就不好使了
u8 I2C_Wait_ACK(void)
{
               
                u16 errtime=1;
                 SDA_OUT()
                 IIC_SDA=1;     这里我先让SDA输出1,等到第9个上升沿的时候,24C02会把SDA拉低,然后把IO口变成SDA_IN() 转为接收方式,为什么时序就错了呢??想了好久好久也没想明白
                 IIC_SCL=1;
                 SDA_IN()
                while(READ_SDA)
                {
                        errtime++;
                        if(errtime>250)
                        {
                                I2C_Stop();
                                return 1;
                        }
                }
                IIC_SCL=0;
                printf("errtime=%d ",errtime);
                return 0;
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
ansun
1楼-- · 2019-10-17 05:50
I2C总线,两根线都应该是带上拉的,当主机、从机都不控制时,就应该是被上拉拉高,第9个时钟主机不用刻意去拉高,只需要放开控制就行了的。
银河之星
2楼-- · 2019-10-17 07:01
原子的MYII2程序,写了SDA和SCL两总线的状态。当然工作时有输入输出态,但这个实在主从机的程序中根据时序逻辑写的。
你所提到的SDA_IN() 和SDA_OUT()变化,在另一段有主从状态的程序中可以看到。

一周热门 更多>