ST意法半导体
直播中

飞毛腿452

9年用户 996经验值
擅长:电源/新能源
私信 关注
[问答]

STM32G070配置为主机只接收模式,并开启CRC功能,发现波形会多读一笔数据,为什么?

  配置为主机只接收模式,并开启CRC功能,发现波形会多读一笔数据,调试看代码确实多读了一笔,这里是不是一个bug?



  • if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
  • {
  • SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);

  • 等SPI_FLAG_RXNE标志
  • 读一笔数据

  • 等SPI_FLAG_RXNE标志
  • 再读一笔数据

  • ..........................
  • }


回帖(2)

刘悦竹

2025-3-10 14:49:01
对于带crc校验的SPI接收的话,那个接收API函数里表征数据个数的那个size应该是包含校验数据个数在内的。


函数说明在这个地方稍有点不够清晰。如果开启了CRC校验,又没有为其预留接收存储空间,可能会有些问题。


问题应该是表现在CRC码没接收进来无法完成校验,或者说在DMA循环接收时发生数据滚动难以辨别数据
和校验码。


至于你说的越界,按理是不该发生的。因为即使没为CRC码准备接收空间,当我们基于查询或 中断方式进行
接收时,我们是根据预定的SIZE大小来进行接收和存储的,之后的数据就丢弃了,不会发生越界。


如果是DMA方式,Normal模式的话,传输指定SIZE个数的数据后就停下来,之后的数据也丢弃了,也不会发生越界。


如果是DMA 循环模式,每传输指定SIZE个数的数据后,它就调头重新开始存储了,怎么也不会发生越界。
举报

马占云

2025-3-11 17:39:36

在STM32G070微控制器中,配置SPI为主机只接收模式并开启CRC功能时,出现多读一笔数据的情况,可能是由于CRC计算和接收数据的处理逻辑导致的。以下是一些可能的原因和解决方法:


1. CRC计算的影响


当SPI的CRC功能启用时,SPI控制器会在数据传输结束后自动计算并发送CRC值。这意味着在接收模式下,SPI控制器可能会在接收完实际数据后,再接收一个CRC值。如果你没有正确处理CRC值的接收,可能会导致多读一笔数据。


2. 代码逻辑问题


在你的代码中,当CRC功能启用时,你设置了SPI_CR1_CRCNEXT位,这表示下一个接收的数据将是CRC值。然后你等待SPI_FLAG_RXNE标志来读取数据。然而,你可能没有正确处理CRC值的读取,导致多读一笔数据。


3. 解决方法


为了正确处理CRC值的接收,你需要在读取完实际数据后,再读取CRC值,并忽略它。以下是可能的代码修改:


if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) {
    // 设置下一个接收的数据为CRC值
    SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);

    // 等待并读取实际数据
    while (!__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE));
    uint16_t data = hspi->Instance->DR;

    // 等待并读取CRC值(忽略它)
    while (!__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE));
    uint16_t crc = hspi->Instance->DR;

    // 处理实际数据
    // ...
}

4. 检查SPI配置


确保你的SPI配置正确,特别是数据帧格式(8位或16位)和CRC长度(8位或16位)。如果配置不正确,可能会导致数据接收错误。


5. 调试建议



  • 使用调试器检查SPI寄存器的状态,特别是SPI_SR寄存器的标志位。

  • 检查SPI的时钟配置,确保时钟频率和数据传输速率匹配。

  • 使用逻辑分析仪或示波器检查SPI总线的实际波形,确认数据接收的顺序和内容。


6. 参考手册


详细阅读STM32G070的参考手册,特别是SPI和CRC相关章节,了解SPI控制器在CRC模式下的行为。


通过以上步骤,你应该能够找到并解决多读一笔数据的问题。如果问题仍然存在,建议检查硬件连接和SPI配置,或者联系ST的技术支持获取进一步帮助。

举报

更多回帖

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