stm32f446做的usb声卡 采用USB_OTG_HS模式,usb传进来的数据48k采样率的数据进行左右声道分开通过dma搬运到sai两个子音频单声道输出
直接将usb传进来的数据发送是没有失真,音频是个正玄波数据来的,进行左右声道分离后失真,波形有些缺失重叠的,然后我修改了接收usb数据回调的函数的数据包数为40个包就没有失真,原来是80个包的,试了很多个数,就40不失真
/* Number of sub-packets in the audio transfer buffer. You can modify this value but always make sure
that it is an even number and higher than 3 音频传输缓冲区中的子包数。您可以修改此值,但始终确保它是偶数并且大于3*/
#define AUDIO_OUT_PACKET_NUM 40U //40 最佳其他都有问题
/* Total size of the audio transfer buffer *///音频传输缓冲区的总大小
#define AUDIO_TOTAL_BUF_SIZE ((uint16_t)(AUDIO_OUT_PACKET * AUDIO_OUT_PACKET_NUM))//音频输出大小*音频输出数据包数
下面是usb的数据回调函数 1.数据buf 2.大小字节数3.采样率
void Audio_Player_Play(uint8_t* pBuffer, uint32_t Size, uint32_t samplerate)//
{
uint16_t i = 0;
uint16_t a=0; //data a b 的地址索引
SPI_Samplerate(samplerate,0);//发送采样率
if(Size > 0xFFFF) Size = 0xFFFF;
for(i = 0 ; i < Size ; i+=8) // 左右通道分离。源数据是32位的,数据存放buf是8位的
{
audio_data_a[a+0]=pBuffer[i+0];
audio_data_a[a+1]=pBuffer[i+1];
audio_data_a[a+2]=pBuffer[i+2];
audio_data_a[a+3]=pBuffer[i+3];
audio_data_b[a+0]=pBuffer[i+4];
audio_data_b[a+1]=pBuffer[i+5];
audio_data_b[a+2]=pBuffer[i+6];
audio_data_b[a+3]=pBuffer[i+7];
a+=4;
}
HAL_SAI_Transmit_DMA(&hsai_BlockA1, audio_data_a,Size/8);
HAL_SAI_Transmit_DMA(&hsai_BlockB1, audio_data_b,Size/8);//dma发送到sai输出,4组为一个声道,再分开左右声道,所以传输数量/8
}