硬汉嵌入式论坛

 找回密码
 立即注册
搜索
查看: 339|回复: 7
收起左侧

[SPI/QSPI] 架构设计问题:使用 SPI—DMA 传输会出现数据一段一段丢失的问题

[复制链接]

5

主题

23

回帖

38

积分

新手上路

积分
38
发表于 2026-10-10 10:54:30 | 显示全部楼层 |阅读模式
我使用的是 STM32H7B0 的 MCU,现在遇到这样一个问题。如果把数据处理和使用 SPI DMA 传输放到 main 线程中处理会出现一段一段丢数据的情况。如果把数据处理放到中断中,设置处理完成标识,识别到处理标识完成则在 main 函数中使用 SPI DMA 进行传输,数据在上位机接收是正常,特别特别小概率会出现数据丢一个点的情况。这样情况下如何设置架构或者配置来解决上述问题,其中传输使用的是 HAL_SPI_Transmit_DMA 函数
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
124393
QQ
发表于 2026-10-10 13:48:48 | 显示全部楼层
SPI DMA的常规用法一般都是SPI DMA传输完成中断里面设置标志,传输任务等待完成,然后继续开启下次操作。

SPI双机通信,控制SPI Flash等,基本都是这种用法

点评

因为我工程是通过 TIM 触发 ADC 采样并通过 DMA 传输(设置了两个缓冲区),然后做计算,然后再做传输。怎么去设计比较好 我的想法是这样:ADC-DMA 传输中断中设置标识,main 函数中做数据处理(但是会对 SPI-DMA  详情 回复 发表于 2026-10-10 16:09
回复

使用道具 举报

7

主题

62

回帖

83

积分

初级会员

积分
83
发表于 2026-10-10 15:26:09 | 显示全部楼层
有没有试过用DSB?

点评

暂时还没用过,这个怎么使用啊  详情 回复 发表于 2026-10-10 16:10
回复

使用道具 举报

5

主题

23

回帖

38

积分

新手上路

积分
38
 楼主| 发表于 2026-10-10 16:09:38 | 显示全部楼层
eric2013 发表于 2026-10-10 13:48
SPI DMA的常规用法一般都是SPI DMA传输完成中断里面设置标志,传输任务等待完成,然后继续开启下次操作。
...

因为我工程是通过 TIM 触发 ADC 采样并通过 DMA 传输(设置了两个缓冲区),然后做计算,然后再做传输。怎么去设计比较好
我的想法是这样:ADC-DMA 传输中断中设置标识,main 函数中做数据处理(但是会对 SPI-DMA 传输标识做判断),然后传输函数 HAL_SPI_Transmit_DMA 也放到传输标识判断中,大致这样
main()
{
if(SPI传输完成标识)
{
if(ADC采样传输标识)
{
    process_data();
    HAL_SPI_Transmit_DMA();
}
}
}

是否在传输过程中,需要关闭 ADC-dma 等传输的中断等
回复

使用道具 举报

5

主题

23

回帖

38

积分

新手上路

积分
38
 楼主| 发表于 2026-10-10 16:10:03 | 显示全部楼层
xinhaic 发表于 2026-10-10 15:26
有没有试过用DSB?

暂时还没用过,这个怎么使用啊
回复

使用道具 举报

7

主题

62

回帖

83

积分

初级会员

积分
83
发表于 2026-10-10 16:24:52 | 显示全部楼层
在你数据处理结束后,SPI_DMA发送之前,加一行代码__DSB();
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
124393
QQ
发表于 2026-10-13 01:17:29 | 显示全部楼层
剑心v 发表于 2026-10-10 16:09
因为我工程是通过 TIM 触发 ADC 采样并通过 DMA 传输(设置了两个缓冲区),然后做计算,然后再做传输。 ...

逻辑更清晰点,可以主从式,主机发控制信息,采集数据,启动传输,这种的最安全可靠,缺点速度不够快

点评

这个方案确实安全可靠,能够保证计算和传输在不同时间运行,后面我试试这个方案。如果我想速度比较快的实现,还有其他方案吗  详情 回复 发表于 昨天 14:58
回复

使用道具 举报

5

主题

23

回帖

38

积分

新手上路

积分
38
 楼主| 发表于 昨天 14:58 | 显示全部楼层
eric2013 发表于 2026-10-13 01:17
逻辑更清晰点,可以主从式,主机发控制信息,采集数据,启动传输,这种的最安全可靠,缺点速度不够快

这个方案确实安全可靠,能够保证计算和传输在不同时间运行,后面我试试这个方案。如果我想速度比较快的实现,还有其他方案吗
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-21 06:28 , Processed in 0.157124 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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