最近在做一个项目,用的是
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就不更新了,感觉这里面坑还是比较多的。