STM32 I2C总线通信:协议、配置与故障排除全攻略
发布时间: 2024-07-01 18:57:37 阅读量: 125 订阅数: 99
STM32的I2C通信
![STM32 I2C总线通信:协议、配置与故障排除全攻略](https://img-blog.csdnimg.cn/c3437fdc0e3e4032a7d40fcf04887831.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiN55-l5ZCN55qE5aW95Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
# 1. STM32 I2C总线基础
I2C(Inter-Integrated Circuit)总线是一种串行通信协议,广泛用于连接微控制器和外围设备。它以其简单性、低成本和高可靠性而著称。
在STM32微控制器中,I2C总线通过一个称为I2C外设的专用硬件模块实现。I2C外设提供了一个标准的I2C接口,允许STM32与其他I2C设备通信。
I2C总线采用主从模式工作。一个设备充当主设备,负责启动和控制通信,而其他设备充当从设备,响应主设备的请求。主设备和从设备通过两条线连接:串行数据线(SDA)和串行时钟线(SCL)。
# 2. STM32 I2C总线配置与编程
### 2.1 I2C总线硬件配置
#### 2.1.1 引脚配置
STM32 I2C总线需要两个引脚:串行数据线(SDA)和串行时钟线(SCL)。这些引脚通常使用开放漏极或开漏输出配置,并连接到上拉电阻。
```c
// I2C引脚配置
GPIO_InitTypeDef GPIO_InitStruct;
// 初始化SDA引脚
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// 初始化SCL引脚
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
```
#### 2.1.2 中断配置
I2C总线支持中断,可以用于处理数据传输完成、错误等事件。中断配置需要在I2C总线初始化之前完成。
```c
// I2C中断配置
NVIC_InitTypeDef NVIC_InitStruct;
// 初始化I2C1中断
NVIC_InitStruct.IRQChannel = I2C1_EV_IRQn;
NVIC_InitStruct.PreemptPriority = 0;
NVIC_InitStruct.SubPriority = 0;
NVIC_InitStruct.Enable = ENABLE;
HAL_NVIC_Init(&NVIC_InitStruct);
```
### 2.2 I2C总线软件编程
#### 2.2.1 I2C总线初始化
I2C总线初始化需要配置总线时钟、模式、从机地址等参数。
```c
// I2C总线初始化
I2C_HandleTypeDef hi2c1;
// 初始化I2C1总线
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0x0A;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0xFF;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
HAL_I2C_Init(&hi2c1);
```
#### 2.2.2 I2C总线数据传输
I2C总线数据传输包括主模式和从模式。主模式下,STM32作为主设备发起数据传输,从模式下,STM32作为从设备接收数据。
```c
// 主模式数据传输
uint8_t data[] = {0x01, 0x02, 0x03};
HAL_I2C_Master_Transmit(&hi2c1, 0x5A, data, 3, 100);
// 从模式数据传输
uint8_t rx_data[3];
HAL_I2C_Slave_Receive(&hi2c1, rx_data, 3, 100);
```
0
0