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

利用stm32f412 的SPI 的DMA 模式读取外部ADC数据如何提高效率

[复制链接]
烦恼的维特_TI 提问时间:2025-8-9 23:20 / 已解决

;我利用stm32f412 的SPI口,采用DMA方式读取外部ADC(ADS131A04)的数据,ADC理论可以达到128Khz,24bit,4个通道的数据,1个通道的状态,共有5 8 3bit的数据,为了能够满速读取,需要提高spi口的读取效率,但是现在利用软件控制CS口下拉后,再利用dma读取的话,中间会有7.4us左右的延时。这个延时有没有办法可以优化减少么?

代码中,CS置低后没有任何延时就启动了DMA的接1.png受:

HAL_GPIO_WritePin(ADS131_CS_PORT,ADS131_CS_PIN,GPIO_PIN_RESET); HAL_SPI_Receive_DMA(&hspi2, &dataRx, len_num);

最好能将中间的延时压缩到2us以内。

收藏 评论4 发布时间:2025-8-9 23:20

举报

4个回答
xmshao 最优答案 回答时间:前天 15:50

如果你觉得片选之后到SPI开始通信的间隔长了点,建议你基于LL库组织代码,或者自己基于寄存器组织代码,缩短你提到的间隔是可行的。

我刚才基于LL库写的测试代码,片选生效到开始通信的间隔可以缩短到700ns。我配置的芯片主频为168MHz。你不妨试试。

image.png

butterflyspring 回答时间:前天 10:39
控制ADC的片选信号也可以用SPI的NSS 硬件方式,理论上应该比软件快些。




2个us 时间执行的指令不会很多。所以可以考虑自己单独做个函数,拆分HAL_SPI_TransmitReceive_DMA。
先配置好,在设置片选后,执行启动。这样才有可能降低延迟。

烦恼的维特_TI 回答时间:前天 22:13

butterflyspring 发表于 2025-8-11 10:39
控制ADC的片选信号也可以用SPI的NSS 硬件方式,理论上应该比软件快些。</p>
<p>

刚刚试了下,吧CS放到DMA函数内部,最少也要2.6us 了

butterflyspring 回答时间:昨天 15:53
測試了一下,将Hal的GPIO函数放到HAL_SPI_TransmitReceive_DMA 中,在16MHZ 和100MHZ 频率下,时间是1.47us 和 0.285us,应该满足你的期望了。


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