关于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条回答
15904520807
1楼-- · 2019-10-16 05:50
 精彩回答 2  元偷偷看……
2938690046
2楼-- · 2019-10-16 10:41
软件仿真 看一下逻辑时序图
原子教程前面有教程  
laojiyou
3楼-- · 2019-10-16 12:06
为什么要输出高呢?你等待从机将SDA拉低也应该是输入高吧!你这样的操作时序相当于给从机发送不应答信号。你仔细看下非应答信号的时序。
njjh1718
4楼-- · 2019-10-16 15:14
抓一下波形吧   会一目了然  感觉你这个高低位  不太对
dreamARM
5楼-- · 2019-10-16 19:18
15904520807 发表于 2016-10-10 13:47
谢谢各位的指点,通过抓捕波形,已经彻底明白IC2的应答机制,首先在第9个时钟的上升沿之前,从机会拉低SDA ...

也就是说,这信号是从机给的,不是自己先置的,所以导致的不好用吗?
15904520807
6楼-- · 2019-10-17 01:03
 精彩回答 2  元偷偷看……

一周热门 更多>