|
|
楼主 |
发表于 2026-9-9 09:12:20
|
显示全部楼层
采样率的计算确实存在问题,如果按照下图设置,I2S音频采样率应该为4K,实际硬件测试为32K。
用示波器测试,左右声道时钟为32Khz,表明采样率为32K而不是4K。
AI8051试验箱第81号例程,采样率为32K,代码如下:
#define FOSC 40960000UL //定义主时钟
#define SampleRate 32000 //定义采样率
#define I2S_MCLKDIV (FOSC/(8*16*2*SampleRate)) //MCLK分频系数, 对于双声道16bit.
#define I2S_BCLKDIV (FOSC/(16*2*SampleRate)) //BCLK分频系数, 对于双声道16bit.
void I2S_config(void)
{
I2SMD = 0xff; //内部保留字节,需设置为FFH
I2SSR = 0x00; //状态寄存器清0
I2SCR = 0x80+0x00; //使能发送缓冲区空中断(0x80), +0x00:Motorola格式, +0x10:TI格式
HSCLKDIV = 1; //高速时钟分频器 1~255 (默认2)
I2S_CLKDIV = 1; //I2S主时钟分频
I2SMCKDIV = I2S_MCLKDIV; //I2S时钟分频,I2SMCLK = 主频/2/I2S_CLKDIV/HSCLKDIV/I2SMCKDIV, 或I2SMCLK = PLLCLK/2/I2S_CLKDIV/HSCLKDIV/I2SMCKDIV
I2SPRH = (MCKOE << 1) + (I2S_BCLKDIV & 1); //设置I2S_BMCLK分频系数的bit0, 并允许或禁止输出MCLK。
I2SPRL = I2S_BCLKDIV/2; //设置I2S_BMCLK分频系数的bit8~bit1
I2SCFGH = I2S_MODE; //设置I2S模式为主机发送模式
I2SCFGL = (PCMSYNC << 7) + (STD_MODE << 4) + (CKPOL << 3) + (DATLEN << 1) + CHLEN;
P_SW3 = (P_SW3 & 0x3f) | (1<<6); //I2S端口切换, 0: P3.2(BCLK) P3.3(MCLK) P3.4(SD) P3.5(WS), 2024-7-21
// 1: P1.7(BCLK) P1.6(MCLK) P1.5(SD) P1.4(WS),
// 2: P2.3(BCLK) P2.2(MCLK) P2.1(SD) P2.0(WS),
// 3: P4.3(BCLK) P1.6(MCLK) P4.1(SD) P4.0(WS),
I2SCFGH |= I2SEN; //使能I2S模块
}
经过计算 I2S_BCLKDIV= 40960000/(16*2*32000)=40
如果按照手册
采样率=40960000/[16*2*40*8]=4Khz
试验箱81号例程实际是正确的,倒推手册中的公式就是错误的!
|
|