STM32
直播中

李郝荫

7年用户 1267经验值
私信 关注
[问答]

关于STM32F105 HAL库I2C问题求解

最近在做一个项目,用的是STM32F105系列,用了官方的Hal库,大致是这样的,用I2C来控制一个ti电源芯片,电源芯片有一个EN脚需要软件来控制,关机后,把EN脚拉低,这时候就进入Standby模式,在该模式下电源芯片是不响应I2C命令的。1. 先写了00数据给电源芯片让它关闭DCDC的电源。

2.写Disable脚
两步连续操作有就会导致最后一个字节00写进去后,电源芯片没有应答。在I2C写完的地方打个断点,就有应答,于是在1和2之间加了一个延时,就会有应答。于是猜测,1步没有执行完,就跳出了,导致执行了2,使得电源芯片进入了Standby模式。每次都是最后一个字节,Stop之前没有应答。

可能是Hal库的问题,在生成停止条件之前,没有判断数据是否发完
HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)


在生成停止条件之前加了一句等待BTF标志的话,这样应答是有了,但是EN脚在Stop的时候就已经被拉成Disable了。
  /* Wait until BTF flag is set */
    if(I2C_WaitOnBTFFlagUntilTimeout(hi2c, Timeout) != HAL_OK)
    {
      if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
      {
        /* Generate Stop */
        SET_BIT(hi2c->Instance->CR1,I2C_CR1_STOP);
        return HAL_ERROR;
      }
      else
      {
        return HAL_TIMEOUT;
      }
    }

    /* Generate Stop */
    SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);


在生成STOP条件之前没法判断STOP是否完成,不知道ST后面有没有更新F1的Hal库,是不是更新到1.4就不更新了,感觉这里面坑还是比较多的。




回帖(1)

CDCNKA

2024-5-8 17:20:43
根据您提供的信息,您在使用STM32F105系列的HAL库通过I2C控制一个TI电源芯片。您遇到了一个问题,即在执行两个连续的I2C操作时,最后一个字节没有得到应答。您怀疑这是因为第一个操作没有执行完就跳出了,导致电源芯片进入了Standby模式。

为了解决这个问题,您可以尝试以下步骤:

1. 确保I2C通信初始化正确:检查I2C时钟、速率和地址设置是否正确。

2. 使用HAL库的I2C通信函数:确保您使用了HAL库提供的I2C通信函数,如HAL_I2C_Master_Transmit()和HAL_I2C_Master_Receive()。

3. 检查I2C中断:如果您的项目中使用了I2C中断,请确保正确配置了中断优先级和中断服务例程。

4. 在两个操作之间添加延时:您已经尝试过在两个操作之间添加延时,这可能是一个有效的解决方案。您可以尝试使用HAL_Delay()函数来添加延时。

5. 使用I2C总线空闲检查:在执行第二个操作之前,您可以检查I2C总线是否空闲。这可以通过HAL_I2C_IsDeviceReady()函数实现。

6. 使用I2C通信完成回调:HAL库提供了一个I2C通信完成回调函数,您可以在该回调函数中添加延时,以确保第一个操作已经完成。

7. 检查电源芯片的数据手册:确保您遵循了电源芯片的数据手册中的操作步骤和时序要求。

8. 使用调试工具:使用调试工具(如ST-LINK)来跟踪I2C通信过程,以便更好地了解问题所在。

9. 考虑使用DMA:如果可能,您可以考虑使用DMA(直接内存访问)来提高I2C通信的效率。

10. 更新HAL库:确保您使用的是最新版本的HAL库,因为新版本可能包含了一些错误修复和性能改进。

通过尝试以上步骤,您应该能够找到问题的原因并解决它。如果问题仍然存在,请提供更多详细信息,以便进一步分析。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分