我使用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()
置于两个回调中(接收/发送相关)吗?
答案 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);
}
,并且在这些链接中有一个很好的例子。