nbsp;I2S_Cmd(SPI3, ENABLE);
41 }
代码12行处通过调用GPIO_PinRemapConfig()函数禁用JTAG, 32行处模式配置为主设备发送I2S_Mode_MasterTx,通信标准设置为I2S Philips标准I2S_Standard_Phillips,数据格式为标准16位格式I2S_DataFormat_16b,采样频率设置为44kHz I2S_AudioFreq_44k, I2S时钟线空闲状态的为低电平。
为了提高数据的传输速度与效率,要打开IIS的DMA发送功能,每次发送SPI_I2S_DMAReq_Tx 请求后会将指定的buf0内的数据发送到SPI3的DR数据寄存器。我该函数是buf0即为存储音频数据的audiobuf, 因为我们的数据是按照16bit传送audiobuf内的数据为uint8型所以 num值为audiobuf内的有效数据长度/2。
1 void I2S2_TX_DMA_Init(u8* buf0,u16 num)
2 {
3 NVIC_InitTypeDef NVIC_InitStructure;
4 DMA_InitTypeDef DMA_InitStructure;
5 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
6 DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&SPI3->DR);
7 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)buf0;
8 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
9 DMA_InitStructure.DMA_BufferSize = num;
10 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
11 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
12 DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;
13 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
14 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular ;
15 DMA_InitStructure.DMA_Priority = DMA_Priority_High;
16 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
17 DMA_Init(DMA2_Channel2, &DMA_InitStructure);
18 DMA_Cmd(DMA2_Channel2, ENABLE);
19 SPI_I2S_DMACmd(SPI3,SPI_I2S_DMAReq_Tx,ENABLE);
20 }
音频流的处理过程为通过UDP接收音频数据包,然后对收到的数据包进行解码,并将解码后的数据存储到audiobuf,通过I2S3的DMA功能将数据发送到PCM5102A模块,代码如下所示:
1 void do_raop(uint8 s)
2 {
3 int outputlen;
4 uint8 ip[4];
5 uint16 len, port;
6 switch (getSn_SR(s)) {
7 case SOCK_UDP:
8 if ((len = getSn_RX_RSR(s)) > 0) {
9 /*接收音频数据*/
10 recvfrom(s,buffer,len,ip,&port);
11 /*解码收到的音频数据*/
12 outputlen=decode_audio_data(buffer, len ,1);
13 /*配置DMA*/
14 I2S2_TX_DMA_Init((uint8*)audiobuf,outputlen/2);
15 }
16 break;
17 case SOCK_CLOSED:
18 socket(s, Sn_MR_UDP,55641,0);
19 break;
20 &nbs