STM32使用I2C

1.I2C通讯概述:

I2C(Inter-Integrated Circuit)和和SPI一样,都是实现主控芯片和外挂芯片之间的数据交流。

通信线

  • SCL(Serial Clock):串行时钟线。
  • SDA(Serial Data):串行数据线。
  • 特性

  • 同步:I2C总线是同步通信。
  • 半双工:数据可以在两个方向传输,但不能同时进行。
  • 数据应答:I2C总线支持数据应答机制。

    支持多设备

  • 一主多从:一个主设备可以连接多个从设备。
  • 多主多从:多个主设备可以连接多个从设备。
  • 起始条件:在SCL高电平期间,SDA从高电平切换到低电平,表示通信的开始。

    终止条件:在SCL高电平期间,SDA从低电平切换到高电平,表示通信的结束。

    时序单元:每个时序单元从SCL的低电平开始,并以低电平结束。

    从设备限制:从设备不允许产生起始和终止条件。

    2.硬件电路

    3. I2C时序基本单元

    起始条件:SCL高电平期间,SDA从高电平切换到低电平

    终止条件:SCL高电平期间,SDA从低电平切换到高电平

    发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节

    接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)

    主机发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答。

    应答机制

    在I2C通信中,主机发送一个数据后会立即接收一个位作为应答位,用来判断从机是否正确接收到数据。

    从机地址

    1. 发送从机地址
      1. 主机在起始条件之后,先发送一个字节(从机地址)。
      2. 所有从机会接收该字节,并与自己的地址进行比较。
      3. 如果地址匹配,相应的从机会响应主机的读写操作。
    2. 唯一地址
      1. 同一条I2C总线上的每个设备地址必须唯一,以防止主机发送一个地址时有多个设备响应。

    I2C地址类型

    7位地址:常用的I2C地址格式。

    10位地址:用于一些特殊情况下的I2C地址格式。

    设备地址分配

  • 每个I2C设备在出厂时由厂商分配一个7位地址。例如,MPU6050的地址是1101 000。
  • 不同型号的设备地址不同,相同型号的设备地址相同。
  • 地址可变部分

    对于挂在同一条总线上的相同型号设备,可以利用设备地址的可变部分来区分。

    MPU6050:

    地址的最后一位由板上的AD0引脚确定。

    AD0引脚接低电平,地址为1101 000。

    AD0引脚接高电平,地址为1101 001。

    通过这种方式,可以在同一条I2C总线上挂载多个相同型号的设备,并通过改变引脚电平来分配不同的地址,避免地址冲突。

    4. I2C时序

    (重要)

    示例

    对于从机地址为1101000的设备,在其内部0x19地址的寄存器中写入0xAA这个数据,数据帧的过程如下:

    1.起始条件:SCL高电平期间,SDA从高电平拉低。

    2.发送从机地址和读写位(1101000+0)。

    3.接收从机应答位。

    4.发送寄存器地址(0x19)。

    5.接收从机应答位。

    6.发送数据值(0xAA)。

    7.接收从机应答位。

    8.停止条件:SCL高电平期间,SDA从低电平释放至高电平。

    通过这些步骤,主机可以可靠地在从机的指定寄存器地址中写入数据。

    5.外设

    硬件资源

  • I2C外设:STM32内部集成的I2C外设,通过通信协议在时序上,驱动根据协议的规范去翻转通信引脚的高低电平。
  • I2C控制器:STM32的I2C外设包括I2C1和I2C2控制器,能够自动进行时钟生成、起始条件生成、应答位发送和接收,减轻了CPU负担。
  • 特性

    多主机模式:支持多个主机设备,可变多主机模式。

    地址模式:支持7位和10位地址模式。

    通信速度:支持不同的通信速率,标准模式最高100kHz,快速模式最高400kHz。

    DMA支持:支持DMA,在多字节传输时提高传输效率。

    兼容SMBus协议:SMBus协议用于电源管理系统(System Management Bus)。

    示例说明

    I2C地址转换:

    二进制地址1101000转换为十六进制为0x68。

    I2C通信时,需要发送7位地址和1位读写位。

    从机地址0x68左移1位再加上读写位:

    0x68左移1位为11010000(0xD0),加上读写位为0xD1。

    读写操作

    写操作:从机地址为0xD0。

    读操作:从机地址为0xD1。

    I2C在STM32中的实现

  • STM32F103C8T6集成了I2C1和I2C2两个I2C外设,支持多种功能和特性,适用于各种嵌入式应用。
  • 通过配置I2C寄存器,可以实现从机地址设置、通信速度调整、DMA传输等功能,满足不同应用需求。
  • 6. 软件和硬件I2C波形对比

    软件I2C实现

    波形特点:软件I2C的波形较为不规整,每个时钟周期和空闲时间都不一致。

    操作特点:软件I2C时的引脚操作会有一定的延时,因此各个时钟周期的间隔和占空比都不均匀。

    硬件I2C实现

    波形特点:硬件I2C的波形更加规整,时钟周期和占空比非常一致。

    操作特点:每个时钟周期后都有严格的延时,保证每个周期的时间相同。

    STM32单片机I2C通信详解_stm32 i2c-CSDN博客

    全部摘录自此博客,就是读了多遍,学习一下。

    STM32通过I2C软件读写MPU6050_stm32读取mpu6050-CSDN博客

    感觉I2C的博客写的很详细

    通过百度网盘分享的文件:0809
    链接:https://pan.baidu.com/s/1S8tbmQptUjzqZb4bBJeGAQ?pwd=4blo 
    提取码:4blo 
    –来自百度网盘超级会员V2的分享

    作者:微笑面对危险

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 I2C使用指南

    发表回复