STM32
直播中

刘悌耀

8年用户 1087经验值
私信 关注
[问答]

请问HAL IIC从机发送数据是在哪里进行的?

我用103做了一个从机, 接收数据在HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c)里面可以中断。数据也接收正常。但是主机读取从机数据的时候就郁闷了。 HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c)和HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c)都没有响应中断,但是数据已经发送回去了。而且就是主机写入的数据。怎么回事,用的是IIC中断, 没有用DMA.
我用另一个STM32读取60从机02地址的两个数据。什么中断都没有响应就完成了。
而且41,28是我RX接收数组里面收到的数据。
不应该是接到到从机地址或数据时就应该中断让我们判断命令吗?

回帖(1)

vinww特烦恼

2024-4-26 17:37:48
从您的描述来看,您在使用STM32的HAL库实现I2C从机时遇到了一些问题。您提到了在接收数据时,`HAL_I2C_SlaveRxCpltCallback`回调函数能够正常工作,但是在发送数据时,`HAL_I2C_SlaveTxCpltCallback`回调函数没有响应。同时,您提到了数据已经发送回去,但是没有触发相应的中断。

为了解决这个问题,我们可以尝试以下几个步骤:

1. 确保您的I2C从机配置正确。检查I2C时钟、地址、数据格式等设置是否正确。

2. 在初始化I2C从机时,确保您已经正确设置了回调函数。例如:

```c
I2C_HandleTypeDef hi2c;
hi2c.Instance = I2Cx;
hi2c.Init.ClockSpeed = 100000;
hi2c.Init.DutyCycle = I2C_DUTYCYCLE_2;
// ... 其他初始化参数
HAL_I2C_Init(&hi2c);
HAL_I2C_RegisterAddrCallback(&hi2c, HAL_I2C_ADDRCallbackID_SLAVE_TX, HAL_I2C_SlaveTxCpltCallback);
```

3. 在`HAL_I2C_SlaveTxCpltCallback`回调函数中,检查您的代码逻辑是否正确。例如,您可能需要在回调函数中处理发送完成的逻辑,例如:

```c
void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c)
{
    // 处理发送完成的逻辑
    // 例如,清除发送标志、准备下一次发送等
}
```

4. 如果问题仍然存在,您可以尝试使用STM32的HAL库提供的其他回调函数,例如`HAL_I2C_SlaveRxCpltCallback`、`HAL_I2C_SlaveAddrCallback`等,以确保您的代码在不同阶段能够正确响应。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分