首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在STM32L0单片机中使用硬件抽象层重置I2C状态

在STM32L0单片机中使用硬件抽象层重置I2C状态
EN

Stack Overflow用户
提问于 2017-12-20 16:45:16
回答 1查看 1.9K关注 0票数 0

我使用I2C工具来测试固件(基于硬件抽象层)、I2C、STM32L0单片机。当我向单片机发送命令时(通过i2cset实用程序),它会发送一个应答(在i2cget中接收)。它工作得很好。如果我在一次i2cset之后调用两次i2cget,它就会失败(这是预期的行为)。但是如果我在该错误之后执行i2cset,那么它也会失败。因此,接收-传输变得中断(没有激活回调)。如何修复呢?

目前,在HAL_I2C_SlaveTxCpltCallback()中调用HAL_I2C_Slave_Receive_IT()HAL_I2C_SlaveRxCpltCallback()调用HAL_I2C_Slave_Transmit_IT()。我是否应该将HAL_I2C_Slave_Receive_IT()放在两个回调中(与接收/发送相关)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-20 13:38:10

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

也许下面的代码可能会有用。您可以在创建deinit后重新创建。

代码语言:javascript
复制
/**
  * @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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47901930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档