完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
各位前辈:
我也碰到了类似的问题,求各位高手指点!使用环境如下: (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;]; |
|
相关推荐
13 个讨论
|
|
Dahai,
#1. 对于配置有个地方我不确定你的系统时钟是多少,以及McASP口的时钟要配置为多少,所以对于 AHCLKXCTL0 = (1<<15 | 3); 后面的divider不能确定,需要你自己计算一下。 #2. 不对知道你对AIC23配置的数据宽度是多少,需要你自己对XFMT的slot size确定一下。 XFMT0 = ( 1<<16 | 1<<15 | 0x0F <<4 | 1<<3); #3. 跑一下修改过的工程,如果有问题再说。 http://processors.wiki.ti.com/index.php/Main_Page Think Over Before Asking. http://www.catb.org/~esr/faqs/smart-questions.html#goal |
|
|
|
|
|
lifei639156 发表于 2019-8-22 14:14 刚注意到只用Slot 0,还是把下面void set_McASP0()里的最后一句(如下)去掉吧,不然怕接收端underrun。 while((XSTAT0 & 0x20)!=0x20); XBUF00=0; http://processors.wiki.ti.com/index.php/Main_Page Think Over Before Asking. http://www.catb.org/~esr/faqs/smart-questions.html#goal |
|
|
|
|
|
lifei639156 发表于 2019-8-22 14:14 Tony Tang : 感谢您的热心支持。程序中问题依旧,现就您比较关注而我未说清楚的问题,回复如下: (1)系统时钟为24.576MHz(Mcasp的内部分频时使用AUXCLK,即系统时钟); (2)Mcasp收发采用TDM、2slot模式,但仅slot0有效; (3)每一个slot为32bit,采样数据率为96KHz(AIC23B中配置),故采样数据由AIC23向McASP传输的速率为2*32*96=6144KHz,也就是Mcasp的移位时钟频率CLK。对高频时钟AHCLKX进行分频、ACLKX进行1分频,由此可计算出高频时钟的分频为24.576MHz/6144KHz=4,由此确定AHCLKXCTL0 的参数值 系统自运行以来,一直表现的症状为: 数据接收通道正常:通过采样标准的正玄波,分析器频率可以确定接收通道没有问题; 发送通道:写数据至XBUF后,对应的SRCTL的Xdata位一直未0、数据也为发送出去(观测D/A通道波形)。 还请Tony Tang 指点迷津!!!!(下面帖子说的语句去掉后,问题依旧) |
|
|
|
|
|
ziying57 发表于 2019-8-22 14:51 检查一下XUNDRN是否置1了?也就是说发送buffer是否 underrun了。 按说都是用的内部时钟,只是sync mode,没道理只能接收,不能发送。 http://processors.wiki.ti.com/index.php/Main_Page Think Over Before Asking. http://www.catb.org/~esr/faqs/smart-questions.html#goal |
|
|
|
|
|
Tongtang:
您好,根据您的提示和帮助,我查看了STAT在状态,确实发生了XUNDRN。我将程序调整为不断向XBUF写数据并全速运行后,能输出音频(通过耳机收听)。但设置中断一旦程序停下后,再启动运行时,就又无音频输出了,SRCTL&0x10!=0不能通过;查询XSTAT状态(0x151),发生了XUNDRN。 实际应用中,我的程序并不是一直在往XBUF写数据的,而且,程序调试时,也因设置中断而停止运行,这些情况下,都无法再次输出音频,除非程序复位重新运行。我试着在写XBUF前,通过XSTST&0xFFFFFFFE,对XUNDRN清零,但问题也得不到解决,还请Tongtang大师进一步指点迷津。 |
|
|
|
|
|
ziying57 发表于 2019-8-22 15:18 Dahai, 这种现像就对了,在C6727的McASP user guide里有下面描述,即underrun之后,需要复位McASP,并重新配置。通常来说,McASP口使能之后是一直运行的,除非将之复位,即将GBLCTL清0. 3.6.2 Buffer Underrun Error - Transmitter In TDM mode, during an underrun case, a long stream of zeros are shifted out causing the DACs to mute. To recover, reset the McASP and start again with the proper initialization. 下面是一个关闭McASP的函数例程。 void shutdownAudio(void) [ // close codec. AIC3106_writeRegister(AIC3106_REG_PAGESELECT, 0); AIC3106_writeRegister(AIC3106_REG_RESET, 0x80); // close mcasp. MCASP->SRCTL0 = 0; MCASP->SRCTL1 = 0; MCASP->SRCTL2 = 0; MCASP->SRCTL3 = 0; MCASP->SRCTL5 = 0; MCASP->SRCTL11 = 0; MCASP->SRCTL12 = 0; MCASP->GBLCTL = 0; ] 在实际应用当中: #1. 音频数据是连续的,除非人为停止,所以I2S接口的时钟在使能后,就一直有。 #2. 中断本身不是问题,关键是中断ISR占用的时间不能太长,超出McASP响应的实时要求。 #3. 实际应用中,不会用轮循的办法去服务McASP,这样效率太低,要用EDMA,CPU只响应EDMA的中断,这样中断的频率就很低了,如果直接用McASP的中断,太频繁,效率太低,不实用。 #4.在实际应用中,使能McASP的错误中断,这样可以知道什么时候出错了,并做相应的处理,如复位McASP,重新配置等。 http://processors.wiki.ti.com/index.php/Main_Page Think Over Before Asking. http://www.catb.org/~esr/faqs/smart-questions.html#goal |
|
|
|
|
|
lifei639156 发表于 2019-8-22 15:34 TongTang: 问题全部解决,我明白了;非常感谢您的热情帮助!!!因我们的需求有点特殊,需要对每一个采样Sample进行处理;所以我们还是优化程序结构、用中断的方式,在XBUF为空时,及时写入合适的数据。 |
|
|
|
|
|
60user183 发表于 2019-8-22 15:56 Lauffer, 如果你还有问题,建议你在sitara论坛另启一个贴子,尽量详细描述你的问题,毕竟你的问题是另一个芯片的(虽然都差不多),这样对于你的问题有人跟踪回答更有保障。 http://processors.wiki.ti.com/index.php/Main_Page Think Over Before Asking. http://www.catb.org/~esr/faqs/smart-questions.html#goal |
|
|
|
|
|
lifei639156 发表于 2019-8-22 15:34 你好,我现在做的是用MCASP发送解调后的音频数据,但是用的是靠mcasp轮询发送的方式,所以每次都是解调出数据后进行发送 ,然后DSP程序继续运行 等下一次解调后继续发送新的数据、这样发送出来的数据断了。不能得到完整的音频波形。没有数据的时候系统正在执行DSP 的其他程序(类似解调数据的计算等等)。如你说说的实际应用#3.用EDMA配合mcasp每次我算出来的解调数据、依靠EDMA进行循环发送。这样我的CPU就能释放出来继续执行DSP的其他程序。应该是一个比较好的解决方案、但是能不能指导一下具体怎么做?? 我现在用的是直接对ASP 寄存器初始化配置,然后发数的方法。谢谢指导 |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
696 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
605 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1065 浏览 1 评论
760 浏览 0 评论
普中科技F28335开发板每次上电复位后数码管都会显示,如何熄灭它?
530 浏览 1 评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
171浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
133浏览 14评论
在使用3254进行录音的时候出现一个奇怪的现象,右声道有吱吱声,请教一下,是否是什么寄存器设置存在问题?
130浏览 13评论
TLV320芯片内部自带数字滤波功能,请问linein进来的模拟信号是否是先经过ADC的超采样?
126浏览 12评论
GD32F303RCT6配置PA4 ADC引脚,将PA2代替key功能,PA2连接时无法实现预期功能,为什么?
64浏览 10评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-30 17:05 , Processed in 1.119166 second(s), Total 70, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号