登录/注册

STM32的I2C做从机

STM32的I2C做从机

更多

在STM32中配置I2C从机(Slave)模式需遵循以下步骤和注意事项,以标准外设库(如HAL库)为例:


关键步骤

  1. 初始化I2C外设

    I2C_HandleTypeDef hi2c1;
    
    void I2C1_Init(void) {
     hi2c1.Instance = I2C1;                     // 选择I2C实例
     hi2c1.Init.ClockSpeed = 0;                 // 从机无需设置时钟速度(主机专用)
     hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;    // 占空比(若支持)
     hi2c1.Init.OwnAddress1 = 0x0A;             // 从机自身地址(7位格式)
     hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; // 7位地址模式
     hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; // 禁用双地址
     hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; // 禁用广播呼叫
     hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;    // 时钟延展(按需启用)
     HAL_I2C_Init(&hi2c1);
    }
  2. 启用I2C中断

    • 在NVIC中配置I2C事件中断和错误中断:
      HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);
      HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
      HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);
      HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);
  3. 实现中断服务函数

    • I2Cx_EV_IRQHandler 处理事件:
      void I2C1_EV_IRQHandler(void) {
      HAL_I2C_EV_IRQHandler(&hi2c1); // HAL库的事件处理
      }
    • I2Cx_ER_IRQHandler 处理错误:
      void I2C1_ER_IRQHandler(void) {
      HAL_I2C_ER_IRQHandler(&hi2c1); // HAL库的错误处理
      }
  4. 处理I2C回调函数

    • 重写从机事件回调:
      void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode) {
      if (TransferDirection == I2C_DIRECTION_TRANSMIT) {
       // 主机请求读取数据(从机需发送)
      } else if (TransferDirection == I2C_DIRECTION_RECEIVE) {
       // 主机请求写入数据(从机需接收)
      }
      }
    • 重写接收完成回调:
      void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c) {
      // 主机写入数据完成,处理接收到的数据
      }
    • 重写发送完成回调:
      void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c) {
      // 主机读取数据完成,可更新发送缓冲区
      }
  5. 准备数据发送/接收

    • 启动从机接收(主机写入时):
      uint8_t rxBuffer[10];
      HAL_I2C_Slave_Receive_IT(&hi2c1, rxBuffer, sizeof(rxBuffer));
    • 启动从机发送(主机读取时):
      uint8_t txBuffer[] = "Hello";
      HAL_I2C_Slave_Transmit_IT(&hi2c1, txBuffer, sizeof(txBuffer));

注意事项

  1. 时钟延展(Clock Stretching)

    • 若从机需要更多时间处理数据,启用 I2C_NOSTRETCH_ENABLE(通过SCL低电平延展时钟)。
  2. 地址匹配

    • 确保I2C主机发送的地址与从机配置的 OwnAddress1 一致(7位地址需左移1位后比较)。
  3. 错误处理

    • HAL_I2C_ErrorCallback 中处理超时、仲裁丢失等错误:
      void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c) {
      uint32_t error = HAL_I2C_GetError(hi2c);
      // 处理错误(如重置I2C)
      }
  4. 多从机支持

    • 如需响应多个地址,启用双地址模式并设置 OwnAddress2

调试技巧


完整示例代码

// 初始化I2C
I2C1_Init();

// 启动初始接收(等待主机写入)
uint8_t rxData[10];
HAL_I2C_Slave_Receive_IT(&hi2c1, rxData, 10);

// 在回调函数中处理数据
void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c) {
  // 处理接收到的数据(rxData数组)
  // 重新启动接收以等待下次传输
  HAL_I2C_Slave_Receive_IT(&hi2c1, rxData, 10);
}

? 提示:不同STM32系列可能存在差异,请参考对应型号的《参考手册》和《应用笔记》调整配置。使用CubeMX可自动生成初始化代码。

I2C总线与单片的连接

在现代电子系统中,单片机(MCU)是核心控制单元,而I2C总线作为一种多主机、多从机

2025-01-17 15:18:40

对于STM32I2C Layout走线多长合适呢?

今天来讨论一个I2C走线问题,过程是通过用ST提供的IBIS模型,从SI的角度出发,做SI仿真来评估

2023-09-27 15:31:59

I2CI3C的区别有哪些

I2C 和 I3C 主要区别如下: I2C 虽然也是两条线,但是很多时候传感器需要一条额外的中断线,来告诉主控数据已经准备好。

2023-07-22 16:20:20

STM32 I2C存取实验资料

STM32 I2C存取实验资料

资料下载 郑兵 2021-12-30 10:36:41

STM32F0 HAL库 I2C 配置

参考链接:http://blog.sina.com.cn/s/blog_95cc46f40102yika.htmlSTM32 I2C从

资料下载 佚名 2021-12-28 19:29:18

STM32F103硬件I2C Slave

MCU:STM32F103IDE:STM32CubeIDEHAL库硬件I2C当作Slave,模拟EEPROM行为测试工具:树莓派为

资料下载 goodmbby 2021-12-20 19:38:54

STM32作为I2C中断接收和模式中断应答数据总结

之前在项目中用到了STM32F103的i2c功能,大致功能是两个单片机进行i2c

资料下载 远不及你 2021-12-02 19:21:32

STM32学习之I2C协议(读写EEPROM)

关于STM32学习分享第七章 I2C协议(读写EEPROM)文章目录关于STM32学习分享前言二、代码1.

资料下载 佚名 2021-11-30 15:21:11

I2C先写后读是什么

I2C 读 I2C 先写后读 其实所谓的 I2C 读,都是先写后读。 I2C

2023-07-22 15:58:08

MK26 MCU I2C模式的1Mhz配置步骤

在 MK26 MCU中,使用 I2C作为从机,设置 CLK时钟速率为 1MHz。I2C

2023-04-07 15:44:02

软件模拟I2C的实现方法及注意事项

在使用I2C通信时,一般会用到软件模拟I2C。目前网络上能搜索到的软件模拟I2C一般都是模拟

2023-01-17 14:56:24

STM32 I2C中断模式测试

STM32 I2C从机中断模式测试可用;可在此基础上修改代码使用;一、

2022-02-22 07:43:01

STM32 I2C硬件的结构

我们可以看见STM32的硬件I2C有两个和数据有关的寄存器“数据寄存器(Data register)”(DR)和“数据移位寄存器(Data shift register)”(DSR),我们的软件写入的是DR, DSR

2020-04-30 15:00:29

单片I2C通信设计

I2C每一位信号的时序流程,而I2C通信在字节级的传输中,也有固定的时序要求。I2C通信的起始信号(Start)后,首先要发送一个

2019-12-03 16:06:54

基于MCS-51单片I2C总线接口电路的设计

在单片机控制系统中,广泛使用I2C器件。如果单片机自带I2C总线接口,则

2019-10-15 16:13:27

7天热门专题 换一换
相关标签