6. I2S的标准音输出

本文讨论I2S的音频输出不同的波形

I2S的时钟设可以基于系统时钟或者PLL3的输出,使用PLL3可以利用PLL3MUL进行更多的调节

由于主板设计音频模块需要MCK主时钟的输出,根据参考手册中的公式,可以反向计算I2SDIV和PLL3MUL值的组合,以达到更精确的目的

参考手册中的16位数据公式与实际芯片不符,参考32位公式,更正为

FS = I2SxCLK / [(16*2)*((2*I2SDIV)+ODD)*4)]

I2SDIV = (I2SxCLK / FS*(16*2*4) - ODD) / 2

I2SxCLK 是PLL3的输出时钟

PLL3MUL为16x,I2SDIV为6,ODD为1时,FS输出为最近似48000Hz的48077Hz

rcc->cfgr2 |= 0x0003E744; // I2S2=PLL3 PLL3=16x PREDIV1SRC=PLL2 PLL2MUL=x9 PREDIV2=/5 PREDEV1=/5

spi2->i2spr = 0x0306; // 48000khz mck=1 odd=0 div=0x02

I2S的16位设置为SPI输出双字节为一个声道的一帧,左右声道互相交替

while ((spi2->sr & 0x2)==0x0);

spi2->dr = lch[ii];

while ((spi2->sr & 0x2)==0x0);

spi2->dr = rch[ii];

标准音频率为440Hz,数据缓冲的帧数为48000/440=111

生成4种波形

正弦波 waveform_gen_sine

三角波 waveform_gen_triangle

锯齿波 waveform_gen_sawtooth

直方波 waveform_gen_square

Wikipedia的Waveform词条有波形的试音,可以用于验证程序结果