使用I2C外设通讯时,在通讯的不同阶段它会对“状态寄存器(SR1 及SR2)”的不同数据位写入参数,通过读取这些寄存器标志来了解通讯状态。

1.主发送器

可使用STM32标准库函数来直接检测这些事件的复合标志,降低编程难度。

• 控制产生起始信号(S),当发生起始信号后,它产生事件“EV5”,并会对 SR1寄存器的“SB”位置1,表示起始信号已经发送;

• 发送设备地址并等待应答信号,若有从机应答,则产生事件“EV6”及 “EV8”,这时SR1寄存器的“ADDR”位及“TXE”位被置1,ADDR 为1 表示地址已经发送,TXE为1表示数据寄存器为空;

• 往I2C的“数据寄存器DR”写入要发送的数据,这时TXE位会被重置0,表示数据寄存器非空,I2C外设通过SDA信号线一位位把数据发送出去后,又会产生“EV8”事件,即TXE位被置1,重复这个过程,可以发送多个字节数据;

• 发送数据完成后,控制I2C设备产生一个停止信号(P),这个时候会产生EV2 事件,SR1的TXE位及BTF位都被置1,表示通讯结束。

2.主接收器

• 起始信号(S)是由主机端产生的,控制发生起始信号后,它产生事件 “EV5”,并会对SR1寄存器的“SB”位置1,表示起始信号已经发送;

• 发送设备地址并等待应答信号,若有从机应答,则产生事件“EV6”这时SR1寄存器的“ADDR”位被置1,表示地址已经发送。

• 从机端接收到地址后,开始向主机端发送数据。当主机接收到这些数据后,会产生“EV7”事件,SR1寄存器的RXNE被置1,表示接收数据寄存器非空,读取该寄存器后,可对数据寄存器清空,以便接收下一次数据。此时可以控制I2C发送应答信号(ACK)或非应答信号(NACK),若应答,则重复以上步骤接收数据,若非应答,则停止传输;

• 发送非应答信号后,产生停止信号(P),结束传输。

最新文章

  1. TOMCAT开放远程调试端口
  2. 有用的php函数
  3. mysql配置mysql-proxy读写分离
  4. solr单机环境配置并包含外部单机zookeeper
  5. [BS-08]注意Xcode自动提示好用但极易出错,务必看清方法的名称
  6. python_way.day7 模块(configparser,xml,shutil,subprocess)、面向对象(上)(创建类,类的构成,函数式编程与面向对象编程的选择,类的继承)
  7. 【LeetCode 235】Lowest Common Ancestor of a Binary Search Tree
  8. Struts2学习笔记整理(三)
  9. 25.django Model
  10. elasticsearch视频
  11. 我发起并创立了一个 EPWA 的 开源项目
  12. Zookeeper Ha集群简介+jdbcClient访问Ha集群环境
  13. bzoj千题计划255:bzoj3572: [Hnoi2014]世界树
  14. Flask 中的 Response
  15. C语言 · 文本加密
  16. 【性能测试】:监控Mysql数据库方式
  17. Spring配置--tx事务配置方式
  18. iOS-查询数据库-->指定数据表中的当前数据行的总数量
  19. 运用Unity结合PolicyInjection实现拦截器[结合操作日志实例]
  20. POJ-3484 Showstopper---二分+前缀和

热门文章

  1. win10下交换CapLock和Esc按键
  2. vue中子组件传值给父组件
  3. 【hadoop环境问题】namenode无法启动问题解决
  4. oracle利用触发器实现主键字段自增
  5. RDD java API使用
  6. Mybatis xml mapper 特殊写法总结
  7. springboot 之JPA
  8. Eclipse中把项目导出为war包【我】
  9. jmeter 和 postman 提交 传输类型为 "multipart/form-data" 的传送写法
  10. 利用Python获取cookie的方法,相比java代码简便不少