您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 技术讨论区 -> 求助:关于DMA和SPORT
本帖共有955个阅读者
发表帖子 发表投票 回复主题
求助:关于DMA和SPORT
kernelstory(论坛新手)
kernelstory
头衔:社区公民
帮派:无帮无派
帖数:15
金钱:228
积分:20
注册时间:2012/9/10
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
求助:关于DMA和SPORT

目前开启了sport1的primary和secondary存储,在外围同时有ADC的采样输出(这个ADC芯片中有两个AD转换器两个同时工作)分两路存入sport1的FIFO中,ADC的上传数据12位,那么在一个采样点采集进来两个数据后应该在sport1的fifo中占据2个字。。。

问题一:

在SPORT1_RCR1中关于RDTYPE这位zreo fill和sign-extend 由于ADC的数据是十二位的我选择sign-extend 做硬件符号扩展貌似没啥反应 难道就选zero fill吗?还是要人工数据格式处理?

问题二:

在DMA取数传递时,在配置SPORT1接收通道的CONFIG时里面的WDSIZE是设置16位呢还是32位(同时影响了X跨步的2还是4)

由于在FIFO中是同时存了2个16位数那么应该?

小女子为难多日 求诸大神解惑。。。


我们是这么的这么的渺小~
等级:论坛新手 参考IP地址:*.*.*.*
2012/11/13 9:18:07
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

1. 这一位是当数据不足16位时,自动补齐不足的位数,通常采用zero fill即可,这时接收到的无效位会变成0,方便取数据。

2. DMA为搬运数据的机制,原则上DMA的位数和传输数据的位数没有影响,只是每次搬运的数据少了,DMA搬运次数会增加,会占用内存通道,你的数据为12位,选择16位的DMA就可以了, 如果连续搬运,X跨步为2。你所采集到的数据,是两个SPROT数据接口交替存放的数据,所以需要你将数据分离出来。也可以启动两个DMA的配置,每次采集16bit,用中断模式,每采一个数据就启动一次DMA。在中断中判断搬运次数的奇偶,然后将数据存入不同的buffer中。


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2012/11/13 10:34:57
kernelstory(论坛新手)
kernelstory
头衔:社区公民
帮派:无帮无派
帖数:15
金钱:228
积分:20
注册时间:2012/9/10
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

andy 非常谢谢你的答复

我这两天一直在测试这个模块 发现这个zero fill和sign extened貌似没啥作用 结果都一致

两路ADC12位上传到SPORT1那么SPORT的接收长度应该设置成多少合适 发现有出入

转换结果经过我的移位大致符合 但是总是在DMA的接收中移位 其实在SPORT中已经移位了(我进入sport的中断看过)所以我一直怀疑是数据格式的问题 并且在开始就有初始数据移位 导致后面结果不正确

比如满电平采样在DMA目的地址(一段short型的数组中)会出现FF0FFF0FFF0.......那么如果是高位在先 因该是FFF0是正确的 可是结果就是如此 导致了我用DMA搬移两组数的话由于中间又隔了另一个通过的数据 看起来就明显错误了 (我用别的电平尝试若只存一个通道的话就类似有A1 02 A2 02 A4 02 A3 02...其是正确的数应该是2A30左右)

小女子跪拜求解释(并且我不觉得是时序的问题 要不然貌似正确的数也不会出现 也没有漏点发生 我用非常慢的采样率试过)


我们是这么的这么的渺小~
等级:论坛新手 参考IP地址:*.*.*.*
2012/11/14 13:15:06
kernelstory(论坛新手)
kernelstory
头衔:社区公民
帮派:无帮无派
帖数:15
金钱:228
积分:20
注册时间:2012/9/10
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

喔 非常不好意思 ANDY 是我疏忽了 我是直接看数组的 涉及到大端小端存储问题 我把它直接按照xh形式输出就正确了 blackfin是小端存储 所以。。。。。。嗨

sorry

顺便问一下 在blackfin系列下面的很多头文件里有哪个可以测时间最好是微妙级(小点好)应为我要是测一下FFT和滤波相关的程序 谢谢


我们是这么的这么的渺小~
等级:论坛新手 参考IP地址:*.*.*.*
2012/11/14 14:26:16
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

在VDSP下有个寄存器的菜单,下面找内核寄存器,有个叫cycles的寄存器,该寄存器记录每一句代码所运行消耗的内核时钟,你将显示的数字转为10进制,然后除以当前你内核的频率就是时间了


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2012/11/14 16:35:22
kernelstory(论坛新手)
kernelstory
头衔:社区公民
帮派:无帮无派
帖数:15
金钱:228
积分:20
注册时间:2012/9/10
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

ADNY 你那里有没有优化教程(C语言的) 文档之类的比较实用的资料链接?

VDSP库里面有没有常用的信号处理函数我们可以直接调用的?

谢谢


我们是这么的这么的渺小~
等级:论坛新手 参考IP地址:*.*.*.*
2012/11/20 13:52:40
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
6信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

http://www.openadsp.com/bbs/topic.asp?id=642&boardid=18&tb=1

这个是你想要的吗?ADI官方的编译器跟C代码优化培训资料。


我是OP...
等级:管理员 参考IP地址:*.*.*.*
2012/11/22 23:49:20
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
7信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

有一种简单的优化方法,直接在工程选项中将优化开关打开,然后将进度条拖到speed一端。开优化后,一些代码可能会被优化,导致无法正确访问硬件,你可以对不需要优化的函数加上#pragma optimize_off,告知该函数不做优化即可。

另外在工程选项的LDF部分,还有个cache的开关,可以将cache开关打开,通常速度都会提升很多。




这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2012/11/24 14:13:37
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.153515 Call, 1 Queries, Processed in 0.011719 second(s),