STM32硬件I2C与软件模拟I2C超详解

者简介:嵌入式入坑者,与大家一起加油,希望文章能够帮助各位!!!!
个人主页:@rivencode的个人主页
系列专栏:玩转STM32
推荐一款模拟面试、刷题神器,从基础到大厂面试题点击跳转刷题网站进行注册学习

目录

  • 一.I2C协议简介
  • 二.I2C物理层
  • 三.I2C协议层
    • I2C 基本读写过程
    • 1.空闲状态
    • 2.起始信号与停止信号
    • 3.数据有效性
    • 4.地址及数据方向
    • 5.应答与非应答信号
  • 四.硬件I2C
    • I2C外设功能框图(重点)
    • 1.通信引脚
    • 2.时钟控制逻辑
    • 3.数据控制逻辑
    • 4.整体控制逻辑
    • 5.STM32的I2C外设通信过程(超级重要)
      • 主发送器
      • 主接收器
    • 6.I2C初始化结构体
  • 五.EEPROM简介
    • 1.STM32向从机EEPROM写入一个字节
    • 2.STM32向从机EEPROM写入多个字节(页写入)
    • 3.STM32随机读取EEPROM内部任何地址的数据
    • 4.STM32随机顺序读取EEPROM内部任何地址的数据
  • 六.硬件I2C读写EEPROM实验
    • 实验目的
    • 实验原理
    • 源码
    • 实验效果
  • 七.软件模式I2C协议
    • 实验目的
    • 实验原理
    • 源码
  • 八.总结

一.I2C协议简介

I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备(那些电平转化芯片),现在被广泛地使用在系统内多个集成电路(IC)间的通讯。

I2C只有一跟数据总线 SDA(Serial Data Line),串行数据总线,只能一位一位的发送数据,属于串行通信,采用

  • 半双工通信:可以实现双向的通信,但不能在两个方向上同时进行,必须轮流交替进行,其实也可以理解成一种可以切换方向的单工通信,同一时刻必须只能一个方向传输,只需一根数据线.

对于I2C通讯协议把它分为物理层和协议层物理层规定通讯系统中具有机械、电子功能部分的特性(硬件部分),确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准(软件层面)。

二.I2C物理层

I2C 通讯设备之间的常用连接方式

STM32硬件I2C与软件模拟I2C超详解

开漏输出PMOS不工作
1.当输出寄存器输出高电平,引脚输出高阻态相当于(),假设该引脚接到I2C的SDA总线上,则总线被默认拉成高电平。
2.当输出寄存器输出低电平,引脚输出低电平。

STM32硬件I2C与软件模拟I2C超详解
复用功能开漏输出

复用功能模式中,输出使能,输出速度可配置,可工作在开漏模式, 但是输出信号源于其它外设(来自I2C外设),输出数据寄存器 GPIOx_ODR 无效;输入可用,,但一般直接用外设的寄存器来获取该数据信号

这里SMT32,I2C外设的两个引脚SDA,SCL就要配置成复用功能的开漏输出模式,输出信号源于I2C外设。

为什么引脚要设置成开漏模式
以及为什么两根总线要上拉电阻接高电平,总线默认情况是高电平,详情看下图。

STM32硬件I2C与软件模拟I2C超详解
这里发送完最后一个字节时,主机不一定要接收到从机发送的非应答信号才可以发送停止信号,就算从机应答了主机也可以直接发送停止信好终止通讯

其中 S 表示由主机的 I2C 接口产生的传输起始信号(S),这时连接到 I2C 总线上的所有从机都会接收到这个信号。起始信号产生后,所有从机就开始等待主机紧接下来 广播(由SDA线传输数据)
从机地址(SLAVE_ADDRESS)。在 I2C 总线上,,当主机广播的地址与某个设备地址相同时,这个设备就被选中了,没被选中的设备将会忽略之后的数据信号(引脚输出高阻态与两根总线断开连接)。

根据 I2C 协议,这个从机地址可以是 7 位或 10 位,从机接收到匹配的地址后,主机或从机会返回一个应答(ACK)或非应答(NACK)信号,只有接收到应答信号后,主机才能继续发送或接收数据。

在地址位之后,是传输方向的选择位,表示后面的数据传输方向
该位为 0 时:主机向从机写数据。
该位为 1 时:主机由从机读数据。

  • 2.主机向从机读取数据

STM32硬件I2C与软件模拟I2C超详解
第一次通讯是确定读写从机设备内部寄存器或存储器的地址,第二次则是上一次确定内部寄存器或存储器的地址上面的数据。

1.空闲状态

I2C总线的SDA和SCL两条信号线同时处于高电时,则为总线空闲状态,所有挂载在总线上的设备都输出高阻态(相当于断开与总线的连接),两条总线被上拉电阻的把电平拉高。

2.起始信号与停止信号

STM32硬件I2C与软件模拟I2C超详解
STM32硬件I2C与软件模拟I2C超详解
数据和地址按8位/字节进行传输,先传输数据的高位,每次传输的字节数不受限制。

4.地址及数据方向

I2C 总线上的每个设备都有自己的独立地址,主机发起通讯时,通过 SDA 信号线发送设备地址(SLAVE_ADDRESS)来查找从机。I2C 协议规定设备地址可以是 7 位或 10 位,实际中。紧跟设备地址的一个数据位用来表示数据传输方向,第 8 位或第 11 位。

  • 数据方向位为“1”:表示主机由从机读数据
  • 数据方向位为“0”:表示主机向从机写数据
    STM32硬件I2C与软件模拟I2C超详解
    在第 9 个时钟时,数据发送端会释放 SDA 的控制权,由数据接收端控制 SDA,给发送端传输应答或非应答信号
    • SDA 为高电平:表示非应答信号(NACK)

    • SDA为低电平:表示应答信号(ACK)

    为什么数据发送端要释放 SDA 的控制权(将SDA总线置为高电平)

    STM32硬件I2C与软件模拟I2C超详解

    1.通信引脚

    STM32中有两个I2C外设,硬件I2C必须要使用这些引脚,因为这些引脚才连接到I2C引脚,就比如说PB6与PB7引脚就连接到芯片内部的I2C1外设

    STM32硬件I2C与软件模拟I2C超详解
    实物图:
    STM32硬件I2C与软件模拟I2C超详解
    时钟控制寄存器
    STM32硬件I2C与软件模拟I2C超详解
    STM32硬件I2C与软件模拟I2C超详解

    这里只是演示一下这么计算寄存器写入的值,用库函数我们只要配置好相应寄存器的参数,库函数会帮我计算自动写入的,不要慌。

    3.数据控制逻辑

    STM32硬件I2C与软件模拟I2C超详解
    自身地址寄存器1
    STM32硬件I2C与软件模拟I2C超详解

    4.整体控制逻辑

    这里挑一些重点的寄存器位,我们只需配置好寄存器就可以让I2C外设硬件逻辑自动控制SDA,SCL总线去产生I2C协议的时序如:起始信号、应答信号、停止信号等等

    STM32硬件I2C与软件模拟I2C超详解
    STM32硬件I2C与软件模拟I2C超详解
    接下来就是了解的知识:
    • 总线错误(BERR)

    一个地址或数据字节传输期间,当I2C接口检测到一个外部的停止或起始条件则产生总线错误。此时:

    ● BERR位被置位为’1’;如果设置了ITERREN位,则产生一个中断;
    ● 在从模式情况下,数据被丢弃,硬件释放总线:
    ─ 如果是,从设备认为是一个重启动,并等待地址或停止条件。
    ─ 如果是,从设备按正常的停止条件操作,同时硬件释放总线。
    ● 在主模式情况下,硬件不释放总线,同时不影响当前的传输状态。此时由软件决定是否要中止当前的传输

    STM32硬件I2C与软件模拟I2C超详解
    • 应答错误(AF)

    当STM32检测到一个无应答位时,产生应答错误。此时:

    ● AF位被置位,如果设置了ITERREN位,则产生一个中断;
    ● 当发送器接收到一个NACK时,必须复位通讯:
    ─ 如果是处于从模式,硬件释放总线。
    ─ 如果是处于。

    STM32硬件I2C与软件模拟I2C超详解
    STM32硬件I2C与软件模拟I2C超详解

    5.STM32的I2C外设通信过程(超级重要)

    I2C模式选择:
    接口可以下述4种模式中的一种运行:
    ● 从发送器模式
    ● 从接收器模式
    ● 主发送器模式
    ● 主接收器模式

    该模块默认地工作于从模式。接口在;当仲裁丢失或产生停止信号时,则从主模式切换到从模式。允许多主机功能。

    • 主模式:STM32作为主机通信(发送器与接收器)
    • 从模式:STM32作为从机通信(发送器与接收器)

    I2C主模式:
    默认情况下,I2C接口总是工作在从模式。从从模式切换到主模式,需要产生一个起始条件。

    在主模式时,I2C接口。串行数据传输总是以起始条件开始并以停止条件结束。当。

    主发送器

    STM32硬件I2C与软件模拟I2C超详解

起始条件当BUSY=0时,设置START=1,I2C接口将产生一个开始条件并切换至主模式(M/SL位置位)

STM32硬件I2C与软件模拟I2C超详解
● SB位被硬件置位,如果设置了ITEVFEN位,则会产生一个中断。
然后主设备等待读SR1寄存器,紧跟着将从地址写入DR寄存器
  • EV6事件
    STM32硬件I2C与软件模拟I2C超详解
    从机地址发送完成从机应答之后检测EV6事件:
    STM32硬件I2C与软件模拟I2C超详解
    这个检测是地址发送完之后进行检测,其实我们只要检测EV6事件就可以了,因为EV6事件成功之后就已经代表地址(数据)发送出去,而且从机还应答了,地址已经发送完成那肯定数据寄存器,与移位寄存器肯定为空呐,所以不检测也可以。
  • EV8事件

    STM32硬件I2C与软件模拟I2C超详解
    我们在发送完一个数据之后必须判断数据寄存器是否为空,数据寄存器为空(TXE),才能向数据寄存器写入新的数据,不然上一个数据们还没有转移到移位寄存器,CPU又写入一个数据则会覆盖上一个数据。

STM32硬件I2C与软件模拟I2C超详解
在我们发送完最后一个字节之后我们应该检测EV8_2事件,主要检测BTF位。
STM32硬件I2C与软件模拟I2C超详解
因为虽然STM32做为接收器,但是STM32是主机,起始信号与发送从机地址都是必须由主机干的活,所以前面EV5,EV6,EV6_1事件与主接收器是一模一样
  • EV7事件
    STM32硬件I2C与软件模拟I2C超详解
    接收数据之前,判断数据寄存器是否有数据,也就数据寄存器非空(RNXE),CPU就可以读取数据寄存器中的数据啦。
    • EV7_1事件
      关闭通信
      。接收到NACK后,从设备释放对SCL和SDA线的控制;主设备就可以发送一个停止/重起始条件。
      ● 为了在收到最后一个字节后产生一个NACK脉冲,在读倒数第二个数据字节之后(在倒数第二个RxNE事件之后)必须清除ACK位。
      ● 为了产生一个停止/重起始条件,软件必须在读倒数第二个数据字节之后(在倒数第二个RxNE事件之后)设置STOP/START位。

      ● 只接收一个字节时,刚好在EV6之后(EV6_1时,清除ADDR之后)要关闭应答和停止条件的产生位。在产生了停止条件后,I2C接口自动回到从模式(M/SL位被清除)

    这里产生一个NACK其实就是清除ACK位,将ACK位置0,后面接收的一个字节不在产生应答就是非应答咯

    STM32硬件I2C与软件模拟I2C超详解
    然后通过判断EV7事件,CPU向数据寄存器读取最后一个字节数据

    硬件I2C写代码必须熟练掌握和理解主发送器和主接收器的过程,只要你理解了写代码还不是信手拈来,简简单单,然后写代码你会发送就是上面的过程一模一样

    6.I2C初始化结构体

    STM32硬件I2C与软件模拟I2C超详解
    初始化函数
    STM32硬件I2C与软件模拟I2C超详解
    • I2C_DutyCycle

    设置I 2 C的SCL线时钟的占空比。该配置有两个选择,分别为低电平时间比高电平时间为2:1 ( I2C_DutyCycle_2)和16:9(I2C_DutyCycle_16_9)。
    这个模式随便选反正区别不大。

    STM32硬件I2C与软件模拟I2C超详解
    • I2C_Ack_Enable

    配置I 2 C应答是否使能,设置为使能则可以发送响应信号。一般配置为允许应答(I2C_Ack_Enable)若STM32接收一个字节数据自动产生应答,必须要使能

    STM32硬件I2C与软件模拟I2C超详解
    配置完成之后调用一下I2C初始化函数就搞定

    记得使能I2C外设

    STM32硬件I2C与软件模拟I2C超详解

    五.EEPROM简介

    EEPROM全称: electrically-erasable, and programmable read-only memory –》可电擦除的可编程的只读存储器,这里的只读并不是只能读,是以前ROM不能写只能读,现在的EEPROM已经是可读写的啦,为什么还叫可读:只不过是保留下来的名字而已。

    STM32硬件I2C与软件模拟I2C超详解
    STM32硬件I2C与软件模拟I2C超详解

    EEPROM的设备地址(作为从机)

    STM32硬件I2C与软件模拟I2C超详解
    EEPROM通信的时候也遵循I2C协议,向产生起始信号,停止信号,应答什么的都一样的。

    1.STM32向从机EEPROM写入一个字节

    STM32硬件I2C与软件模拟I2C超详解
    写入的8个字节是连续的地址,不连续的话不能使用页写入
    STM32硬件I2C与软件模拟I2C超详解

    总结:

    • 进行页写入时,写入的存储器地址要对齐到8,也就是说只能写入地址为 0 8 16 32… 能整除8
    • 页写如只能一次写入8个字节

    规定就是规定我也没有办法,不然就会出错

    • 确认EEPROM是否写入完成:

    STM32硬件I2C与软件模拟I2C超详解
    STM32硬件I2C与软件模拟I2C超详解
    EEPROM一共有256个字节对应的地址为(0~255)
    当读取到最后一个字节,也就是255地址,第256个字节,在读取又会从头(第一个字节数据)开始读取。

    六.硬件I2C读写EEPROM实验

    实验目的

    STM32作为主机向从机EEPROM存储器写入256个字节的数据
    STM32作为主机向从机EEPROM存储器读取写入的256个字节的数据

    读写成功亮绿灯,读写失败亮红灯

    实验原理

    • 硬件设计
      原理图
      STM32硬件I2C与软件模拟I2C超详解

    编程要点
    (1) 配置通讯使用的目标引脚为开漏模式;
    (2) 编写模拟 I2C 时序的控制函数;
    (3) 编写基本 I2C 按字节收发的函数;
    (4) 编写读写 EEPROM 存储内容的函数;
    (5) 编写测试程序,对读写数据进行校验。

    两个引脚PB6,PB7都要配置成复用的开漏输出
    这里有一个注意的点,你配置成输出模式,并不会影响引脚的输入功能

    详情请看——>GPIO端口的八种工作模式

    STM32硬件I2C与软件模拟I2C超详解

    源码

    i2c_ee.h
    前面理论已经讲得已经很详细了,直接上代码叭!!

    来源:rivencode

    声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年8月17日
下一篇 2022年8月17日

相关推荐