You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32WB55无CubeMX配置I2C读取传感器返回HAL_ERROR问题

STM32WB55 Zigbee项目中I2C读取返回HAL_ERROR的排查方案

问题背景

使用STM32Wb55RGv6开发板,基于无.ioc文件的Zigbee示例项目Projects\P-NUCLEO-WB55.Nucleo\Applications\Zigbee\Zigbee_APS_Router,通过复制CubeMX生成的I2C1初始化函数MX_I2C1_Init(void)到目标项目,并开启stm32wbxx_hal_conf.h中的I2C配置。测试项目中传感器读取正常,但Zigbee项目中读取返回HAL_ERROR。初始化代码如下:

/* I2C init function */
void MX_I2C1_Init(void)
{

    /* USER CODE BEGIN I2C1_Init 0 */
    GPIO_InitTypeDef GPIO_InitStruct;

    /* Configure I2C pins */
    GPIO_InitStruct.Pin       = GPIO_PIN_9 | GPIO_PIN_10;
    GPIO_InitStruct.Mode      = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull      = GPIO_PULLUP;
    GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* USER CODE END I2C1_Init 1 */
    hi2c1.Instance = I2C1;
    hi2c1.Init.Timing = 0x00000E14;
    hi2c1.Init.OwnAddress1 = 0;
    hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
    hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
    hi2c1.Init.OwnAddress2 = 0;
    hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
    hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
    hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
    if (HAL_I2C_Init(&hi2c1) != HAL_OK)
    {
        Error_Handler();
    }

    /** Configure Analogue filter  */
    if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
    {
        Error_Handler();
    }

    /** Configure Digital filter*/
    if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK)
    {
        Error_Handler();
    }
    /* USER CODE BEGIN I2C1_Init 2 */

    /* USER CODE END I2C1_Init 2 */
}
/* I2C init function */

排查步骤

1. 检查I2C时钟配置

Zigbee项目的时钟树可能和测试项目存在差异,需确认I2C1的外设时钟配置:

  • 确认目标项目中__HAL_RCC_I2C1_CLK_ENABLE()已被正确调用,Zigbee项目的RCC初始化流程没有关闭或覆盖I2C1的时钟使能。
  • 对比测试项目和目标项目的APB1总线时钟频率,I2C的Timing参数0x00000E14对应特定总线时钟,若目标项目时钟不同,需通过CubeMX重新生成匹配的Timing值。

2. 排查引脚资源冲突

STM32WB55的GPIO引脚可能被Zigbee栈或其他外设占用:

  • 遍历目标项目中所有HAL_GPIO_Init调用,确认PA9、PA10引脚未被重复初始化为其他功能(如BLE/Zigbee的RF控制引脚、调试引脚等)。
  • 核对开发板原理图,确认PA9/PA10是否与Zigbee模块硬件引脚复用,排除硬件层面的引脚冲突。

3. 确认HAL初始化顺序

Zigbee栈的初始化时机可能影响I2C外设:

  • 确保MX_I2C1_Init在Zigbee栈初始化完成后调用,避免栈初始化过程中重置I2C相关寄存器。
  • 避免在Zigbee栈的中断回调函数中执行I2C读写操作,确保I2C操作在主循环或非抢占式上下文执行。

4. 定位HAL_ERROR的具体原因

通过HAL错误寄存器精准定位问题:

  • 调用I2C读写函数后,读取hi2c1.ErrorCode的值,对照stm32wbxx_hal_i2c.h中的错误码(如HAL_I2C_ERROR_BERR总线错误、HAL_I2C_ERROR_ARLO仲裁丢失、HAL_I2C_ERROR_AF应答失败等),明确故障类型。
  • 例如,若错误码为HAL_I2C_ERROR_AF,需排查传感器地址是否正确、传感器供电是否正常或总线时序是否匹配。

5. 检查Zigbee栈的资源占用

Zigbee栈可能占用I2C相关的中断或DMA资源:

  • 查看NVIC配置,确认I2C1的中断优先级未被Zigbee栈的高优先级中断抢占,导致I2C操作被打断。
  • 若使用DMA模式,确认DMA通道未被Zigbee栈占用,且DMA初始化参数正确。

6. 硬件层面排查

  • 确认传感器供电电压正常,SDA/SCL引脚的上拉电阻(开发板自带或外接)存在且阻值符合要求。
  • 使用示波器或逻辑分析仪抓取I2C总线波形,对比测试项目和目标项目的起始信号、地址帧、应答信号,排查总线通信异常点。

内容的提问来源于stack exchange,提问作者mennodedam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:07:50