leiyijing2003 发表于 2017-2-24 15:52:29

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就不更新了,感觉这里面坑还是比较多的。




我不怕2106 发表于 2017-2-25 07:59:00

你应该也是硬件IIC吧,我和你一样的芯片,一样的问题,搞得我现在不得不改为模拟方式,真是

奏奏奏 发表于 2017-2-25 08:41:57

楼主用的是具体哪一款TI电源芯片?
我也想买来试试这个硬件IIC的问题

leiyijing2003 发表于 2017-2-25 09:45:16

奏奏奏 发表于 2017-2-25 08:41
楼主用的是具体哪一款TI电源芯片?
我也想买来试试这个硬件IIC的问题

TPS 43331,
页: [1]
查看完整版本: HAL库I2C问题咨询