我使用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()放在两个回调中(与接收/发送相关)?
发布于 2018-11-20 13:38:10
我不知道你是否解决了这个问题。但是,更准确的做法是定义一个标志,说明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://stackoverflow.com/questions/47901930
复制相似问题