硬汉嵌入式论坛

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

[SPI/QSPI] 高速SPI从机环形DMA接收方案(已量产)

  [复制链接]

219

主题

1109

回帖

1776

积分

至尊会员

More we do, more we can do.

积分
1776
发表于 2022-10-27 20:04:31 | 显示全部楼层 |阅读模式
概述:
配置能缓存最大数据长度的缓冲区,如1024字节;配置SPI接收为DMA环形模式,使用DMA通道的CNT寄存器作为写指针位置。

中断:
CS下降沿中断:读取CNT寄存器,作为帧起始位置;
CS上升沿中断:读取CNT寄存器,作为帧结束位置,复制数据至应用层(如跨边界分2次复制)。


优点:
中断少,CPU参与少,不丢数据。

缺点:
需分配专用的缓冲区。


回复

使用道具 举报

4

主题

100

回帖

112

积分

初级会员

积分
112
发表于 2022-10-27 20:50:04 | 显示全部楼层
不错不错,很好的分享!!!
回复

使用道具 举报

1

主题

382

回帖

385

积分

高级会员

积分
385
发表于 2022-10-27 23:49:17 来自手机 | 显示全部楼层
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2022-10-28 01:10:28 | 显示全部楼层
好思路,主机可以多高的主频与其通信?
回复

使用道具 举报

0

主题

126

回帖

126

积分

初级会员

积分
126
发表于 2022-10-28 09:51:03 | 显示全部楼层
我在UART接受处理使用了类似思路,不过我在DMA完成中断里不做任何数据处理,只对用于记录接收循环计数的全局变量加1。

应用层使用数据时先从接收循环计数变量和CNT寄存器计算出实际总接收字节数量,比较上次处理时的总接收字节数量就能算出新接收字节数量及在buffer的起始位置,然后做相应数据处理。

这个思路有个好处是可以多个任务同时使用接收数据而完全独立互不干扰。譬如一个任务做命令解释,另外一个任务做数据转发(用于调试)。
回复

使用道具 举报

4

主题

107

回帖

119

积分

初级会员

积分
119
发表于 2022-10-28 11:03:42 | 显示全部楼层
eric2013 发表于 2022-10-28 01:10
好思路,主机可以多高的主频与其通信?

之前产品中按照这样做,SPI从机100MHZ长时间通信无问题 ,现在产品已经量产
回复

使用道具 举报

4

主题

107

回帖

119

积分

初级会员

积分
119
发表于 2022-10-28 11:05:37 | 显示全部楼层
之前的做法有点区别,在中断中只是切换接收缓存buf,在循环中处理接收数据
回复

使用道具 举报

219

主题

1109

回帖

1776

积分

至尊会员

More we do, more we can do.

积分
1776
 楼主| 发表于 2022-10-28 19:07:05 | 显示全部楼层
eric2013 发表于 2022-10-28 01:10
好思路,主机可以多高的主频与其通信?

看了下应用手册,DMA从外设到SRAM,典型的延时是4个CLK
回复

使用道具 举报

85

主题

798

回帖

1053

积分

至尊会员

积分
1053
发表于 2022-10-28 20:29:04 | 显示全部楼层
很巧妙的应用呀,省去自己维护缓冲区的消耗和不小心可能出现的BUG。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2022-10-29 00:32:56 | 显示全部楼层
emwin 发表于 2022-10-28 19:07
看了下应用手册,DMA从外设到SRAM,典型的延时是4个CLK

100MHz的话,差不多就是25MHz,这速度还行。
回复

使用道具 举报

15

主题

75

回帖

120

积分

初级会员

积分
120
发表于 2022-10-31 21:44:39 | 显示全部楼层
MK
回复

使用道具 举报

5

主题

162

回帖

177

积分

初级会员

积分
177
发表于 2025-2-27 22:34:31 | 显示全部楼层
这个方案如何实现一读一写呢?如果只是接收还好,但是像模拟器件那样一读一写在环形缓冲区中怎么实现
回复

使用道具 举报

15

主题

65

回帖

110

积分

初级会员

积分
110
发表于 2025-3-2 16:08:40 来自手机 | 显示全部楼层
那usart可以实现类似应用吗?
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2025-6-4 22:36:08 | 显示全部楼层
很巧妙的应用呀,省去自己维护缓冲区的消耗和不小心可能出现的BUG。
回复

使用道具 举报

7

主题

117

回帖

138

积分

初级会员

积分
138
发表于 2025-6-5 19:52:13 | 显示全部楼层
一直没想明白环形缓冲区的作用,我印象里CPU一直比外设要快
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-12 04:22 , Processed in 0.048399 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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