STM32 I2C 主从通信
介绍
I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,广泛用于连接微控制器与各种外设,如传感器、EEPROM 和 LCD 显示器等。I2C 协议使用两根线进行通信:SDA(数据线)和 SCL(时钟线)。它支持多主从架构,允许多个设备在同一总线上通信。
在 STM32 微控制器中,I2C 通信可以通过硬件 I2C 外设实现,也可以通过软件模拟实现。本文将重点介绍如何使用 STM32 的硬件 I2C 外设实现主从通信。
I2C 通信基础
I2C 通信基于主从模式,主设备负责发起通信并控制时钟信号,而从设备则响应主设备的请求。每个从设备都有一个唯一的 7 位或 10 位地址,主设备通过该地址与特定的从设备通信。
I2C 通信的基本步骤如下:
- 主设备发送起始条件(Start Condition)。
- 主设备发送从设备地址和读写位。
- 从设备发送确认信号(ACK)。
- 主设备发送或接收数据。
- 主设备发送停止条件(Stop Condition)。
STM32 I2C 主从通信实现
硬件配置
在 STM32 中,I2C 外设的配置包括设置时钟速度、引脚复用和地址模式等。以下是一个典型的 I2C 初始化代码示例:
#include "stm32f4xx_hal.h"
I2C_HandleTypeDef hi2c1;
void I2C1_Init(void) {
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000; // 100 kHz
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK) {
// 初始化错误处理
}
}
主设备发送数据
以下代码展示了主设备如何向从设备发送数据:
uint8_t data[] = {0x01, 0x02, 0x03};
HAL_I2C_Master_Transmit(&hi2c1, 0xA0, data, 3, 100);
在这个例子中,0xA0
是从设备的地址,data
是要发送的数据,3
是数据的长度,100
是超时时间(以毫秒为单位)。
从设备接收数据
以下代码展示了从设备如何接收数据:
uint8_t buffer[3];
HAL_I2C_Slave_Receive(&hi2c1, buffer, 3, 100);
在这个例子中,buffer
是用于存储接收数据的数组,3
是要接收的数据长度,100
是超时时间。
实际应用场景
温度传感器读取
假设我们有一个 I2C 温度传感器,其地址为 0x48
。我们可以使用以下代码读取温度数据:
uint8_t tempData[2];
HAL_I2C_Master_Receive(&hi2c1, 0x48, tempData, 2, 100);
int16_t temperature = (tempData[0] << 8) | tempData[1];
EEPROM 数据存储
另一个常见的应用是使用 I2C EEPROM 存储数据。以下代码展示了如何向 EEPROM 写入数据:
uint8_t eepromAddress = 0x50;
uint8_t data[] = {0x01, 0x02, 0x03};
HAL_I2C_Mem_Write(&hi2c1, eepromAddress, 0x0000, I2C_MEMADD_SIZE_16BIT, data, 3, 100);
总结
I2C 是一种简单而强大的通信协议,适用于连接多个设备。通过 STM32 的硬件 I2C 外设,我们可以轻松实现主从通信。本文介绍了 I2C 的基本概念、STM32 的配置方法以及实际应用场景。
附加资源与练习
- 练习 1:尝试修改代码,使其支持 10 位地址模式。
- 练习 2:使用 I2C 连接多个传感器,并读取它们的数据。
- 资源:参考 STM32 官方文档,了解更多关于 I2C 外设的详细信息。
在实际项目中,建议使用 HAL 库提供的函数来简化 I2C 通信的实现。同时,注意处理可能的错误情况,如总线冲突或从设备无响应。