播放mp3不连贯,请摊主看看问题在那里。

查询播放很不连贯,中断播放更不行,好像中断的时间太长。

LPC2132+CH375+VS1003

两个缓冲区轮循,读一个时,写另外一个。 //////////////////////////////////////////////////////////// void disk_mp3_read(void) { if(w_p==1) { w_p=3; mCmdParam.ReadX.mDataBuffer = &FILE_DATA_BUF1_MP3[0]; /* 指向文件数据缓冲区 */ mCmdParam.Read.mSectorCount =1; //读出的扇区数 CH375vFileSize += 511; /* 默认情况下,以扇区方式读取数据时,无法读出文件尾部不足1个扇区的部分,所以必须临时加大文件长度以读取尾部零头 */ i = CH375FileReadX( ); /* 从文件读取数据 */ CH375vFileSize -= 511; /* 恢复原文件长度 */ } if(w_p==0) { w_p=3; mCmdParam.ReadX.mDataBuffer = &FILE_DATA_BUF0_MP3[0]; /* 指向文件数据缓冲区 */ mCmdParam.Read.mSectorCount =1; //读出的扇区数 CH375vFileSize += 511; /* 默认情况下,以扇区方式读取数据时,无法读出文件尾部不足1个扇区的部分,所以必须临时加大文件长度以读取尾部零头 */ i = CH375FileReadX( ); /* 从文件读取数据 */ CH375vFileSize -= 511; /* 恢复原文件长度 */ } } ////////////////////////////////////////////////////////////// void disk_mp3_play(void) //查询DREQ播放 { uint i; if((IO0PIN & MP3_DREQ)!=0) { if((r_p>=0)&&(r_p<512)) { Mp3SelectData(); for(i=0;i<32;i++) { SPIPutChar(FILE_DATA_BUF0_MP3[r_p]); r_p++; if(r_p==1) w_p=1;

} Mp3DeselectData(); } if((r_p>=512)&&(r_p<1024)) { Mp3SelectData(); for(i=0;i<32;i++) { SPIPutChar(FILE_DATA_BUF1_MP3[r_p-512]); r_p++; if(r_p>=1024) r_p=0; if(r_p==513) w_p=0; } Mp3DeselectData(); } } } ////////////////////////////////////////////////////////////////// void IRQ_EXINT0(void) __irq //DREQ中断播放函数 { uint i; IO0SET |= lcd_led; if((r_p>=0)&&(r_p<512)) { Mp3SelectData(); for(i=0;i<32;i++) { SPIPutChar(FILE_DATA_BUF0_MP3[r_p]); r_p++; if(r_p==1) w_p=1; num+=10000;

} Mp3DeselectData(); } if((r_p>=512)&&(r_p<1024)) { Mp3SelectData(); for(i=0;i<32;i++) { SPIPutChar(FILE_DATA_BUF1_MP3[r_p-512]); r_p++; if(r_p>=1024) r_p=0; if(r_p==513) w_p=0; num+=10000; } Mp3DeselectData(); } EXTINT=0X1; //清除中断标志 VICVectAddr = 0; // 向量中断结束 } ///////////////////////////////////////////////////////////////////// void mp3_DREQ_init(void) //打开中断播放 { PINSEL1|=0x1; VICVectCntl6 = 0x2E; // EXINT0中断通道分配到IRQ slot 6,即优先级6 VICVectAddr6 = (unsigned long)IRQ_EXINT0; // 设置EXINT0向量地址 EXTMODE=0; //0为电平激活中断 EXTPOLAR=1; //1为高点平或上升沿中断 VICIntEnable |=(1<< 0XE); // 使能EXINT0中断

} ////////////////////////////////////////////////////////////////////// void InitPortVS1003(void) //初始化VS1003 { IO0DIR |= MP3_SCLK | MP3_MOSI ; IO0DIR |= IO0DIR& (~ MP3_MISO);

IO0DIR |= IO0DIR&(~MP3_DREQ);

IO0DIR |= MP3_XRESET | MP3_XCS | MP3_XDCS;//xRESET,xCS,xDS均为输出口 IO0SET |= MP3_XRESET | MP3_XCS | MP3_XDCS;//xRESET,xCS,xDS默认输出高电平 Mp3Reset(); } ///////////////////////////////////////////////////////////////////////