• STM32的I2C通讯过程


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

    1.主发送器

    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.主接收器

    2

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

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

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

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

  • 相关阅读:
    Oracle 数据库 用脚本建表空间
    C++ 类中封装Win32API的回调函数
    在MVC 4 中使用自定义Membership
    机试题目
    sscanf()
    字符串转化为整数
    有序数组中一对数的和为特定数
    把一个数组划分成左边奇数右边偶数
    cocos2dx将背景色改为白色
    字符串单词翻转
  • 原文地址:https://www.cnblogs.com/wenshinlee/p/8988211.html
Copyright © 2020-2023  润新知