找回密码
 立即注册
查看: 967|回复: 19

Ai8051U的I2S外设时钟问题

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:591
  • 最近打卡:2025-08-23 22:30:56

18

主题

15

回帖

134

积分

注册会员

积分
134
发表于 2025-5-14 11:44:09 | 显示全部楼层 |阅读模式
1、I2S的BLCK时钟是不是“I2S 比特率”?


2、当通道数和采样率被固定时,BLCK时钟是不是按照公式就被固定了?
     I2S 比特率=每个通道的比特数×通道数×音频采样频率(FS)

3、改变I2S 分频寄存器(I2SSPRL和I2SSPRH)的设置,会不会改变BLCK的时钟频率?

我以44.1KHz的采样率、16位通道宽度、16位数据、双通道做测试程序时,BLCK的时钟频率达到了5.6MHz左右,这正常吗?
无标题.png

以下是程序代码:

  1. /*---------------------------------------------------------------------*/
  2. /* --- Web: www.STCAI.com ---------------------------------------------*/
  3. /*---------------------------------------------------------------------*/
  4. /*************  功能说明    **************
  5. 本例程基于AI8051U为主控芯片的实验箱进行编写测试.
  6. 使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。
  7. edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。
  8. 测试工作频率为 45.1584MHz
  9. ******************************************/
  10. #include "../../comm/AI8051U.h"
  11. #include "stdio.h"
  12. #include "intrins.h"
  13. #include "TLV320AIC23.H"
  14. #define     FOSC            45158400UL      // 定义主时钟
  15. #define     SampleRate      44100           // 定义采样率
  16. #define     MCKOE           1               // I2S 主时钟输出控制 , 0:禁止 I2S 主时钟输出, 1:允许 I2S 主时钟输出
  17. #define     I2SEN           0x04            // I2S 模块使能    0x00:禁止, 0x04:允许
  18. //0:从机发送模式
  19. //1:从机接收模式
  20. //2:主机发送模式
  21. //3:主机接收模式,
  22. #define     I2S_MODE        2               // I2S 模式
  23. //0:短帧同步
  24. //1:长帧同步
  25. #define PCMSYNC 0 //PCM 帧同步
  26. //0: I2S 飞利浦标准
  27. //1: MSB 左对齐标准
  28. //2:LSB 右对齐标准
  29. //3:PCM 标准
  30. //#define STD_MODE     1    //I2S 标准选择
  31. #define STD_MODE       0    //    飞利浦标准
  32. //#define STD_MODE     2    //    右对齐标准
  33. //#define STD_MODE     3    //    PCM 标准
  34. //0:时钟稳定状态为低电平
  35. //1:时钟稳定状态为高电平
  36. #define CKPOL 0 //I2S 稳态时钟极性
  37. //0:16 位
  38. //1:24 位
  39. //2:32 位
  40. //3:保留
  41. #define DATLEN 0 //数据长度
  42. //0:16 位
  43. //1: 32 位
  44. #define CHLEN 0 //通道长度(每个音频通道的位数)
  45. #if (MCKOE == 1) //允许主时钟输出
  46.     #define I2SDIV FOSC/(16*2*8*SampleRate) //对于双声道允许主时钟输出 16bit 256fs
  47.     //则 2*DIV + ODD = I2S 时钟 / 256fs
  48.     //必要需要 DIV >= 2, 即分频系数 >=4.
  49. #endif
  50. #if (MCKOE == 0) //禁止主时钟输出
  51.     #define I2SDIV FOSC/(16*2*SampleRate) //对于双声道禁止主时钟输出 16bit
  52.     //则 2*DIV + ODD = I2S 时钟 / 32fs
  53.     //必要需要 DIV >= 2, 即分频系数 >=4.
  54. #endif
  55. u8 dac_index; //输出计数索引
  56. bit B_rise;
  57. void  delay_ms(u16 ms) {
  58.      u16 i;
  59.      do {
  60.           i = FOSC / 6000;
  61.           while(--i);
  62.      }while(--ms);
  63. }
  64. void main(void) {
  65.     EAXFR = 1; //允许访问扩展的特殊寄存器,XFR
  66.     //(32 位模式请使用这句,注释下一句)
  67.     // P_SW2 |= 0x80; //允许访问扩展的特殊寄存器,XFR
  68.     //(8 位模式请使用这句,注释上一句)
  69.    
  70.     WTST = 0; // 设置取程序代码等待时间, 赋值为 0 表示不等待,程序以最快速度运行
  71.    
  72.     CKCON = 0; // 设置访问片内的 xdata 速度,赋值为 0 表示用最快速度访问,不增加额外的等待时间
  73.    
  74.     P0M0 = 0x00; P0M1 = 0x00;
  75.     P1M0 = 0x00; P1M1 = 0x00;
  76.     P2M0 = 0x00; P2M1 = 0x00;
  77.     P3M0 = 0x00; P3M1 = 0x00;
  78.     P4M0 = 0x00; P4M1 = 0x00;
  79.     P5M0 = 0x00; P5M1 = 0x00;
  80.    
  81.    
  82.     AIC23_Init();
  83.     AIC32_InitSet();
  84.    
  85.     I2SMD = 0xff;   //内部保留字节,需设置为 FFH
  86.     I2SCR = 0x80;   //使能发送缓冲区空中断(0x80),摩托罗拉格式
  87.    
  88.     // 设置 I2S 主时钟输出(I2SMCK), 设置 ODD
  89.     I2SPRH = (MCKOE << 1) + (I2SDIV & 1);
  90.    
  91.     I2SPRL = I2SDIV/2; //设置 I2S 时钟分频
  92.     I2SCFGH = I2S_MODE; //设置 I2S 模式为主机发送模式
  93.     I2SCFGL = (PCMSYNC << 7) + (STD_MODE << 4) + (CKPOL << 3) + (DATLEN << 1) + CHLEN;
  94.    
  95.    
  96.     //0: P3.2(BCLK) P3.4(SD) P5.4(MCLK) P3.5(WS)
  97.     //1: P1.5(BCLK) P1.3(SD) P1.6(MCLK) P5.4(WS)
  98.     //2: P2.5(BCLK) P2.3(SD) P5.4(MCLK) P2.2(WS)
  99.     //3: P4.3(BCLK) P4.0(SD) P1.6(MCLK) P5.4(WS)
  100.     //P_SW3 = (P_SW3 & 0x3f) | (0<<6); //I2S 端口切换
  101.     P_SW3 = (P_SW3 & 0x3f) | (0<<6);
  102.    
  103.     I2SCFGH |= I2SEN; // 使能 I2S 模块
  104.    
  105.     // 开中断
  106.     EA = 1;
  107.    
  108.     dac_index = 0;
  109.     B_rise = 1;
  110.    
  111.     while (1) {
  112.     }
  113. }
  114. // I2S发送完成中断
  115. void I2S_ISR(void) interrupt 62  {
  116.     u8 i;
  117.     // 发送缓冲区空
  118.     if (I2SSR & 0x02) {
  119.         
  120.         // 哪个通道的发送通道的数据为空
  121.         if (I2SSR & 0x04)  {
  122.             // 右声道发送完成,准备左通道的
  123.             i = dac_index;
  124.             I2SDRL = i; //发送下一帧音频数据
  125.             I2SDRH = 0;
  126.             
  127.         } else {
  128.             // 左声道发送完成,准备右通道的
  129.             i = dac_index;
  130.             I2SDRL = i^255; //发送下一帧音频数据
  131.             I2SDRH = 0;
  132.             
  133.             dac_index++;
  134.         }
  135.     }
  136. }
复制代码
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:591
  • 最近打卡:2025-08-23 22:30:56

18

主题

15

回帖

134

积分

注册会员

积分
134
发表于 2025-5-14 11:49:28 | 显示全部楼层
定义I2SDIV, 设置I2SPRH和I2SPRL,对BLCK有影响吗?
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:591
  • 最近打卡:2025-08-23 22:30:56

18

主题

15

回帖

134

积分

注册会员

积分
134
发表于 2025-5-14 11:52:35 | 显示全部楼层
按照公式计算,I2S 比特率=每个通道的比特数×通道数×音频采样频率(FS)
BLCK = 16 * 2 * 44.1KHz = 1.4112MHz

I2S的BLSK时钟不应该是1.4MHz左右吗?现在是5.6MHz左右,这是什么原因?
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:161
  • 最近打卡:2025-08-23 08:11:44

775

主题

1万

回帖

1万

积分

管理员

积分
18735
发表于 2025-5-14 11:53:57 | 显示全部楼层
I2SMCLK,  I2S 主时钟
I2SBCK,    I2S 位时钟
I2SLRCK,  I2S左右声道时钟
I2SData,   I2S音频数据





截图202505141153523719.jpg

截图202505141153146067.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:591
  • 最近打卡:2025-08-23 22:30:56

18

主题

15

回帖

134

积分

注册会员

积分
134
发表于 2025-5-14 11:58:13 | 显示全部楼层
神*** 发表于 2025-5-14 11:53
I2SMCLK,  I2S 主时钟

I2SBCK,    I2S 位时钟

代码注释有点问题,我实际测试用逻辑仪测试的是P3.2、P3.3、P3.4、P3.5的信号

无标题.png

现在是BLCK的频率太高了,与公式不符
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:591
  • 最近打卡:2025-08-23 22:30:56

18

主题

15

回帖

134

积分

注册会员

积分
134
发表于 2025-5-14 12:16:26 | 显示全部楼层
采样率48KHz,通道设置为32位时,BLCK是正常的,3.1MHz左右。
32Bit.png

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:591
  • 最近打卡:2025-08-23 22:30:56

18

主题

15

回帖

134

积分

注册会员

积分
134
发表于 2025-5-14 12:21:40 | 显示全部楼层
采样率48KHz,通道设置为16位时,BLCK是依旧是3.1MHz左右,也不正常。不应该是2*16*48KHz=1.536MHz吗?


16Bit.png

点评

绿色LRCK一个周期近似10us,1s/10us=100K,这应该是96K的采样率,并非48K [attachimg]98630[/attachimg]  详情 回复 发表于 2025-5-14 18:13
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:591
  • 最近打卡:2025-08-23 22:30:56

18

主题

15

回帖

134

积分

注册会员

积分
134
发表于 2025-5-14 12:33:03 | 显示全部楼层
实际测试结果,44.1KHz采样率下,通道16位、32位,BLCK都与理论数据不一致。48KHz采样率通道16位下,BLCK是3.1MHz,与通道32位一样,没变。
目前只是测试了这两个采样率的执行情况。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:537
  • 最近打卡:2025-08-24 01:00:11
已绑定手机

86

主题

5979

回帖

1万

积分

超级版主

积分
10832
发表于 2025-5-14 17:33:04 | 显示全部楼层
https://www.stcaimcu.com/thread-6290-1-1.html
I2S允许收发长度不等,1bit的offset就是用于同步的
对于这种标准I2S格式的信号无论有多少位有效数据,数据的最高位总是出现在WCLK/LRCK变化(也就是一帧开始)后的第2个BCLK/SCLK脉冲处。
这就使得接收端与发送端的有效位数可以不同。如果接收端能处理的有效位数少于发送端,可以放弃数据帧中多余的低位数据;如果接收端能处理的有效位数多于发送端,可以自行补足剩余的位。
这种同步机制使得数字音频设备的互连更加方便,而且不会造成数据错位。

截图202505141722256321.jpg
上图的采样率是88.2K,不是44.1K


回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:537
  • 最近打卡:2025-08-24 01:00:11
已绑定手机

86

主题

5979

回帖

1万

积分

超级版主

积分
10832
发表于 2025-5-14 18:13:22 | 显示全部楼层
sunca*** 发表于 2025-5-14 12:21
采样率48KHz,通道设置为16位时,BLCK是依旧是3.1MHz左右,也不正常。不应该是2*16*48KHz=1.536MHz吗?


绿色LRCK一个周期近似10us,1s/10us=100K,这应该是96K的采样率,并非48K
你所有截图的LRCK都是图文不符
截图202505141811439491.jpg

回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤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.

快速回复 返回顶部 返回列表