stm32-IIC总结

总结stm32中的IIC通信

概要

与SPI一样,它仅适用于单个设备内的短距离通信。与 ASI(如 RS-232 或 UART)一样,它只需要两根信号线即可交换信息。SparkFun 的 Qwiic Connect 系统利用 I 2 C 的优势,允许不同的传感器、执行器、显示器等通过极化电缆以菊花链方式连接在一起。

I2C通信的特点

  1. 串行
  2. 半双工
  3. 同步
  4. 只需2根线(SCL、SDA)
  5. 可以多主机进行通信

I2C的传输速度

具有三种传输模式:标准模式传输速率为100kbit/s ,快速模式为400kbit/s , 高速模式下可达 3.4Mbit/s,但目前大多I2C设备尚不支持高速模式。

I2C可挂载的设备

连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制。最大的IC总线的数量还受到了地址位的个数(7bit地址位,或者是10bit地址位)在7bit下2^7有128-1(0x00无效)。

I2C的总线“线与”功能,只要有一个设备发出了低信号,则整个总线就是低信号

主机发送结束条件(P)终止一次传输。主机也可以通过发起重复开始条件(Sr)进行一次新的传输,而不需要先产生结束条件(P)。

I2C的仲裁方式

遵循“低电平优先”的原则,即谁先发送低电平谁就会掌握对总线的控制权。

I2C通信的流程和对应的电平状态

首先I2C的两根线在空闲状态下都是高电平。

I2C通信开始信号和结束信号

由于这个开始信号所以导致了,I2C通信在只有在SCL线为高电平时SDA线才是有效的。只有在SCL线为低电平的时候,SDA线才是允许变化的。因为在SCL为高电平时SDA线变化的话就先当于开始信号或者是结束信号。

响应信号:传输时主机产生时钟,在第9个时钟时,数据发送端会释放SDA的控制权,由数据接收端控制SDA, 若SDA为高电平,表示非应答信号(NACK),低电平表示应答信号(ACK)。

I2C中的三种基本读写步骤

第三种:读和写数据

除了基本的读写,I2C通讯更常用的是复合格式,即第三幅图的情况,该传输过程有两次起始信号(S)。一般在第一次传输中, 主机通过SLAVE_ADDRESS寻找到从设备后,发送一段“数据”,这段数据通常用于表示从设备内部的寄存器或存储器地址(注意区分它与SLAVE_ADDRESS的区别); 在第二次的传输中,对该地址的内容进行读或写。也就是说,第一次通讯是告诉从机读写地址,第二次则是读写的实际内容。如果主机接收器发送一个重复起始条件 它之前应该发送了一个不响应信号

7bit寻址

I2C总线的寻址过程是通常在起始条件后的第一个字节决定了主机选择哪一个从机。例外的情况是可以寻址所有器件的 广播呼叫 地址 使用这个地址时 理论上所有器件都会发出一个响应,但是也可以使器件忽略这个地址,广播呼叫地址的第二个字节定义了要采取的行动。

第一个字节的未定义

由于I2C通信每次都是发送8bit数据,其第一个数据一般都是地址位:

第一个字节的最低位是 0 表示主机会写信息到被选中的从机 1 表示主机会向从机读信息。

从机地址由一个固定和一个可编程的部分构成,由于很可能在一个系统中有几个同样的器件。从机地址的可编程部分控制了可以连接到I2C总线上的同器件的最大数量。器件可编程地址位的数量由它可使用的管脚决定。例如,如果器件有 4 个固定的和 3 个可编程的地址位,那么相同的总线上共可以连接 8 个相同的器件。

10位寻址

注意,7位寻址方式是可以和10位寻址方式同存的。

stm32中的I2C外设

在stm32f10x中的,有两个I2C控制器。其结构图如下:

其中接收器和发送器:

注意图中的EV7_1就是EV7

I2C通讯的优缺点

优点:

  1. 只有两根线,结构简单
  2. 具有应答位,数据传输的准确性有一定的保障
  3. 支持多个主机和多个从机

缺点:

  1. 有开始位、停止位、应答位,导致数据传输不稳定,传输速度低
  2. 数据帧大小被限制为8bit

编程

初始化结构体

1
2
3
4
5
6
7
8
typedef struct {
uint32_t I2C_ClockSpeed; /*!< 设置SCL时钟频率,此值要低于400000*/
uint16_t I2C_Mode; /*!< 指定工作模式,可选I2C模式及SMBUS模式 */
uint16_t I2C_DutyCycle; /*指定时钟占空比,可选low/high = 2:1及16:9模式*/
uint16_t I2C_OwnAddress1; /*!< 指定自身的I2C设备地址 */
uint16_t I2C_Ack; /*!< 使能或关闭响应(一般都要使能) */
uint16_t I2C_AcknowledgedAddress; /*!< 指定地址的长度,可为7位及10位 */
} I2C_InitTypeDef;

注意的是,I2C_OwnAddress1是随意设置的。只要不和其他挂载在IIC总线上的设备地址一致即可。

编程步骤

  1. 定义初始化结构体进行初始化配置
  2. 使用I2C_Init()函数完成初始化
  3. 使用I2C_CMD()函数打开I2C外设

I2C外设不需要使用RCC函数打开时钟

I2C传输步骤

I2C_GenerateSTOP()这个函数是用来创建停止条件的,不是发送停止信号的。
其他的I2C_GenerateXX()函数是一样的,都是创建条件而不是直接发送信号。

stm32中标准库的相关函数

1
2


参考资料


stm32-IIC总结
https://ysc2.github.io/ysc2.github.io/2023/12/01/stm32-IIC总结/
作者
Ysc
发布于
2023年12月1日
许可协议