18
15
134
注册会员
/*---------------------------------------------------------------------*/ /* --- Web: www.STCAI.com ---------------------------------------------*/ /*---------------------------------------------------------------------*/ /************* 功能说明 ************** 本例程基于AI8051U为主控芯片的实验箱进行编写测试. 使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。 edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。 测试工作频率为 45.1584MHz ******************************************/ #include "../../comm/AI8051U.h" #include "stdio.h" #include "intrins.h" #include "TLV320AIC23.H" #define FOSC 45158400UL // 定义主时钟 #define SampleRate 44100 // 定义采样率 #define MCKOE 1 // I2S 主时钟输出控制 , 0:禁止 I2S 主时钟输出, 1:允许 I2S 主时钟输出 #define I2SEN 0x04 // I2S 模块使能 0x00:禁止, 0x04:允许 //0:从机发送模式 //1:从机接收模式 //2:主机发送模式 //3:主机接收模式, #define I2S_MODE 2 // I2S 模式 //0:短帧同步 //1:长帧同步 #define PCMSYNC 0 //PCM 帧同步 //0: I2S 飞利浦标准 //1: MSB 左对齐标准 //2:LSB 右对齐标准 //3:PCM 标准 //#define STD_MODE 1 //I2S 标准选择 #define STD_MODE 0 // 飞利浦标准 //#define STD_MODE 2 // 右对齐标准 //#define STD_MODE 3 // PCM 标准 //0:时钟稳定状态为低电平 //1:时钟稳定状态为高电平 #define CKPOL 0 //I2S 稳态时钟极性 //0:16 位 //1:24 位 //2:32 位 //3:保留 #define DATLEN 0 //数据长度 //0:16 位 //1: 32 位 #define CHLEN 0 //通道长度(每个音频通道的位数) #if (MCKOE == 1) //允许主时钟输出 #define I2SDIV FOSC/(16*2*8*SampleRate) //对于双声道允许主时钟输出 16bit 256fs //则 2*DIV + ODD = I2S 时钟 / 256fs //必要需要 DIV >= 2, 即分频系数 >=4. #endif #if (MCKOE == 0) //禁止主时钟输出 #define I2SDIV FOSC/(16*2*SampleRate) //对于双声道禁止主时钟输出 16bit //则 2*DIV + ODD = I2S 时钟 / 32fs //必要需要 DIV >= 2, 即分频系数 >=4. #endif u8 dac_index; //输出计数索引 bit B_rise; void delay_ms(u16 ms) { u16 i; do { i = FOSC / 6000; while(--i); }while(--ms); } void main(void) { EAXFR = 1; //允许访问扩展的特殊寄存器,XFR //(32 位模式请使用这句,注释下一句) // P_SW2 |= 0x80; //允许访问扩展的特殊寄存器,XFR //(8 位模式请使用这句,注释上一句) WTST = 0; // 设置取程序代码等待时间, 赋值为 0 表示不等待,程序以最快速度运行 CKCON = 0; // 设置访问片内的 xdata 速度,赋值为 0 表示用最快速度访问,不增加额外的等待时间 P0M0 = 0x00; P0M1 = 0x00; P1M0 = 0x00; P1M1 = 0x00; P2M0 = 0x00; P2M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; P4M0 = 0x00; P4M1 = 0x00; P5M0 = 0x00; P5M1 = 0x00; AIC23_Init(); AIC32_InitSet(); I2SMD = 0xff; //内部保留字节,需设置为 FFH I2SCR = 0x80; //使能发送缓冲区空中断(0x80),摩托罗拉格式 // 设置 I2S 主时钟输出(I2SMCK), 设置 ODD I2SPRH = (MCKOE << 1) + (I2SDIV & 1); I2SPRL = I2SDIV/2; //设置 I2S 时钟分频 I2SCFGH = I2S_MODE; //设置 I2S 模式为主机发送模式 I2SCFGL = (PCMSYNC << 7) + (STD_MODE << 4) + (CKPOL << 3) + (DATLEN << 1) + CHLEN; //0: P3.2(BCLK) P3.4(SD) P5.4(MCLK) P3.5(WS) //1: P1.5(BCLK) P1.3(SD) P1.6(MCLK) P5.4(WS) //2: P2.5(BCLK) P2.3(SD) P5.4(MCLK) P2.2(WS) //3: P4.3(BCLK) P4.0(SD) P1.6(MCLK) P5.4(WS) //P_SW3 = (P_SW3 & 0x3f) | (0<<6); //I2S 端口切换 P_SW3 = (P_SW3 & 0x3f) | (0<<6); I2SCFGH |= I2SEN; // 使能 I2S 模块 // 开中断 EA = 1; dac_index = 0; B_rise = 1; while (1) { } } // I2S发送完成中断 void I2S_ISR(void) interrupt 62 { u8 i; // 发送缓冲区空 if (I2SSR & 0x02) { // 哪个通道的发送通道的数据为空 if (I2SSR & 0x04) { // 右声道发送完成,准备左通道的 i = dac_index; I2SDRL = i; //发送下一帧音频数据 I2SDRH = 0; } else { // 左声道发送完成,准备右通道的 i = dac_index; I2SDRL = i^255; //发送下一帧音频数据 I2SDRH = 0; dac_index++; } } } 复制代码
使用道具 举报 送花
775
1万
管理员
神*** 发表于 2025-5-14 11:53 I2SMCLK, I2S 主时钟 I2SBCK, I2S 位时钟
86
5979
超级版主
sunca*** 发表于 2025-5-14 12:21 采样率48KHz,通道设置为16位时,BLCK是依旧是3.1MHz左右,也不正常。不应该是2*16*48KHz=1.536MHz吗?
本版积分规则 发表回复 回帖后跳转到最后一页
|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )
GMT+8, 2025-8-24 08:17 , Processed in 0.129623 second(s), 101 queries .
Powered by Discuz! X3.5
© 2001-2025 Discuz! Team.