硬汉嵌入式论坛

 找回密码
 立即注册
查看: 282|回复: 3
收起左侧

[SPI/QSPI] 满足SPI菊花链时序要求 基于定时触发DMA双缓冲

[复制链接]

5

主题

19

回帖

34

积分

新手上路

积分
34
发表于 2025-8-26 20:09:08 | 显示全部楼层 |阅读模式
本帖最后由 风沙盗影 于 2025-8-26 21:27 编辑

首先感谢硬汉大佬和ST论坛群友的支持(提供了定时器触发DMA-SPI的例程)!!!!
问题描述:
硬件平台:STM32H750XBH6
软件平台:RTT系统+MDK5.27
项目需求:使用多通道DAC将数据从bin文件转义成为对应的电压值,当前使用定时器触发DMA将数据从SDRAM经由TIM12的TRGO(DMAMUX产生器的同步触发),每经过1ms将数据发送到SPI总线上,使用DMA半满中断实现连续文件输出(通过基地址是M0还是M1,对应回调函数XferHalfCpltCallback和XferM1HalfCpltCallback,读取SD卡中文件数据填充FIFO),为匹配多通道DAC,需要使用SPI菊花链需要满足对应的时序要求(额外控制SYNC),对于单片DAC设备,可默认CS片选拉低,直接输出SPI对应的SDI和SDO数据即可,但是对于SPI菊花链,需要在定时触发的每一个大的frame里面(多片级联的SDI数据需求 理论上这个可以根据DMAMUX的计数器实现,即一次定时触发 触发N个请求 各frame之间仍然是定时触发的间隔 可以满足需求),维持SYNC时序进而将数据加载进入SPI菊花链设备内部,这个需求很难满足(由于定时器触发DMA搬运的过程是自动实现的,只有半满和全满中断,没有对应的单次中断控制来控制SYNC的时序)。这个问题应该如何解决呢? 希望各位群友给点建议
figure1.png
当前的思路:
1.牺牲灵活性,直接输出写死一个PWM波来匹配SYNC的波形,当前使用16MHz的SPI,每1ms产生一次触发脉冲,通过逻辑分析仪100MHz采集发现定时器触发存在固定2-5us的延迟(应该是内部DMA捕获定时器TRGO的时间间隔),感觉写死PWM波可能很难把握SDI和SDO的输出延迟(由于是us级别的)
figure2.png
2.采用数字时钟延迟逻辑芯片,比如D触发器或者74系列逻辑芯片(只是一种设想,感觉可能实现难度较大):对SLCK和SDI和SDO进行延迟M个时间单位,另外接一路SCLK接回MCU处理(比如说外部中断或者定时器-SYNC作为定时器时钟源,N个SPI设备*32bit作为周期翻转定时器输出PWM波(定时器的单次触发模式),输出引脚连接SYNC引脚,其主要功能为在SCK有脉冲翻转的情况下输出SYNC为低电平,无脉冲情况下保持为高电平),在这M个时间单位中,实现一个基于SCLK时钟源的定时器PWM波输出,类似下图(实在不想换方案,还要做很多事情)
figure3.bmp





回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118331
QQ
发表于 2025-8-27 08:41:14 | 显示全部楼层
可以用TIM12的比较捕获模式输出PMW。来控制sync
回复

使用道具 举报

5

主题

19

回帖

34

积分

新手上路

积分
34
 楼主| 发表于 2025-8-27 09:29:16 | 显示全部楼层
谢谢硬汉大佬 看半天
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2025-8-27 13:23:56 | 显示全部楼层
用俩SPI可不可以,一个做主机,另一个做从机
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-9-26 16:42 , Processed in 0.043617 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表