【问题标题】:Resetting I2C state using HAL in STM32L0 MCU在 STM32L0 MCU 中使用 HAL 重置 I2C 状态
【发布时间】:2018-06-02 18:30:51
【问题描述】:

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

【问题讨论】:

    标签: stm32 i2c hal


    【解决方案1】:

    我不知道你是否已经解决了这个问题。但是,定义一个标志来表明 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

    【讨论】:

      猜你喜欢
      • 2019-08-19
      • 2018-05-14
      • 2018-08-26
      • 2020-12-19
      • 2022-01-13
      • 2021-12-23
      • 2020-01-12
      • 2020-10-02
      • 2019-12-27
      相关资源
      最近更新 更多