最近在一个项目中需要用到I2C通信,我采用了STM32的MCU来实现设备之间的数据传输。STM32的I2C接口比较简单,配置起来也不算复杂,主要需要注意时钟设置和通信协议的基本流程。这里我就分享一下我用STM32实现I2C通信的简单代码示例。
I2C配置步骤首先,我使用CubeMX生成了I2C外设的初始化代码。选择好MCU型号后,按以下步骤配置:
- I2C外设:在CubeMX的“Peripherals”中选择I2C外设(比如I2C1)。
- 配置引脚:选择需要使用的I2C引脚(如PB6、PB7用于SCL和SDA)。
- 时钟设置:选择合适的I2C时钟速率,我设置为100kHz的标准模式。
- 生成代码:点击生成代码后,会自动生成I2C的初始化函数。
I2C通信代码以下是我在main.c文件中的主要代码,用于通过I2C读取从设备的数据。假设从设备的I2C地址为0x48,目标注册地址为0x00。
#include "main.h"
I2C_HandleTypeDef hi2c1;
uint8_t i2c_data[2]; // 用于接收数据的缓冲区
int main(void)
{
// 系统初始化
HAL_Init();
SystemClock_Config();
// 初始化I2C1
MX_I2C1_Init();
// 设置从设备地址(7位)
uint16_t device_address = 0x48 << 1; // STM32使用8位地址,因此要左移1位
// 读取从设备寄存器0x00的2字节数据
HAL_I2C_Mem_Read(&hi2c1, device_address, 0x00, I2C_MEMADD_SIZE_8BIT, i2c_data, 2, HAL_MAX_DELAY);
// 将读取的数据打印到串口
printf("I2C Data: %02X %02X\r\n", i2c_data[0], i2c_data[1]);
while (1)
{
// 循环等待或进一步处理数据
}
}
// 初始化I2C1函数
void MX_I2C1_Init(void)
{
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000; // 100kHz
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)
{
// 初始化错误处理
Error_Handler();
}
}
文件解析- HAL_I2C_Mem_Read:这是STM32 HAL库中的函数,用于从设备的寄存器读取数据。这里我读取的是2字节的数据,得出的参数分别是I2C句柄、设备地址、寄存器地址、地址大小、数据中心和读取长度。
- 时钟配置:100kHz是I2C标准模式的时钟频率,这个可以根据需要调整。
- 串口输出:为了方便调试,我将读取到的数据通过printf输出到了串口,可以使用终端工具查看通信结果。
总结通过STM32的I2C接口,我们可以很方便地与其他I2C设备通信。STM32 HAL库提供了丰富的API,简化了通信代码的编写。如果需要实现更复杂的I2C通信,例如多字节数据读取或发送,以及中断方式,可以参考STM32的官方文档和更多例子。希望这个简单的应用示例能够帮助到正在开发I2C相关项目的朋友!
|