同事发现用软件ok,用硬件有时fail,跟踪有时候芯片没回ACK。最后看HAL库代码是,如果I2C中间出错,软件lock导致一直busy.
另外的两篇文章说的是说单片机I2C寄存器里面的状态已经设置了busy:
STM32F 单片机硬件I2C Busy标志导致的I2C卡死的处理办法_stm32标准库i2c busy-CSDN博客
STM32F103 I2C硬件缺陷详述及解决方案_stm32 i2c硬件缺陷-CSDN博客
[C] 纯文本查看 复制代码 HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
/* Init tickstart for timeout management*/
uint32_t tickstart = HAL_GetTick();
/* Process Locked */
__HAL_LOCK(hi2c);
/* Send Slave Address */
if (I2C_MasterRequestWrite(hi2c, DevAddress, Timeout, tickstart) != HAL_OK)
{
[color=#ff8c00]return HAL_ERROR; 这个地方直接退出去了,导致一直是lock的标志[/color]
}
/* Process Unlocked */
__HAL_UNLOCK(hi2c);
return HAL_OK;
}
}
|