代码之家  ›  专栏  ›  技术社区  ›  ilya

STM32L0单片机中利用HAL复位I2C状态

  •  0
  • ilya  · 技术社区  · 7 年前

    我使用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\u I2C\u Slave\u Receive\u IT() 在两次回调中(接收/发送相关)?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Zafer SEN    6 年前

    我不知道你是否解决了这个问题。但是,更准确的做法是定义一个标志,表明HAL\U I2C\U SlaveTxCpltCallback、HAL\U I2C\U SlaveRxCpltCallback和HAL\U I2C\U 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