在STM32L0 MCU中使用HAL复位I2C状态

时间:2017-12-20 08:45:16

标签: stm32 i2c hal

我使用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()置于两个回调中(接收/发送相关)吗?

1 个答案:

答案 0 :(得分:1)

我不知道您是否解决了这个问题。但是,更准确地定义一个标志,该标志指出HAL_I2C_SlaveTxCpltCallback,HAL_I2C_SlaveRxCpltCallback和HAL_I2C_ErrorCallback函数已完成传输或发生了错误。

以下代码可能有用。您可以在取消初始化后重新初始化。

/**
  * @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