1. HAL库I2C接口概述
在STM32嵌入式开发中,I2C总线是最常用的外设接口之一,用于连接各种传感器、EEPROM等低速设备。HAL库提供了完整的I2C驱动实现,开发者无需直接操作寄存器即可完成I2C通信。根据不同的应用场景,HAL库支持三种工作模式:轮询模式、中断模式和DMA模式。
轮询模式是最基础的使用方式,通过阻塞式调用实现数据传输,适合简单应用或初始化阶段。中断模式通过回调机制减少CPU占用,适合需要频繁I2C操作的中等复杂度系统。DMA模式则进一步解放CPU,适合大数据量传输或实时性要求高的场景。
注意:实际项目中应根据具体需求选择模式。例如,读取温度传感器这类低频操作可使用轮询模式,而持续采集IMU数据则更适合DMA模式。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 轮询模式详解
2.1 基本读写函数
HAL库提供了两组核心的轮询模式函数:
-
存储器访问函数:
HAL_I2C_Mem_Write():向指定从机地址的寄存器写入多个数据HAL_I2C_Mem_Read():从指定从机地址的寄存器读取多个数据
-
主设备传输函数:
HAL_I2C_Master_Transmit():主设备发送数据HAL_I2C_Master_Receive():主设备接收数据
这些函数都返回HAL_StatusTypeDef枚举值,开发者必须检查返回值以确保操作成功。典型错误包括总线忙(HAL_BUSY)、仲裁丢失(HAL_ERROR)等。
2.2 典型应用示例
以AT24C02 EEPROM为例,演示存储器访问函数的使用:
c复制#define EEPROM_ADDR 0xA0 // 7位地址左移1位
// 写入数据
uint8_t data[] = {0x12, 0x34};
HAL_StatusTypeDef status = HAL_I2C_Mem_Write(&hi2c1, EEPROM_ADDR, 0x00,
I2C_MEMADD_SIZE_8BIT, data, 2, 100);
if(status != HAL_OK) {
// 错误处理
}
// 读取数据
uint8_t read_buf[2];
status = HAL_I2C_Mem_Read(&hi2c1, EEPROM_ADDR, 0x00,
I2C_MEMADD_SIZE_8BIT, read_buf, 2, 100);
关键细节:I2C地址需要左移1位,最低位表示读写方向。HAL库会自动处理这一点,开发者只需提供7位地址。
2.3 常见问题与解决
-
超时问题:
- 现象:函数返回
HAL_TIMEOUT - 排查:检查从设备是否响应、SCL/SDA线是否正常、上拉电阻是否合适(通常4.7kΩ)
- 解决:适当增加超时参数,或检查硬件连接
- 现象:函数返回
-
数据错位:
- 现象:读取的数据与预期不符
- 排查:确认从设备地址、寄存器地址是否正确,特
