你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32G070使用HAL_SPI_Receive函数疑问

[复制链接]
huahuahnu 提问时间:2025-1-7 15:13 / 未解决
配置为主机只接收模式,并开启CRC功能,发现波形会多读一笔数据,调试看代码确实多读了一笔,这里是不是一个bug?


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

  4. 等SPI_FLAG_RXNE标志
  5. 读一笔数据

  6. 等SPI_FLAG_RXNE标志
  7. 再读一笔数据

  8. ..........................
  9. }
复制代码


收藏 评论4 发布时间:2025-1-7 15:13

举报

4个回答
xmshao 回答时间:2025-1-7 16:02:01
是不是多收了个CRC结果进来了?


你可以关闭CRC功能再进行接收,然后比较下。
butterflyspring 回答时间:2025-1-7 17:47:58
在手册上可以看到,这种模式下,时钟是连续的。所以应用只要关心需要的数据即可。


STM32G0 SPI MASTER READ CLOCK.PNG
huahuahnu 回答时间:2025-1-7 18:06:35

xmshao 发表于 2025-1-7 16:02
是不是多收了个CRC结果进来了?</p>
<p>

主机先收了一笔CRC帧,然后存在了hspi->pRxBuffPtr里,接着多收了一笔从机随机的数据,但这个数据是丢弃的,代码注释这里是接收CRC帧,我觉得这个写法有bug,应用的时候要注意定义buffer数组的大小,不然会越界。

xmshao 回答时间:2025-1-8 11:31:27
对于带crc校验的SPI接收的话,那个接收API函数里表征数据个数的那个size应该是包含校验数据个数在内的。


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


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


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


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


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

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版