OpenEdv-开源电子网

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

DMA用作串口缓冲接收数据写入u盘问题,希望讨论学习提高

[复制链接]

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2012-9-23
在线时间
1 小时
发表于 2013-1-28 16:00:16 | 显示全部楼层 |阅读模式
程序上设置两个512字节的数组轮流接收串口DMA数据,将接收的数据放入一个大的缓冲数组buffer[0x4000]中,当凑够接近16k就时就写入u盘一次, 发现每次快要达到16k,执行写入u盘的时候,接收的后面的串口数据会丢字节。我分析原因是写入u盘时占用了spi外设也就占用了系统总线,导致DMA无法传输。 因为我写u盘需要用spi操纵一个ch376芯片写入,如果是想我分析的那样spi占用了系统总线导致DMA接收数据丢失,我该怎么办呢?    求大神啊。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-28 17:57:29 | 显示全部楼层
如果是DMA无法传输,就不用等到16K左右才出错了,早就该出错了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2012-9-23
在线时间
1 小时
 楼主| 发表于 2013-1-28 19:33:27 | 显示全部楼层
只有每次缓冲接收到接近16k的数据时才执行一次写u盘操作,才会占用spi一次,而串口数据是9600bps不断传送的, 难道不是只有执行写u盘时,才会导致DMA无总线权限而丢数据吗? 求原子大神赐教。
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2012-9-23
在线时间
1 小时
 楼主| 发表于 2013-2-1 11:55:19 | 显示全部楼层
可能我之前没有说清楚,
举个例子,例子中又多定义了个0x4000的数组,以便在一个执行写u盘过程时,另一个作为数据接收缓冲。
char DMA_buf1[512];  //两个512字节大小的DMA缓冲来轮流切换接收串口数据,并放置到后面的16k字节的缓冲区内
char DMA_buf2[512];
char buf1[0x4000];  
char buf2[0x4000];
当DMA_buf1接收满512字节时,触发DMA满中断,设置DMA缓冲区为DMA_buf2,并将DMA_buf1数据复制到buf1中,等下次DMA满中断在切换DMA_buf,并将DMA_buf2连接到buf1中。依次循环
当判断buf1若超过了(16k减去512字节大小时),将DMA_buf1和2缓存满后放入buf2中,并执行写u盘操作,将buf1中的数据写入u盘
,等buf2满了,在轮流切换。
我保存出来的文件发现,每次在(16k减去512字节)的位置,随后的几个字节会丢失。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-2-2 10:50:57 | 显示全部楼层
你说的U盘是SD卡吧?
怀疑DMA冲突,那就去掉DMA,直接写,测试下.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-22 01:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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