OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10858|回复: 10

SPI+DMA如何判断已经接收完数据

[复制链接]

12

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2016-6-18
在线时间
75 小时
发表于 2016-10-21 10:52:29 | 显示全部楼层 |阅读模式
10金钱
接收数据少于DMA缓冲区,能用什么方法判断已经接收完成?

最佳答案

查看完整内容[请看2#楼]

主机:手动NSS=0,设置DMA数据长度等于要传输的字数,TxDMA发送,DMA完成中断等待最后一个字发送完成然后手动NSS=1; 从机:SPI硬件NSS,设置RxDMA,使能NSS上升沿中断,中断里面处理DMA缓冲,重新开启DMA。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

238

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2016-5-26
在线时间
1698 小时
发表于 2016-10-21 10:52:30 | 显示全部楼层
zzb_qwe 发表于 2016-10-22 11:27
两块版子通讯,直连

主机:手动NSS=0,设置DMA数据长度等于要传输的字数,TxDMA发送,DMA完成中断等待最后一个字发送完成然后手动NSS=1;
从机:SPI硬件NSS,设置RxDMA,使能NSS上升沿中断,中断里面处理DMA缓冲,重新开启DMA。

淘汰人的从来是工具而不是年龄
嵌入式的冷知识屋 blog.csdn.net/k_o_carnivist
回复

使用道具 举报

3

主题

261

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2075
金钱
2075
注册时间
2014-2-20
在线时间
284 小时
发表于 2016-10-21 11:14:17 | 显示全部楼层
改成DMA缓冲区与接收数据量一样大,在DMA传输完成中断把接收数据手动搬到另外的缓冲区?
回复

使用道具 举报

12

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2016-6-18
在线时间
75 小时
 楼主| 发表于 2016-10-21 16:39:19 | 显示全部楼层
Da Wen 发表于 2016-10-21 11:14
改成DMA缓冲区与接收数据量一样大,在DMA传输完成中断把接收数据手动搬到另外的缓冲区?

每次接收都不一样,那每次都改源程序?
有没有好点的办法
回复

使用道具 举报

3

主题

261

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2075
金钱
2075
注册时间
2014-2-20
在线时间
284 小时
发表于 2016-10-22 10:18:01 | 显示全部楼层
zzb_qwe 发表于 2016-10-21 16:39
每次接收都不一样,那每次都改源程序?
有没有好点的办法

把要接收的数据长度作为一个变量,通过串口或者其他来修改这一个值,然后再初始化一遍DMA。
回复

使用道具 举报

3

主题

238

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2016-5-26
在线时间
1698 小时
发表于 2016-10-22 10:39:06 | 显示全部楼层
如果nSS脚在一组数据之内都是低电平的话可以用它的上升沿中断
淘汰人的从来是工具而不是年龄
嵌入式的冷知识屋 blog.csdn.net/k_o_carnivist
回复

使用道具 举报

12

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2016-6-18
在线时间
75 小时
 楼主| 发表于 2016-10-22 11:12:59 | 显示全部楼层
K.O.Carnivist 发表于 2016-10-22 10:39
如果nSS脚在一组数据之内都是低电平的话可以用它的上升沿中断

NSS脚好像无法自动跳变的吧
回复

使用道具 举报

3

主题

238

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2016-5-26
在线时间
1698 小时
发表于 2016-10-22 11:18:25 来自手机 | 显示全部楼层
zzb_qwe 发表于 2016-10-22 11:12
NSS脚好像无法自动跳变的吧

好像楼主一直没说SPI是主机还是从机,以及与之通信的器件是什么。
回复

使用道具 举报

12

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2016-6-18
在线时间
75 小时
 楼主| 发表于 2016-10-22 11:27:51 | 显示全部楼层
K.O.Carnivist 发表于 2016-10-22 11:18
好像楼主一直没说SPI是主机还是从机,以及与之通信的器件是什么。

两块版子通讯,直连
回复

使用道具 举报

15

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-8-4
在线时间
48 小时
发表于 2020-2-25 09:17:29 | 显示全部楼层
楼主,我也遇到这样的问题,我想的是,设置一个timeout时间,如果在timeout时间内,DMA接收完成中断没有发生的话,可以判断为数据包接收完成了
回复

使用道具 举报

0

主题

104

帖子

0

精华

高级会员

Rank: 4

积分
711
金钱
711
注册时间
2015-5-23
在线时间
135 小时
发表于 2021-3-25 16:53:20 | 显示全部楼层
本帖最后由 denike 于 2021-3-25 16:55 编辑
守望者2481632 发表于 2020-2-25 09:17
楼主,我也遇到这样的问题,我想的是,设置一个timeout时间,如果在timeout时间内,DMA接收完成中断没有发 ...

可以设置接收DMA环回接收,然后主程序或者线程里面获取DMA当前NDTR的值,然后获取数据的长度个数解析就OK啦例如:
        CurDMAPtr = (uint8_t *)(DCC_RX_DMA->M0AR+DCC_RX_DMABUF_SIZE-DCC_RX_DMA->NDTR);

        while(DCC_CurRxPtr!=CurDMAPtr)


回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-28 07:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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