您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> BF533 audio例程问题求教
本帖共有533个阅读者
发表帖子 发表投票 回复主题
BF533 audio例程问题求教
kentz1988(论坛新手)
kentz1988
头衔:社区公民
帮派:无帮无派
帖数:5
金钱:150
积分:8
注册时间:2014/10/25
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
BF533 audio例程问题求教

上传的图片
  201410251556839.jpg [ 182.83 KB 677×906 ] (缩略时请点击查看原图)

 


例程中,图上几个channel分别代表什么?立体声LineIn一般只有2个声道,为什么有4个channel?
开始采集数据后,每个channel都有数据,很费解

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/10/25 15:57:43
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
这个代码是将LINE IN 的数据采集,然后在中端中将数据传给输出buffer,再将数据发送出来。
DMA配置的是每次采集4个数据,左右通道各采2个数据。所以你看到了4个通道,实际上是左右声道,每个声道发了2个数据。
如果你把DMA的配置改为每次采集2个数据,就可以不用后面两个通道的变量了,你可以认为这4个仅仅是变量,作为DMA搬运的4个数据交替使用。


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2014/10/25 22:44:23
kentz1988(论坛新手)
kentz1988
头衔:社区公民
帮派:无帮无派
帖数:5
金钱:150
积分:8
注册时间:2014/10/25
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
好的,根据 audio_talkthrough.h文件中的描述,DMA 的DAC,ADC buffer内数据格式如下:

// names for slots in ad1836 audio frame
#define INTERNAL_ADC_L0 0
#define INTERNAL_ADC_R0 2
#define INTERNAL_DAC_L0 0
#define INTERNAL_DAC_R0 2
#define INTERNAL_ADC_L1 1
#define INTERNAL_ADC_R1 3
#define INTERNAL_DAC_L1 1
#define INTERNAL_DAC_R1 3

从上面看,声音数据在buffer内部排布是 ADC_L0|ADC_L1|ADC_R0|ADC_R1,
也就是说,如果buffer大小为2,那么我只能取到ADC_L0|ADC_L1,也就是左声道的前后两次数据

那么,我现在如果一次只采集左右声道两个数据,要怎么设置?或者怎么采集?
如果一次采集128个数据(一帧),又要怎么设置呢?单纯设置buffer大小并增加相应DAC,ADC变量时,编译通过,但是链接时候会报错,还望解答

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/10/27 9:53:21
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
修改代码的DMA部分:
void Init_DMA(void)
{
*pDMA1_PERIPHERAL_MAP = 0x1000;      //映射SPORT接口对应的DMA通道
*pDMA1_CONFIG = WNR | WDSIZE_32 | DI_EN | FLOW_1;  //工作模式。WDSIZE_32 为DMA按32位宽度采集
*pDMA1_START_ADDR = (void *)iRxBuffer1; //采集后数据存放首地址
*pDMA1_X_COUNT = 4; //采集多少次
*pDMA1_X_MODIFY = 4; //采集结束后,下一个采集地址的增量,(按Byte算。32位是4个Byte,所以连续存放时,增量是4)
*pDMA2_PERIPHERAL_MAP = 0x2000;
*pDMA2_CONFIG = WDSIZE_32 | FLOW_1;
*pDMA2_START_ADDR = (void *)iTxBuffer1;
*pDMA2_X_COUNT = 4;
*pDMA2_X_MODIFY = 4;
}

你先弄清楚上面这两个配置是实现什么功能。
如果你想采集左右声道两个数据,假设数据是32位的,配置如下:

*pDMA1_PERIPHERAL_MAP = 0x1000;      //映射SPORT接口对应的DMA通道
*pDMA1_CONFIG = WNR | WDSIZE_32 | DI_EN | FLOW_1;  //工作模式。WDSIZE_32 为DMA按32位宽度采集
*pDMA1_START_ADDR = (void *)iRxBuffer1; //采集后数据存放首地址
*pDMA1_X_COUNT = 2; //采集多少次
*pDMA1_X_MODIFY = 4; //采集结束后,下一个采集地址的增量,(按Byte算。32位是4个Byte,所以连续存放时,增量是4)


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2014/11/2 20:58:04
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.154516 Call, 1 Queries, Processed in 0.015625 second(s),