STM32 I2C总线详解:低速通信的可靠选择
发布时间: 2024-07-05 23:45:44 阅读量: 70 订阅数: 46
OpenCV部署YOLOv5-pose人体姿态估计(C++和Python双版本).zip
# 1. STM32 I2C 总线概述
I2C(Inter-Integrated Circuit)总线是一种串行通信协议,用于连接微控制器和其他外围设备。在 STM32 微控制器中,I2C 总线是一种常用的通信接口,具有低成本、低功耗和高可靠性的特点。
I2C 总线采用主从模式,其中一个设备充当主设备,而其他设备充当从设备。主设备负责初始化通信并发送数据,而从设备负责接收数据并响应主设备的请求。I2C 总线使用两条线,一条用于时钟信号(SCL),另一条用于数据信号(SDA)。
# 2. STM32 I2C总线编程技巧
### 2.1 I2C总线通信协议
#### 2.1.1 总线状态和传输机制
I2C总线采用半双工通信方式,即总线在同一时刻只能有一个设备进行发送或接收操作。总线状态由以下两种信号线决定:
* **SCL(时钟线):**由主设备控制,用于同步数据传输。
* **SDA(数据线):**双向数据线,用于数据传输和设备寻址。
总线状态主要包括以下几种:
| 状态 | 描述 |
|---|---|
| 空闲 | SCL和SDA均为高电平 |
| 起始 | SCL为高,SDA从高变低 |
| 停止 | SCL为高,SDA从低变高 |
| 数据 | SCL为低,SDA为数据位 |
| 应答 | SCL为高,SDA为低(应答)或高(非应答) |
#### 2.1.2 地址寻址和数据传输
I2C总线采用7位或10位地址寻址设备。地址寻址过程如下:
1. 主设备发送起始信号。
2. 主设备发送设备地址(7位或10位)。
3. 被寻址设备发送应答信号。
数据传输过程如下:
1. 主设备发送数据位(8位)。
2. 被寻址设备发送应答信号。
3. 主设备继续发送数据位,直到传输完成。
4. 主设备发送停止信号。
### 2.2 STM32 I2C外设配置
#### 2.2.1 I2C外设寄存器结构
STM32 I2C外设包含以下主要寄存器:
| 寄存器 | 描述 |
|---|---|
| CR1 | 控制寄存器1,用于配置I2C总线模式、时钟频率等 |
| CR2 | 控制寄存器2,用于配置中断使能、DMA传输等 |
| OAR1 | 设备地址寄存器1,用于配置7位设备地址 |
| OAR2 | 设备地址寄存器2,用于配置10位设备地址 |
| DR | 数据寄存器,用于发送和接收数据 |
| SR1 | 状态寄存器1,用于指示总线状态、中断标志等 |
| SR2 | 状态寄存器2,用于指示数据传输方向、从机地址等 |
#### 2.2.2 I2C外设初始化和配置
STM32 I2C外设初始化和配置步骤如下:
1. **时钟配置:**配置I2C外设时钟源和频率。
2. **引脚配置:**配置I2C外设引脚为复用功能,连接到SCL和SDA总线。
3. **外设初始化:**配置I2C外设寄存器,包括模式、时钟频率、中断使能等。
4. **地址配置:**配置I2C外设地址,包括7位或10位地址。
```c
// I2C外设初始化函数
void I2C_Init(I2C_TypeDef *I2Cx)
{
// 时钟配置
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
// 引脚配置
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 外设初始化
I2C_InitTypeDef I2C_InitStructure;
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_ClockSpeed = 100000;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x0A;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_Init(I2C1, &I2C_InitStructure);
// 中断使能
I2C_ITConfig(I2C1, I2C_IT_EVT, ENABLE);
I2C_ITConfig(I2C1, I2C_IT_ERR, ENABLE);
}
```
### 2.3 I2C总线中断处理
#### 2.3.1 中断源和中断处理程序
STM32 I2C外设支持以下中断源:
* **事件中断:**包括起始条件检测、从机地址匹配、数据传输完成等事件。
* **错误中断:**包括
0
0