最近在做一个项目,用的是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就不更新了,感觉这里面坑还是比较多的。 |
我也想买来试试这个硬件IIC的问题
TPS 43331,