关于DM642语音处理问题(AIC23B、MCASP)
时间:10-02
整理:3721RD
点击:
一开始产生单频声音是好使的,后来加上延时就不好使了。本来并没有延时,只是我用来调试程序的(延时部分可以算作算法的部分),但此时,就没有声音发出了。使用的是奇想达DM642的板子。主函数如下:
for(;;)
{
if(MCASP_FGETH(QXDdm642codec,RSTAT,RDATA))
{codecdata[0] = MCASP_RGETH(QXDdm642codec,RBUF1);
MCASP_RSETH(QXDdm642codec,XBUF0,codecdata[0]);codecdata[1] = MCASP_RGETH(QXDdm642codec,RBUF3);MCASP_RSETH(QXDdm642codec,XBUF2,codecdata[1]);
// for(b=0;b<1000;b++) {} //这一段代码加上后就没有声音发出了,当b=100或者更小时,有声音发出codecdata[2] = MCASP_RGETH(QXDdm642codec,RBUF5); MCASP_RSETH(QXDdm642codec,XBUF4,15000*sin(0.1*PI*n)); codecdata[3] = MCASP_RGETH(QXDdm642codec,RBUF7);MCASP_RSETH(QXDdm642codec,XBUF6,codecdata[3]); n++;if(n>20)n=0;
}
else
{ asm(" nop");
}
其中,AIC23B的配置如下:
#define QXDDM642_AIC23_DEFAULTCONFIG { \
0x0017, /* Set-Up Reg 0 左线输入通道音量控制 Left line input channel volume control */ \
/* LRS 0 simultaneous left/right volume: disabled */\
/* LIM 0 left line input mute: disabled */ \
/* XX 00 reserved */ \
/* LIV 10111 left line input volume: 0 dB */ \
\
0x0017, /* Set-Up Reg 1 右线输入通道音量控制 Right line input channel volume control */ \
/* RLS 0 simultaneous right/left volume: disabled */\
/* RIM 0 right line input mute: disabled */ \
/* XX 00 reserved */ \
/* RIV 10111 right line input volume: 0 dB */ \
\
0x01f9, /* Set-Up Reg 2 左通道耳机音量控制 Left channel headphone volume control */ \
/* LRS 1 simultaneous left/right volume: enabled */ \
/* LZC 1 left channel zero-cross detect: enabled 过零检测*/ \
/* LHV 1111001 left headphone volume: 0 dB */ \
\
0x01f9, /* Set-Up Reg 3 右通道耳机音量控制 Right channel headphone volume control */ \
/* RLS 1 simultaneous right/left volume: enabled */ \
/* RZC 1 right channel zero-cross detect: enabled */\
/* RHV 1111001 right headphone volume: 0 dB */ \
\
0x0011, /* 0x0011 0x0015 Set-Up Reg 4 模拟音频路径控制 Analog audio path control */ \
/* X 0 reserved */ \
/* STA 00 sidetone attenuation: -6 dB */ \
/* STE 0 sidetone: disabled */ \
/* DAC 1 DAC: selected */ \
/* BYP 0 旁路 bypass: off */ \
/* INSEL 0 ADC选择输入 线输入,为何不是MIC输入? input select for ADC: line */ \
/* MICM 0 microphone mute: disabled */ \
/* MICB 1 麦克风增强 microphone boost: enabled C5509板子上程序没有增强*/ \
\
0x0000, /* Set-Up Reg 5 数字音频路径控制 Digital audio path control */ \
/* XXXXX 00000 reserved */ \
/* DACM 0 DAC soft mute: disabled */ \
/* DEEMP 00 deemphasis control: disabled */ \
/* ADCHP 0 ADC high-pass filter: disabled */ \
\
0x0000, /* Set-Up Reg 6 断电控制 Power down control */ \
/* X 0 reserved */ \
/* OFF 0 device power: on (i.e. not off) */ \
/* CLK 0 clock: on */ \
/* OSC 0 oscillator: on */ \
/* OUT 0 outputs: on */ \
/* DAC 0 DAC: on */ \
/* ADC 0 ADC: on */ \
/* MIC 0 microphone: on */ \
/* LINE 0 line input: on */ \
\
0x0053, /* Set-Up Reg 7 数字音频接口格式 Digital audio interface format */ \
/* XX 00 reserved */ \
/* MS 1 主模式 master/slave mode: master */ \
/* LRSWAP 0 DAC的左/右互换 DAC left/right swap: disabled */ \
/* LRP 0 DAC lrp: MSB on 1st BCLK */ \
/* IWL 00 输入位长度:16位。input bit length: 16 bit */ \
/* FOR 11 数据格式:DSP格式 data format: DSP format */ \
\
0x000e, /* Set-Up Reg 8 采样率控制 Sample rate control //修改 原先为0002,ADC\DAC均为8Khz normal模式 */ \
/* X 0 reserved */ \
/* CLKOUT 0 时钟输出分频:1 clock output divider: 1 MCLK */ \
/* CLKIN 0 时钟输入分频:1 clock input divider: 1 (MCLK) */ \
/* SR,BOSR 00110 sampling rate: ADC 8 kHz DAC 8 kHz */ \
/* USB/N 0 clock mode select (USB/nor mal): normal */ \
\
0x0001 /* Set-Up Reg 9 数字接口激活 Digital interface activation */ \
/* XX..X 00000000 reserved */ \
/* ACT 1 active */ \
}
主程序中有:
/*AIC23B的初始化*/ hQXDdm642i2c = I2C_open(I2C_PORT0,I2C_OPEN_RESET); I2C_config(hQXDdm642i2c,&QXDDM642IIC_Config); /*配置第一路到第四路音频输入*/ /*第一通路AIC23工作在主模式*/ // codecstate.regs[QXDDM642_AIC23_DIGIF] = 0x13; dm642aic23handle0 = EVMDM642_AIC23_open(hQXDdm642i2c,0,&codecstate); codecstate.regs[QXDDM642_AIC23_DIGIF] = 0x13; /*其它三路工作在从模式*/ dm642aic23handle1 = EVMDM642_AIC23_open(hQXDdm642i2c,1,&codecstate); dm642aic23handle2 = EVMDM642_AIC23_open(hQXDdm642i2c,2,&codecstate); // dm642aic23handle3 = EVMDM642_AIC23_open(hQXDdm642i2c,3,&codecstate);
MCASP的配置如下:
/*MCASP的初始化*/ QXDdm642codec = QXDDM642_AIC23_openCodec();
MCASP_ConfigGbl mcaspCfgDataGbl = {
0x00000000, // PFUNC - All pins as McASP ,所有的管脚均为McAPS功能
0x00000055, //* PDIR - 0,2,4,6为input,1,3,5,7为XMT DATA output, 其它的为输入
0x00000000, //* DITCTL - DIT mode disable ,使用TDM mode or burst mode.
0x00000000, //* DLBCTL - Loopback disabled */
0x00000000 //* AMUTE - Never drive AMUTE */
};
MCASP_ConfigRcv mcaspCfgDataRcv = {
0xffffffff, //* RMASK - Use all 32 bits,左声道与右声道各16位
0x000180f8, //* RFMT - MSB first, 32-bit slots,0-pad,CPU bus, 0 bit delay,数据格式
0x00000200, //* AFSRCTL - 4-slots TDM, single bit frame sync, ext FS 帧同步的格式,修改过,原先为200
0x00000080, /* ACLKRCTL - 时钟上升沿有效, 时钟不分频, 外部时钟模式from ACLKR pin. */
0x00000000, //* AHCLKRCTL - External HCLK 外部接收高频时钟来自AHCLKR pin. */
0x0000000f, /* RTDM - Slots 1,3,5,7 are active */
0x00000000, /* RINTCTL - 关闭所有中断 No interrupts */
0x00000000 /* RCLKCHK - Not used */
};
MCASP_ConfigXmt mcaspCfgDataXmt = {
0xffffffff, /* XMASK - Use all 32 bits,左声道与右声道各16位 */
0x000180f8, /* XFMT - MSB first, 32-bit slots, CPU bus, 0 bit delay */
0x00000200, /* AFSXCTL - burst, single bit frame sync, ext FS 4 slot TDM*/
0x00000080, /* ACLKXCTL - Sample on falling CLK, divide by 1, ext CLK ,发送与接收同步*/
0x00000000, /* AHCLKXCTL - External HCLK */
0x00000005, /* XTDM - 0,2,4,6 enable*/
0x00000000, /* XINTCTL - No interrupts */
0x00000000 /* XCLKCHK - Not used */
};
MCASP_ConfigSrctl mcaspCfgDataSrctl = {
0x00000005, /* SRCTL0 - Receive, active high 101发送 110接收 */
0x00000006, /* SRCTL1 - Transmit, active high*/
0x00000005, /* SRCTL2 - Receive, active high */
0x00000006, /* SRCTL3 - Transmit, active high */
0x00000005, /* SRCTL4 - Receive, active high */
0x00000006, /* SRCTL5 - Transmit, active high*/
0x00000005, /* SRCTL6 - Receive, active high */
0x00000006 /* SRCTL7 - Transmit, active high */
};
MCASP_Config mcaspCfgData = {
&mcaspCfgDataGbl,
&mcaspCfgDataRcv,
&mcaspCfgDataXmt,
&mcaspCfgDataSrctl
};
/***************************************************************************/
/* ======== EVMDM642_AIC23_openCodec ======== */
/* Open the codec and return a codec handle */
/***************************************************************************/
MCASP_Handle QXDDM642_AIC23_openCodec()
{
Uint32 gblctl;
/* AIC23 handles,定义McASP的句柄*/
MCASP_Handle QXDDM642_AIC23_hMcASP;
/* Open and configure the McASP*/
QXDDM642_AIC23_hMcASP = MCASP_open(MCASP_DEV0, MCASP_OPEN_RESET);
/*配制McASP */
MCASP_config(QXDDM642_AIC23_hMcASP, &mcaspCfgData);
/* Clear transmit and receive status ,清除发送与接收状态*/
MCASP_RSETH(QXDDM642_AIC23_hMcASP, RSTAT, 0xffff);
MCASP_RSETH(QXDDM642_AIC23_hMcASP, XSTAT, 0xffff);
/* Clear GBLCTL,将所有的单元复位 */
gblctl = 0;
MCASP_RSETH(QXDDM642_AIC23_hMcASP, GBLCTL, gblctl);
gblctl = 0x404;
/*使能发送与接收的串行寄存器*/
MCASP_RSETH(QXDDM642_AIC23_hMcASP, GBLCTL, 0x404);
/* Enable transmit/receive state machines */
MCASP_RSETH(QXDDM642_AIC23_hMcASP, XBUF0, 0);
MCASP_RSETH(QXDDM642_AIC23_hMcASP, XBUF2, 0);
MCASP_RSETH(QXDDM642_AIC23_hMcASP, XBUF4, 0);
MCASP_RSETH(QXDDM642_AIC23_hMcASP, XBUF6, 0);
gblctl = 0x0c0c;
MCASP_RSETH(QXDDM642_AIC23_hMcASP, GBLCTL, gblctl);
return QXDDM642_AIC23_hMcASP;
}
实在不知道问题出在哪里,怎么解决。求各位帮忙,谢谢!
通常增加延迟并不会影响数据交换. 除非在要求连续传输的数据中间引起数据传输超时错误了
我也在用这个DSP,用的代码和你的一样,但是我只要更改AIC23B的采样率后,就不能发声了;另外,当右击变量查看变化后或者暂停程序后再启动后,突然就听不到声音了,调试了好久都没能解决,你能不能把你的这个文件发给我一份,或者帮我之处我的问题所在,我的邮箱wl596121344@163.com,万分感谢
