STM32 硬件 IIC 与 51 模拟 IIC 通信

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标志位;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值