I2C协议——I2C框图和I2C通信过程

1.软件模拟和硬件模拟的概念

       所谓软件模拟,即直接使用 CPU 内核按照 I2C 协议的要求控制 GPIO 输出高低电平。如控制产生 I2C 的起始信号时,先控制作为 SCL 线的 GPIO 引脚输出高电平,然后控制作为 SDA 线的 GPIO 引脚在此期间完成由高电平至低电平的切换,最后再控制SCL线切换为低电平,这样就输出了一个标准的 I2C起始信号。

       而硬件 I2C 是指直接利用 STM32 芯片中的硬件 I2C 外设,该硬件 I2C 外设跟 USART串口外设类似,只要配置好对应的寄存器,外设就会产生标准串口协议的时序。使用它的I2C 外设则可以方便地通过外设寄存器产生 I2C 协议方式的通讯,如初始化好 I2C 外设后,只需要把某寄存器位置 1,那么外设就会控制对应的 SCL及 SDA 线自动产生 I2C起始信号,而不需要内核直接控制引脚的电平。

       硬件 I2C 直接使用外设来控制引脚,可以减轻 CPU 的负担。不过使用硬件I2C 时必须使用某些固定的引脚作为 SCL 和 SDA,软件模拟 I2C 则可以使用任意 GPIO 引脚,相对比较灵活。在本开发板中,由于 STM32RCT6 芯片引脚较少,资源比较紧张,在设计硬件时不方便使用硬件 I2C 指定的引脚连接外部设备(EEPROM 存储器芯片),所以在控制程序上只能使用软件模拟 I2C 的方式。

2.I2C框图

I2C功能框图

       ①通讯引脚

       有三个引脚:SDA、SCL、SMB,这三个引脚是在有I2C硬件结构的STM32单片机才有的引脚,没I2C硬件结构的单片机都是用的普通GPIO口进行软件模拟的。

②时钟控制逻辑
在这里插入图片描述

       SCL线的时钟信号,由I2C接口根据时钟控制寄存器(CRR)控制,控制的参数主要为时钟频率。
       可选择I2C通讯的“标准/快速”模式,这两个模式分别对应I2C的100Kbit/s和400Kbit/s的通讯速率。
       在快速模式下可选择SCL时钟的占空比,可选Tlow/Thigh=2或Tlow/Thigh=16/9模式。
       Thigh就是SCL线输出的高电平的时间,Tlow就是SCL线输出的低电平的时间。一个SCL的时钟周期就是Thigh+Tlow,在标准模式下,SCL的时钟周期就等于Thigh+Tlow=2CCRTpclk1,要配置具体数值的SCL时钟周期,可以将SCL时钟周期带进公式,算出CCR的值,然后就可以配置SCL的时钟周期。
       CCR寄存器中12位的配置因子CCR,它与I2C外设的输入时钟源共同作用,产生SCL时钟。STM32的I2C外设输入时钟源为PLCK1(AHB1时钟,最大32MHz)。
时钟控制寄存器
时钟控制寄存器计算时钟频率:

       ③数据控制逻辑

在这里插入图片描述

       I2C的SDA信号主要连接到数据移位寄存器上,数据移位寄存器的数据来源及目标是数据寄存器(DR)、地址寄存器(OAR)、PEC寄存器以及SDA数据线。数据寄存器作为缓存的功能,方便STM32存储或接收。当STM32作为从机时,STM32会从SDA线接收由主机发送的从机地址,然后将从机地址和自身地址寄存器或双地址寄存器相比较(这两个寄存器都是存储自身地址,之所以存在两个寄存器,可能是I2C为了同时处理两个设备),比较相同后才能对主机做出应答。PEC寄存器是用来做数据校验的,但是很少使用。

       当向外发送数据时,数据移位寄存器以“数据寄存器”为数据源,把数据一位一位地通过SDA信号线发送出去。
       当从外部接收数据时,数据移位寄存器把SDA信号线采样到的数据一位一位地存储到“数据寄存器”中。

       ④整体控制逻辑

在这里插入图片描述
整体控制逻辑主要控制整个I2C的工作模式和工作状态,具体的理解可以结合I2C的通信过程来理解。

3.I2C通信过程

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

       ①主发送器(I2C主模式,写)

主发送器传送时序图
       将I2C_CR1寄存器的START位置1,就会产生起始条件,如果正常产生了一个起始信号,就会产生一个EV5事件,这时I2C_SR1寄存器的SB位就会变为1,所以可以通过读取状态寄存器(I2C_SR1)的SB位来判断起始条件是否产生。
       主发送器发送地址后,如果从设备产生了应答信号,就会产生EV6和EV8事件,EV6事件是I2C_SR1寄存器的ADD=1,这表示地址发送结束,EV8事件是TxE=1,也就是数据寄存器为空,数据寄存器为空就可以继续写入新的数据,这就是判断这些EVx事件的意义(即检测这些状态位的意义就是等待I2C将要发送的数据成功发送,然后才能进行下一步工作)。当产生EV8_2事件时,TxE=1,BTF=1,BTF=1表示数据移位寄存器为空,这样就表示所有数据都被发送出去了,然后就可以产生停止位,即将I2C_CR1寄存器的STOP位置1,结束这次通信。

       ②主接收器(I2C主模式,读)

主接收器传送序列图
       起始信号发送完成后就会产生一个EV5事件,然后发送从机地址,从机产生应答信号,产生EV6事件,和主发送器不一样的是,当主机读取从机的数据后,产生的应答是主机产生的,不是从机产生的,这个应答信号的产生是将I2C_CR1寄存器的ACK位置1,然后会产生一个EV7事件,EV7事件是RxNE=1,表示数据寄存器非空,即数据寄存器有数据了,这时候内核就可以将数据寄存器里的值送到内存变量中以供使用。ACk应答信号为1的时候就会继续从从机中读取数据,然后再产生ACK应答,循环往复,当不在接收数据时,就会产生一个EV7_1事件,这个事件是RxNE=1,并设置ACK=0和STOP位(将其置1),结束数据的发送,最后产生一个EV7事件,表示最后一个数据读取完成。

       还有要注意的就是,以上哪些状态位读取后都要将其清除,每个位的清除方法都不一样,具体方法可见上面EVx事件后面的描述。

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值