在 STM32L0 MCU 中使用 HAL 重置 I2C 状态

Resetting I2C state using HAL in STM32L0 MCU

我使用 I2C 工具测试固件(基于 HAL)、I2C、STM32L0 MCU。当我向 MCU 发送命令(通过 i2cset 实用程序)时,它会发送一个答案(在 i2cget 中收到)。它工作正常。如果我在单个 i2cset 之后调用 i2cget 两次,它会失败(这是预期的行为)。但是如果我在那个错误之后执行 i2cset,那么它也会失败。因此,接收传输中断(没有激活回调)。如何修复?

目前,HAL_I2C_Slave_Receive_IT()HAL_I2C_SlaveTxCpltCallback() 中调用。 HAL_I2C_SlaveRxCpltCallback() 呼叫 HAL_I2C_Slave_Transmit_IT()。我应该把 HAL_I2C_Slave_Receive_IT() 放在两个回调中吗(receive/transmit 相关)?

不知道你有没有解决这个问题。但是,更准确的做法是定义一个标志,表明 HAL_I2C_SlaveTxCpltCallback、HAL_I2C_SlaveRxCpltCallback 和 HAL_I2C_ErrorCallback 函数已完成传输或发生错误。

也许以下代码可能有用。你可以在 deinit 之后重新初始化。

/**
  * @brief  Initialize and setup GPIO and I2C peripheral
  * @param  obj : pointer to i2c_t structure
  * @retval none
  */
void i2c_deinit(i2c_t *obj)
{
  HAL_NVIC_DisableIRQ(obj->irq);
#if !defined(STM32F0xx) && !defined(STM32L0xx)
  HAL_NVIC_DisableIRQ(obj->irqER);
#endif // !defined(STM32F0xx) && !defined(STM32L0xx)
  HAL_I2C_DeInit(&(obj->handle));
}


void LDC_I2C_ReInit(void)
    {
    HAL_I2C_Init(&hi2c1);
    }

它在这些链接中有一个很好的例子。

https://github.com/stm32duino/Arduino_Core_STM32/blob/c392140415b3cf29100062ecb083adfa0f59f8b1/cores/arduino/stm32/twi.h

https://github.com/stm32duino/Arduino_Core_STM32/blob/c392140415b3cf29100062ecb083adfa0f59f8b1/cores/arduino/stm32/twi.c