各位前辈:
我也碰到了类似的问题,求各位高手指点!使用环境如下:
(1)采用C6727B的mcasp接收AIC23B的音频采样数据;
(2)Mcasp工作与同步模式、时钟信号由内部产生;对应AXCLK、AFSX接入到Aic23的BCLK、LRCIN和LRCOUT;
(3)Mcasp工作于突发模式,2slot,但只传输一个slot0,故RTDM和XTDM均为1;
结果:接收数据正常,但发送数据始终发不出来;查询对应SRCTLn中XRDY状态,始终为0.该问题已困扰10个深夜了,也黔驴技穷,求高手指点!
相关寄存器配置如下:
/************************复位***************************/
#define GBLCTL0 (*(unsigned int*)(McASP0_BASE + 0x44))
#define DLBCTL0 (*(unsigned int*)(McASP0_BASE + 0x4c))
#define RGBLCTL0 (*(unsigned int*)(McASP0_BASE + 0x60))
#define XGBLCTL0 (*(unsigned int*)(McASP0_BASE + 0xA0))
GBLCTL0=0;
flag=GBLCTL0; while(flag!=0){flag=GBLCTL0;};
DLBCTL0=0;
flag=DLBCTL0; while(flag!=0){flag=DLBCTL0;};
/************************接收端口配置***************************/
#define RMASK0 (*(unsigned int*)(McASP0_BASE + 0x64))
#define RFMT0 (*(unsigned int*)(McASP0_BASE + 0x68))
#define AFSRCTL0 (*(unsigned int*)(McASP0_BASE + 0x6c))
#define RTDM0 (*(unsigned int*)(McASP0_BASE + 0x78))
RMASK0=0xFFFFFFFF;
RFMT0=0x0000180f8; ////1bit delay;MSB first;32bit;peripherial bus
AFSRCTL0=0x00000113; ////2-slot,1word width;internal FS;falling edge begin a frame--1;rising edge----0
RTDM0=1; // slot 0 is active; CSL_MCASP_RTDM_RTDMS_MASK; //all slot is active
/************************发送端口配置***************************/
#define XMASK0 (*(unsigned int*)(McASP0_BASE + 0xA4))
#define XFMT0 (*(unsigned int*)(McASP0_BASE + 0xA8))
#define AFSXCTL0 (*(unsigned int*)(McASP0_BASE + 0xAc))
#define XTDM0 (*(unsigned int*)(McASP0_BASE + 0xB8))
XMASK0=0xFFFFFFFF;
XFMT0=0x000180f8; ////1bit delay;MSB first;32bit;peripherial bus
flag=XFMT0; while(flag!=0x000180f8){flag=XFMT0;};
AFSXCTL0=0x00000113; ////2-slot,1word width;internal FS;falling edge begin a frame--1;rising edge----0
flag=AFSXCTL0; while(flag!=0x00000113){flag=AFSXCTL0;};
XTDM0=1; // slot 0 is active; CSL_MCASP_RTDM_RTDMS_MASK; //all slot is active
flag=XTDM0; while(flag!=1){flag=XTDM0;};
/************************发送时钟配置***************************/
#define ACLKXCTL0 (*(unsigned int*)(McASP0_BASE + 0xB0))
#define AHCLKXCTL0 (*(unsigned int*)(McASP0_BASE + 0xB4))
#define XCLKCHK0 (*(unsigned int*)(McASP0_BASE + 0xC8))
ACLKXCTL0=0x00000020;
XCLKCHK0=0xFF000F;
AHCLKXCTL0=0x00008003;
/************************接收时钟配置***************************/
#define ACLKRCTL0 (*(unsigned int*)(McASP0_BASE + 0x70))
#define AHCLKRCTL0 (*(unsigned int*)(McASP0_BASE + 0x74))
#define RCLKCHK0 (*(unsigned int*)(McASP0_BASE + 0x88))
ACLKRCTL0=0x000000a0;
RCLKCHK0=0xFF000F;
AHCLKRCTL0=0x00008003;
SRCTL01=2;//mcasp01为接收器
flag=SRCTL01; while(flag & 0x03!=2){flag=SRCTL01;};
SRCTL00=1;//mcasp00为发送器
flag=SRCTL00;
flag=flag & 0x03;
while(flag !=1){flag=SRCTL00;};
/************************中断与DMAX event26关联的配置(此处验证无问题)***************************/
RINTCTL=RINTCTL|0x20;//RINTCTL & 0xFFFFFFEF;//
flag=RINTCTL; while(flag & 0x20==0){flag=RINTCTL;};
XINTCTL=XINTCTL|0x20;
flag=XINTCTL; while(flag & 0x20==0){flag=XINTCTL;};
AMUTE=AMUTE & 0xFFFFFFF3;
flag=AMUTE; while(flag & 0x0C!=0){flag=AMUTE;};
/************************传输端口配置***************************/
//set PFUNC;PDIR;DITCTRL;AMUTE.
PFUNC0= ~(B28_MSK | B26_MSK | B1_MSK | B0_MSK); //McASP AFSX,ACLKX,AXR[01],AXR[00]
PDIR0 = (B28_MSK | B26_MSK | B0_MSK);// | //Output AFSX,ACLKX,AXR[00]
/************reset AHCLK **************/
RGBLCTL0=RGBLCTL0|0x02;// RHCLKRST XHCLKRST置1
flag=RGBLCTL0; while(flag & 0x02==0){flag=RGBLCTL0;};
XGBLCTL0=XGBLCTL0|0x200;// RHCLKRST XHCLKRST置1
flag=XGBLCTL0; while(flag & 0x200==0){flag=XGBLCTL0;};
/************reset ACLK **************/
RGBLCTL0=RGBLCTL0|0x01;// XCLKRST RCLKRST置1
flag=RGBLCTL0; while(flag & 0x01==00){flag=RGBLCTL0;};
XGBLCTL0=XGBLCTL0|0x100;// XCLKRST RCLKRST置1
flag=XGBLCTL0; while(flag & 0x100==0){flag=XGBLCTL0;};
//激活串行器
XSTAT=0xFFFF;
RSTAT=0xFFFF;
XGBLCTL0=XGBLCTL0|0x400;// RSRCLR XSRCLR1
flag=XGBLCTL0; while(flag & 0x400==0){flag=XGBLCTL0;};
RGBLCTL0=RGBLCTL0|0x04;// RSRCLR XSRCLR1
flag=RGBLCTL0; while(flag & 0x04==0){flag=RGBLCTL0;};
XBUF00=0;
RBUF01=0;
//状态机退出复位
RGBLCTL0=RGBLCTL0|0x08;// RSMRST XSMRST
flag=RGBLCTL0; while(flag & 0x08==0){flag=RGBLCTL0;};
XGBLCTL0=XGBLCTL0|0x800;// RSMRST XSMRST
flag=XGBLCTL0; while(flag & 0x800==0){flag=XGBLCTL0;};
//帧同步信息退出复位
RGBLCTL0=RGBLCTL0|0x10;// XFST RFRST
flag=RGBLCTL0; while(flag & 0x10==0){flag=RGBLCTL0;};
XGBLCTL0=XGBLCTL0|0x1000;// XFST RFRST
flag=XGBLCTL0; while(flag & 0x1000==0){flag=XGBLCTL0;};