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

请教SPI用LL读取的问题

[复制链接]
Alex3688 提问时间:2025-8-2 08:16 / 未解决

用cubemx构建工程,MDK开发,这个项目采用AD4020 20位2MSPS外置ADC,ADC转换速率高达0.5us,而STM32H5用HAL的HAL_SPI_Receive(&hspi1, mrx_data, 3, HAL_MAX_DELAY);命令读取ADC结果3字节,即时优化后也需要1.95us,远远不能匹配ADC的速度。我想也只有LL命令才会快了,测试了很长时间都不成功。

请教怎么用LL命令读取SPI?从cubemx的配置到MDK,需要怎样做?感谢!

收藏 评论4 发布时间:2025-8-2 08:16

举报

4个回答
butterflyspring 回答时间:2025-8-4 16:09:10
提高读取速度,为什么不考虑尝试DMA模式?

LL命令会节省一些代码时间,但是外设的运行和处理方式并不会节省很多。




xmshao 回答时间:2025-8-6 10:03:20

你现在20位ADC,转换速率0.5s,按32位接收的话,那么至少需要64M的波特率才能满足要求。

使用STM32H5的SPI可以实现125M的波特率,同时SPI带16字节的FIFIO,配合接收FIFO,

这样看来接收应该是没啥问题的。如果每次ADC采样结果的数据不多的话,每次接收完一笔

数据后再去处理应该来得及。

这个处理过程如果时间不是很紧张的话,至于是使用HAL库还是LL库组织代码

问题不大。 我认为这个接收的快慢跟你使用哪个类型库组织的配置及启动代码没什么关系。

Alex3688 回答时间:3 天前

xmshao 发表于 2025-8-6 10:03
你现在20位ADC,转换速率0.5s,按32位接收的话,那么至少需要64M的波特率才能满足要求。</p>
<p>使用STM32H5的 ...

[md]瓶颈就在SPI读取上,用hal的:

HAL_SPI_Receive(&hspi1, mrx_data, 3, HAL_MAX_DELAY);//SPI一次连读取3字节AD转换结果 HAL SPI读取3字节需要1.95us

而ADC的转换速率是2Msps即0.5uS一次。不能用DMA,因为每一次转换之前要给ADC一个几百ns的正脉冲,CPU必须介入每一次转换,这就是无奈之处。

总之SPI_Receice时间越短越好。

butterflyspring 回答时间:昨天 14:22
可以采用这样的思路,假定ADC需要发送数据去接收(1,2,3)。
用timer2 去触发 GPDMA1--> 搬运数据给 SPI TXDR,
同时触发 GPDMA2--> 从SPI RXDR搬运数据给RAM。
定时器输出的PWM可以作为给ADC的脉冲信号

这里修改了一下HAL_SPI_TransmitReceive_DMA 内接收的数据个数,使得接收数组足够大
这样就可以有足够的时间在半完成和完成中断处理数据.
测试中将 spi 数据短接,模拟ADC输出结果

STM32H5 TIM2 TRO DMA SPI for exteranl ADC 2.PNG STM32H5 TIM2 TRO DMA SPI for exteranl ADC.PNG                               

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版