IIC介绍
IIC协议规定:SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平期间变化。IIC期间在脉冲上升沿把数据放到SDA上,在脉冲下降沿从SAD上读取数据。这样的话,在SCL高电平期间,SDA上的数据是稳定的。在脉冲下降沿之后的保持时间以后,SDA上的数据可以变化,直到脉冲上升沿之前。
STM32与51 IIC通信实验
下面是在使用51模拟IIC作为主机、STM32硬件IIC作为从机时发生的一些问题:
STM32地址不匹配:
1、STM32工作为从机接收器模式下时,STM32设置IIC地址为0x0A但是I2C_OAR1寄存器中的地址为0x05,所以51发送地址时,应该发送0x05,通过移位之后在最后一位加上R/W位,如果在最后以为加上0表示向STM32发送数据,STM32产生I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED/* BUSY and ADDR flags */事件
2、STM32工作为从机发送器模式下时,在接受地址之后,进入的是I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED/* BUSY and ADDR flags /事件中断,而不是I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED/ TRA, BUSY, TXE and ADDR flags */事件中断,是由于TRANSMITTER这个标志中包含了RECEIVER标志的寄存器中的位,所以当TRANSMITTER放在RECEIVER之后的话,会提前进入RECEIVER事件中断,而无法进入TRANSMITTER事件中断;
STM32无法正确返回ACK信号的原因:
1、当从机不能响应从机地址时(例如它正忙于其他事而无法响应IIC总线的操作,或者这个地址没有对应的从机),在第9个SCL周期内SDA线没有拉低,即没有ACK信号。这时,主机发出一个P信号终止传输或者重新发出一个S信号开始新的传输。
2、如果从机接收器在传输过程中不能接收更多的数据时,它不会发出ACK信号。这样,主机就可以意识到这点,从而发出一个P信号终止传输或者重新发出一个S信号开始新的传输。
3、主机接收器在接收到最后一个字节后,也不会发出ACK信号。于是,从机发送器释放SDA线,以允许主机发出P信号结束传输。
STM32只能够返回一个ACK信号的原因:
1、STM32工作为从机接收器模式下时,在接收到地址后触发I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED/* BUSY and ADDR flags */事件,但是没有清除ADDR标志位;
2、STM32工作为从机接收器模式下时,在收到数据之后触发I2C_EVENT_SLAVE_BYTE_RECEIVED/* BUSY and RXNE flags */事件,但是没有清除RXNE标志位;
---------------------
作者:InfiniteYuan
来源:CSDN
原文:https://blog.csdn.net/qq_27114397/article/details/53310472
版权声明:本文为博主原创文章,转载请附上博文链接!
上一篇:STM32F103 I2C 宕机的问题
下一篇:STM32 硬件I2C中断实现
- 热门资源推荐
- 热门放大器推荐