好像当初设置的时候哪里有点问题,原来计算量小的时候两边都没问题,奇怪的是计算量变大后虽然能发出声音不失真,但接收不到声音了,按理说不是同步的吗?
主程序写入读取部分如下:
while ((MCASP_RGETH(QXDdm642codec,SRCTL4) & 0x10) == 0); MCASP_RSETH(QXDdm642codec,XBUF4,codecdata);
while ((MCASP_RGETH(QXDdm642codec,SRCTL5) & 0x20) == 0);
ee=MCASP_RGETH(QXDdm642codec,RBUF5);
ee每一个循环都处理后赋在一个数组里,能存20个数,几乎全是0,偶尔有数。
mcasp设置如下:
MCASP_ConfigGbl mcaspCfgDataGbl = {
0x00000000, /* PFUNC – All pins as McASP ,所有的管脚均为McAPS功能*/
0x00000010, /* PDIR – 0,2,4,6为input,1,3,5,7为XMT DATA output, 其它的为输入 试试可以是10吗*/
0x00000000, /* DITCTL – DIT mode disable */
0x00000000, /* DLBCTL – Loopback disabled */
0x00000000 /* AMUTE – Never drive AMUTE */
};
MCASP_ConfigRcv mcaspCfgDataRcv = {
0xffffffff, /* RMASK – Use all 32 bits,左声道与右声道各16位 */
0x000080f8, /* RFMT – MSB first, 32-bit slots,0-pad,CPU bus, 0 bit delay,数据格式 */
0x00000100, /* AFSRCTL – tdm 2 slots, single bit frame sync, ext FS 帧同步的格式*/
0x00000080, /* ACLKRCTL – Sample on rising CLK, divide by 1, ext CLK */
0x00000000, /* AHCLKRCTL – External HCLK */
0x0000000f, /* RTDM – Slots 0123 are active r:这里存疑 2*/
0x00000000, /* RINTCTL – No interrupts */
0x00000000 /* RCLKCHK – Not used */};
MCASP_ConfigXmt mcaspCfgDataXmt = {
0xffffffff, /* XMASK – Use all 32 bits 全f 试试改成6个f的24bit?*/
0x000080f8, /* XFMT – MSB first, 32-bit slots, CPU bus, 0 bit delay */
0x00000100, /* AFSXCTL – tdm 2 slots, single bit frame sync, ext FS */
0x00000080, /* ACLKXCTL – Sample on falling CLK, divide by 1, ext CLK ,发送与接收同步 80*/
0x00000000, /* AHCLKXCTL – External HCLK 0*/
0x00000005, /* XTDM – 0 2 enable 5*/
0x00000000, /* XINTCTL – No interrupts 0*/
0x00000000 /* XCLKCHK – Not used 0*/
};
MCASP_ConfigSrctl mcaspCfgDataSrctl = {
0x00000000, /* SRCTL0 – Receive, active high */
0x00000000, /* SRCTL1 – Transmit, active high*/
0x00000000, /* SRCTL2 – Receive, active high */
0x00000000, /* SRCTL3 – Transmit, active high */
0x00000005, /* SRCTL4 – Receive, active high * 可以试试d*/
0x00000006, /* SRCTL5 – Transmit, active high*/
0x00000000, /* SRCTL6 – Receive, active high */
0x00000000 /* SRCTL7 – Transmit, active high */
};
感觉不知道是不是rtdm/xtdm设置出问题了,这部分看了半天资料还是不太清楚该怎么设。
aic23是dsp format:
0x0043, /* Set-Up Reg 7 Digital audio interface format */ \
/* XX 00 reserved */ \
/* MS 1 master/slave mode: master */ \
/* LRSWAP 0 DAC left/right swap: disabled */ \
/* LRP 0 DAC lrp: MSB on 1st BCLK */ \
/* IWL 00 input bit length: 16 bit */ \
/* FOR 11 data format: DSP format */
求解….
Tony Tang:
我怀疑是McASP overrun了,不防把overrun中断配置上,看是不是会触发overrun中断。
Haoyuan Chen:
回复 Tony Tang:
抱歉,因为暂时降低了点计算量所以这几天没有回应您,现在还是有这个问题。呃,overrun和underrun我看了下手册。
underrun是指rbuf里前一个数据还没被读因为计算太慢要刷新下一个数据导致的?但是声音能发出来不就说明来得及发送吗,读取就在下一句有可能来得及发却来不及收吗……我记得收发时钟设置的是同步的
还有请问怎么设置中断?检查rovrn flag?
现在手上没板……请问如果真是这个问题是说明程序服务得不够好改下就可以还是算法计算量太大必须要优化?
Haoyuan Chen:
回复 Tony Tang:
@Tony Tang求助啊!
Tony Tang:
回复 Haoyuan Chen:
0x0000000f, /* RTDM – Slots 0123 are active r:这里存疑 2*/
0x00000005, /* XTDM – 0 2 enable 5*/
上面的寄存器配置不对,I2S只有0,1两个slot。
Haoyuan Chen:
回复 Tony Tang:
都改成3?
Tony Tang:
回复 Haoyuan Chen:
对,2个slot配置应该为3。