- 积分
- 1179
- 在线时间
- 2353 小时
- 最后登录
- 2022-4-23
- 阅读权限
- 70
- 精华
- 0
- UID
- 577648
- 帖子
- 1089
- 精华
- 0
- 经验
- 1179 点
- 金钱
- 958 ¥
- 注册时间
- 2013-3-26
|
本帖最后由 BH7KQK 于 2020-6-23 22:39 编辑
以STM32F105为例。代码片段。以及播放流程。
1: 使用11.289600晶振。
#define SYSCLK_FREQ_72MHz 67737600
开PLL3,I2S专用PLL
RCC_PREDIV2Config(RCC_PREDIV2_Div1);
RCC_PLL3Config(RCC_PLL3Mul_6);
RCC_PLL3Cmd(ENABLE);
/* Configure I2S clock source: On Connectivity Line Devices, the I2S can be
clocked by PLL3 VCO instead of SYS_CLK in order to guarantee higher
precision */
RCC_I2S2CLKConfig(RCC_I2S2CLKSource_PLL3_VCO);
I2S2使用PLL3作为时钟。
2:
SPI_I2S_DeInit(SPI2);
/* I2S peripheral configuration */
I2S_InitStructure.I2S_Standard = I2S_Standard_LSB;
I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_16b;
//I2S_InitStructure.I2S_MCLKOutput = I2S_MCLKOutput_Enable;
I2S_InitStructure.I2S_MCLKOutput = I2S_MCLKOutput_Disable;
I2S_InitStructure.I2S_AudioFreq = I2S_AudioFreq_44k;
I2S_InitStructure.I2S_CPOL = I2S_CPOL_Low;
I2S_InitStructure.I2S_Mode = I2S_Mode_MasterTx;
I2S_Init(SPI2, &I2S_InitStructure);
/* DMA1 Channel5 configuration ----------------------------------------------*/
DMA_DeInit(DMA1_Channel5);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI2->DR;
-------------------------------------------------------------------------------------
配置DMA之后,使用双缓冲机制,过半中断检测。
之后,就是读卡,在主程序里把WAV数据分别读入缓冲区,启动I2S外设就可以了。
简单来说,就是I2S使用DMA,配置好之后,什么也不用管,主程序只要保证及时把数据丢给DMA缓冲区。
启动之后,DMA就会按照I2S配置的44.100K的频率把数据发送出去,DAC芯片收到就会转换成声音出来。
|
|