新手求助!关于LPC1788 用UDA1380播放WAV问题
在NXP申请了块LPC1788的板子。。。自带UDA1380。。根据官方例程USBHostLite 驱动U盘。把WAV(44.1KHZ 16位) 文件放入U盘。
FCLK=120M
PCLK=60M
分频得到MCLK =15M
TXBITRATE=10
直接把音频的数据存在数组里播放播放正常 说明 UDA1380初始化、位速率设置应该没问题。。
然后直接播放存在U盘里的WAV文件 以下播放程序。。根据Lengxue童鞋的修改的。。。在这里感谢Lengxue的无私奉献。
NVIC_EnableIRQ(I2S_IRQn);//触发深度已设置为4字节
while(1) // 读音频数据并播放
{
if (flag_buff1empty)
{
bytes_read = FILE_Read(fdr, buff1, MAX_BUFFER_SIZE);
flag_buff1empty = 0;
//bytes_read 返回分块读取的数据长度 MAX_BUFFER_SIZE 读取的最大长度 既bytes_read <=MAX_BUFFER_SIZE
if (bytes_read<MAX_BUFFER_SIZE) // 文件结束,结束循环
{
break;
}
}
if (flag_buff2empty)
{
bytes_read = FILE_Read(fdr, buff2, MAX_BUFFER_SIZE);
flag_buff2empty = 0;
if (bytes_read <MAX_BUFFER_SIZE) // 文件结束,结束循环
{
break;
}
}
}
NVIC_DisableIRQ(I2S_IRQn);
FILE_Close(fdr);
}
void I2S_IRQHandler (void)
{ char i;
LPC_GPIO2->CLR |= (1 << 25);
if (buff1En == 0)
{
for (i = 0; i < 4; i++, buffSndCnt1 += 4)
{
LPC_I2S->TXFIFO = (buff1 << 0) /*写FIFO数据 32字节 */
| (buff1 << 8)
| (buff1 << 16)
| (buff1 << 24);
}
if (buffSndCnt1 == MAX_BUFFER_SIZE )
{
flag_buff1empty = 1; // Buff1 kong
buffSndCnt1 = 0; // buffSndCnt1清0
buff1En =~buff1En;
}
}
else
{
for (i = 0; i < 4; i++, buffSndCnt2 += 4)
{
LPC_I2S->TXFIFO = (buff2 << 0)
| (buff2 << 8)
| (buff2 << 16)
| (buff2 << 24);
}
if (buffSndCnt2 == MAX_BUFFER_SIZE)
{
flag_buff2empty = 1; // Buff1 kong
buffSndCnt2 = 0; // buffSndCnt1清0
buff1En =~buff1En;
}
}
}
运行结果: 杂音严重。
MAX_BUFFER_SIZE越小 杂音相对少 但声音被拖长。。。
个人理解只要从U盘读取块数据速度大于 播放块数据的速度, 结果应该和MAX_BUFFER_SIZE 无关。。
但显然U盘读取速度相对来说快的多。。。。。 COPY 一个10M文件只需几秒
小弟有点理解不能。请各位高手指教! 哥们!能把你的代码上传吗?
页:
[1]