繁体   English   中英

如何使用 STM32 HAL 了解通过 I2C 接收了多少字节?

[英]How to learn how many bytes were received via I2C using the STM32 HAL?

作为 I2C 从机,我使用 STM32 HAL 成功读取字节。

我如何知道在 STOP 之前收到了多少字节?

我目前通过以下实现读取接收到的数据:

void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c) {
    const uint8_t register_to_write = rx_buffer[0];
    const uint8_t * rx_data = rx_buffer + 1;
    ...
}

我从我之前给的rx_buffer中读取:

HAL_I2C_Slave_Seq_Receive_IT(&hi2c1, rx_buffer, RX_BUFFER_SIZE, I2C_FIRST_FRAME)

I2C CR2(控制寄存器 2)除其他外具有 NBYTES 字段

在此处输入图像描述

其中 SBC 是“从字节控制”,在 I2C CR1 中设置,具体内容当然在参考手册的 I2C 部分。

看起来 NBYTES 是用您希望在传输发生之前接收的字节数进行编程的。 因此,如果您为 HAL 提供 10 字节缓冲区,我希望在物理通信开始之前在 NBYTES 字段中看到 10。 因此,如果您接收到的字节数较少,那么在 NBYTES 中预期“剩余”值是合理的——通信结束后还有多少字节尚未接收(逻辑与 DMA 计数器相同)。 因此,如果您的接收缓冲区长度为 10,但在通信之后,NBYTES 为 4,那么您收到 10-4=6 个字节的数据。 当然,检查 HAL 如何准确设置 NBYTES 以及它是否在接收结束时将其无效是您的工作。 但是,是的,原则上,这是完全可行的。

一个更容易访问的变量是XferCount

void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c)
{
    const size_t size = RX_BUFFER_SIZE - 1 - hi2c->XferCount;
    ...

就我而言, RX_BUFFER_SIZE == 33并且在接收到子地址/寄存器编号字节和四个字节的数据后,我看到hi2c->XferCount == 28

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM