F429的硬件IIC的深度疑问

2019-07-20 06:53发布

这两天在研究一下STM32系列的硬件IIC的使用,常规问题都分析的差不多了,但是在一个问题上面卡住了,愣是想不明白了,希望懂的朋友帮忙解惑一下!描述:
    (1)硬件平台,STM32F429的硬件IIC
    (2)硬件IIC支持模块的自动动作,我们只需要检测几个点以及读写数据就好,可以使用中断,但是我为了分析问题,就没有使用中断,用的是轮询方法;
    (3)假设,主机寻址从机(实例:AT24C02)成功,并得到从机应答,接下来就该发送有效数据,从机收到数据后就要做出动作了;
    (4)我的轮询检测函数为下面的代码:
            I2C_SendData(I2C1, WriteAddr);   //发送一个字节数据
           I2CTimeout = I2CT_FLAG_TIMEOUT; //设置一个超时判断的数值

           /* Test on EV8 and clear it 接下来就等待从机的ACK了,因为主机发了一帧数据过去*/
            while( !I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED) )  /*发生EV8事件,说明收到了从机应答了,*/
           {
                   if (  (I2CTimeout--) == 0  )      return __LINE__;
           }

疑问:
    (1)协议和手册上都说从机的应答是在SCL的第9个周期给出应答or不应答;
            应答好理解:主机发完8bit后,释放SDA,交给从机控制;在第9个SCL周期的前半周期(即SCL低电平)由从机准备数据,即把SDA置0,在SCL周期的上升沿锁定SDA,以便在第9个SCL周期的后半个周期(即SCL高电平)保持SDA的稳定,让
                               主机读走这个SDA,表示了从机的应答;接下来,主机就接着发第二个数据了。。。
            不应答:如果从机不应答,硬件IIC是咋处理的?不应答即意味着在第9个SCL周期内,SDA=1;那么此时,第9个SCL已经过去了,那接下来硬件IIC是怎样控制SCL引脚的呢,是继续按规定的频率产生SCL时钟来不停地读取从机的应答,还是直接就将SCL给
                         拉低了,即SCL=0;
                         总之:我的疑问是,是不是应答or不应答信号必须在第9个SCL周期内做出裁定,以及在第9个SCL周期内,从机不应答后,SCL引脚的动作是怎样的?
    (2)如果是应答or不应答信号必须在第9个SCL周期做出裁定,那么我们上面的超时判断是不是就不合理了,分析:你的不应答裁定在一个SCL就可以判断,即T=1/400k  S(0.0025ms)就可以做出裁定,那你搞了个I2CTimeout(假设1ms) 时间段才推出,那不是浪费时间了呢?
    (3)我知道STMF429在接收和发送数据时可以将SCL给拉低以延伸总线,关于应答这块,手册上好像说的不多啊,希望知道的朋友帮忙解答一下,谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。