打印
[STM32F1]

使用STM32实现I2C通信的基本应用示例

[复制链接]
380|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Clyde011|  楼主 | 2024-10-2 12:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在一个项目中需要用到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相关项目的朋友!

使用特权

评论回复
沙发
公羊子丹| | 2024-10-2 12:28 | 只看该作者
哇,这个I2C通信代码太实用了,我最近正好也在搞这个,正需要参考!

使用特权

评论回复
板凳
童雨竹| | 2024-10-2 12:28 | 只看该作者
感谢分享,没想到通过CubeMX配置I2C这么方便,之前还担心代码会很复杂。

使用特权

评论回复
地板
周半梅| | 2024-10-2 12:29 | 只看该作者
大佬讲解得真清楚,准备照着你的代码试试,期待能跑通!

使用特权

评论回复
5
帛灿灿| | 2024-10-2 12:30 | 只看该作者
哈哈,原来设备地址还得左移1位,之前一直卡在这儿,学到了!

使用特权

评论回复
6
万图| | 2024-10-2 12:30 | 只看该作者
STM32的HAL库看起来真的很强大,I2C通信处理起来这么简洁!

使用特权

评论回复
7
Wordsworth| | 2024-10-2 12:31 | 只看该作者
我也用STM32搞过I2C,不过你这个写得更简洁明了,受教了。

使用特权

评论回复
8
Pulitzer| | 2024-10-2 12:33 | 只看该作者
串口打印这招很实用,调试I2C数据真的方便很多!

使用特权

评论回复
9
Bblythe| | 2024-10-2 12:34 | 只看该作者
这个代码块太好了,正好我也在用I2C读取传感器数据,帮大忙了!

使用特权

评论回复
10
Uriah| | 2024-10-2 12:34 | 只看该作者
请问如果我想用中断的方式读取I2C数据,需要怎么改呢?

使用特权

评论回复
11
o88ne| | 2024-10-2 21:04 | 只看该作者
STM32的I2C接口比较简单,配置起来也不算复杂

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

3378

帖子

0

粉丝