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

利用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以内。

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

举报

6个回答
xmshao 最优答案 回答时间:2025-8-11 15:50:43

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

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

image.png

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


Tek004.png Tek005.png STM32F412 CS GPIO.PNG
butterflyspring 回答时间:2025-8-11 10:39:36
控制ADC的片选信号也可以用SPI的NSS 硬件方式,理论上应该比软件快些。




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

烦恼的维特_TI 回答时间:2025-8-11 22:13:06

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

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

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

butterflyspring 发表于 2025-8-12 15:53
測試了一下,将Hal的GPIO函数放到HAL_SPI_TransmitReceive_DMA 中,在16MHZ 和100MHZ 频率下,时间是1.47us ...

看着比较简单的操作方法,奇怪的是我用逻辑分析仪测试带宽可能受限测试不准。后续我用示波器抓了试试。

25 回答时间:4 天前

楼主解决了嘛 咋解决的呀

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