我利用F103的文件系统读取SD卡里的wav文件(有符号16bit 双通道 44. 1K),通过I2S传输数据出现噪声但能听到歌曲。
是利用I2S中断里发送WAV数据,在主循环里开了个双缓冲的数组AB 不断通过文件系统读取4096字节放进。发现中断里的wav数据只有在我右移2位以上才会放出歌曲,并且噪声伴随。左移的位数越多只是声音越低。如果不右移则播放仅仅是 滋滋滋 哒哒哒的声音。
主循环:
[mw_shl_code=c,true]if(mf_open("0:music/nizhang.wav",0x01)==0)
{
wav_read_A();
flag_A=1;
}
while(1)
{
switch(flag_A)
{
case 1:wav_read_B();while(flag_A==1);
break;
case 0:wav_read_A();while(flag_A==0);
break;
}
} [/mw_shl_code]
I2S中断:
[mw_shl_code=c,true]if (SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_TXE) == SET)
{
if(flag_A)
{
switch(count)
{
case 0: tmp = Wave_A[i++];
tmp = (tmp|(Wave_A[i++]<<8))>>2;
SPI_I2S_SendData(SPI2, tmp);count++;
break;
case 1: tmp = Wave_A[i++];
tmp = (tmp|(Wave_A[i++]<<8))>>2;
SPI_I2S_SendData(SPI2, tmp);
count=0;
break;
}
}
if(flag_A==0)
{
switch(count)
{
case 0: tmp = Wave_B[i++];
tmp = (tmp|(Wave_B[i++]<<8))>>2;
SPI_I2S_SendData(SPI2, tmp);count++;
break;
case 1: tmp = Wave_B[i++];
tmp = (tmp|(Wave_B[i++]<<8))>>2;
SPI_I2S_SendData(SPI2, tmp);
count=0;
break;
}
}
}
if(i>=sizeof(Wave_A))
{
switch(flag_A)
{
case 1: flag_A=0;
break;
case 0: flag_A=1;
break;
}
i=0;
}[/mw_shl_code]
如果我播放8bit的44k音频数据则是正常的,但是8bit数据在I2S发送数据时候左移则声音增大,不过只能左移到4位,超过4位后也是出现哒哒哒的声音。希望各路懂播放wav的人来帮帮忙
|