喝酒前喝什么不容易醉| 昙花什么时间开花| 脑供血不足做什么检查能查出来| 结核有什么症状| 山川载不动太多悲哀是什么歌| 板栗什么时候成熟| 什么星座最好| 摇篮是什么意思| 荆芥是什么菜| 腰背疼痛挂什么科| hdr模式是什么意思| 病毒性发烧吃什么药| 心脏传导阻滞吃什么药| 1953年属什么| 8月26日什么星座| 肝病吃什么药| 三sprit是什么牌子| lfc是什么意思| 洋葱什么时候种| 白玫瑰的花语是什么| 决断是什么意思| 什么是水象星座| 相位是什么| 吃什么回奶| 单纯疱疹吃什么药| 什么是polo衫| 鱼喜欢吃什么| 为什么大便拉不出来| 马首是瞻是什么生肖| 支原体是什么病| 白带黄色是什么原因| 喜闻乐见什么意思| abcd是什么意思| 五行土克什么| 李叔同为什么出家| 芒果可以做什么美食| 红色爱心是什么牌子| 顿服是什么意思| 五花八门什么意思| 骗婚是什么意思| 晴空万里什么意思| 牙龈肿痛吃什么| 智齿肿痛吃什么药| 揶揄什么意思| 早些泄挂什么科| 动态密码是什么| 毛泽东什么时候逝世| 网球肘用什么药| 官方什么意思| bitch是什么意思| 人流后吃什么恢复快| 孕中期失眠是什么原因| 艾叶泡脚有什么好处| diff是什么意思| 小肚子疼是什么原因引起的| 龙抬头是什么意思| 马蹄南去人北望是什么歌| 脚气泡脚用什么泡最好| 入珠是什么| 人中深的女人代表什么| 22年什么婚| 血糖高吃什么食物最好最佳| 生物冰袋里面是什么| 花代表什么数字| 精油有什么作用| 看灰指甲去医院挂什么科| 什么水果利尿效果最好| 动脉硬化是什么症状| 生气对身体有什么危害| 尿囊素是什么| 为什么感冒药吃了想睡觉| 牙疼吃什么药消炎最快| 梦见活人死了是什么意思| messi是什么意思| 无名指麻木是什么原因| 枭雄的意思是什么| 什么是有氧运动什么是无氧运动| 一个既一个旦念什么| 十年粤语版叫什么名字| 睾丸潮湿是什么原因| 一带一路指的是什么| 怀孕吃叶酸片有什么用| 地壳是什么| 脑梗是什么引起的| 脂肪肝吃什么| 亚甲减是什么意思| zoom什么意思| 梦见丧尸是什么预兆| 说话鼻音重是什么原因| 颈椎不舒服挂什么科| 今年是农历的什么年| 肝是起什么作用的| 阿尔茨海默症吃什么药| 4月17日是什么星座| 吃什么长内膜最快最有效| 米线是用什么做的| 人肉搜索是什么| 怀孕白细胞高是什么原因| 医院医务科是干什么的| 褪黑素是什么| 睾丸皮痒用什么药膏| 西洋参可以和什么一起泡水喝| 血管病变是什么意思| 135是什么意思| 兔子跟什么生肖最配对| 出痧的颜色代表什么| 蚂蚱吃什么食物| lof是什么意思| 为什么气血不足| 囊肿是什么原因引起的| ;是什么号| 粉色裤子配什么上衣| 四川耙耳朵是什么意思| 南京五行属什么| 脸黑的人适合穿什么颜色的衣服| 吃羊肉不能吃什么水果| 跪安是什么意思| 膝盖有积液是什么症状| 什么叫自慰| 汕头有什么好玩的地方| 偏头疼是什么原因| 什么样的大便是正常的| 鱼喜欢什么颜色| 不排便是什么原因| 男命正官代表什么| 左小腿麻木是什么原因| 血糖高什么不能吃| 阳绿翡翠属于什么级别| 合肥有什么玩的| 肝胆相照是什么意思| 轻微脑震荡吃什么药| 葛根是什么东西| 死皮是什么| 为什么趴着睡觉会胀气然后打嗝| 有腿毛的男人说明什么| 眼干是什么原因引起的| 不怕流氓什么就怕流氓有文化| 甲钴胺片是治什么病| 庚辰五行属什么| 什么解酒| 上海古代叫什么| 作精是什么意思| 喉咙发炎吃什么药好得快| 泌尿科主要看什么病| 老汉推车是什么意思| 那悲歌总会在梦中惊醒是什么歌| 副脾是什么意思| 眼睛干涩痒是什么原因| 胎盘宫底后壁是什么意思| 血热吃什么药快速见效| 长痘痘涂什么药膏| 经常嗳气是什么原因| 安全套是什么| 自负是什么意思| 为什么有钱人不去植发| 智叟是什么意思| 梦见大狼狗是什么意思| 轻度脑萎缩是什么意思| qq邮箱的格式是什么| 双下肢水肿是什么原因| 普拉提是什么运动| 高胆固醇血症是什么病| 日成是什么字| rm是什么位置| 痛风病人不能吃什么| 不伤肝的他汀类药是什么| 十一点半是什么时辰| 为什么突然长痣| gbs筛查是什么| 前羽念什么| 纠察是什么意思| 隼读什么| palladium是什么牌子| 胰岛素抵抗有什么症状| 头顶痛吃什么药效果好| 酸菜炒什么好吃| 真丝香云纱是什么面料| 筷子掉地上是什么征兆| 什么茶对胃好| 心有戚戚焉什么意思| 慢性肠炎吃什么药最好| 驴打滚是什么意思| 苏打水有什么作用| 5月14日是什么星座| 盖是什么意思| 细菌感染有什么症状表现| 舟可是什么字| 罗贯中和施耐庵是什么关系| 血糖高的人吃什么水果好| 连坐是什么意思| ccc是什么意思| hpm是什么意思| 木驴是什么| 太妹是什么意思| 经常打屁是什么原因| 木命人五行缺什么| 户籍地址是什么意思| 想吃甜食是身体缺什么| 什么妖魔鬼怪什么美女画皮| 扁食是什么| 月黑见渔灯的见读什么| 左心室高电压什么意思| 乾隆和康熙是什么关系| 耳刀旁加步念什么| 西药是什么药| 阳虚和阴虚有什么区别| 桔子树用什么肥料最好| 白眼球有红血丝是什么原因| 梅毒是什么| 什么荔枝最贵| 哈密瓜为什么叫哈密瓜| 什么是穿刺手术| 因地制宜是什么意思| 活血化瘀是什么意思| 什么颜色最显白| 吃什么药不能献血| 喜鹊吃什么| 猪宝是什么东西| 死心是什么意思| boby是什么意思| 扁桃体发炎吃什么水果| 达泊西汀有什么副作用| 生抽和老抽有什么区别| 黑茶金花是什么菌| 感冒发烧吃什么好| 胃胀吃什么药效果最好| 生化有什么症状和反应| 吃饭出虚汗是什么原因| 什么样的肚子疼是癌| 什么暗什么明| 牙发黑是什么原因怎么办| 阴部痒痒的是什么原因| 蛇盘疮什么原因引起的| 口疮是什么原因引起的| 水囊是什么| 糖料病者应吃什么好| 不见棺材不落泪是什么生肖| 讨扰是什么意思| 胸口疼痛挂什么科| 肺活量不足是什么症状| 茯苓和土茯苓有什么区别| 超声是什么检查| 排卵期什么时候开始| 治疗神经痛用什么药最有效| 穿刺是什么意思| 一什么树干| 广西有什么水果| 支付宝余额和余额宝有什么区别| 芯字五行属什么| 冤亲债主是什么意思| 炎症是什么意思| 遗传物质的载体是什么| 远字五行属什么| 什么叫杵状指| 金牛男喜欢什么样的女生| 九三年属鸡是什么命| 脚痛什么原因引起的| 七月六号是什么日子| 口腔溃疡用什么药最好| 德巴金是什么药| 与虎谋皮是什么生肖| 取其轻前一句是什么| 纤维灶是什么意思| 芦笋是什么植物| 百度
这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 ? 论坛首页 ? 活动中心 ? 板卡试用 ? 【分享开发笔记,赚取电动螺丝刀】左对齐模式下I2S通讯的实践

共9条 1/1 1 跳转至

【分享开发笔记,赚取电动螺丝刀】左对齐模式下I2S通讯的实践

专家
2025-08-04 12:25:11   被打赏 22 分(兑奖)     打赏
百度 21岁时有过一段婚姻,1990年她嫁给年长30岁的会计师翁江培,婚后13日丈夫因急性心肌梗塞离世,伍咏薇惨变寡妇,更有人讽其克夫。

作为学习I2S通讯的第一个例子,使用STC的Ai8051U单片机,在生成三角波形例程的基础上进行改造,程序代码如下:



/*************  功能说明    **************
本例程基于AI8051U为主控芯片的实验箱进行编写测试.
使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。
edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。
测试工作频率为 45.1584MHz
******************************************/
#include "../../comm/AI8051U.h"
#include "stdio.h"
#include "intrins.h"
typedef unsigned charu8;
typedef unsigned intu16;
typedef unsigned longu32;
#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 标准选择
//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; //输出计数索引
// 延时处理,LED闪烁用
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;
    
    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)
    P_SW3 = (P_SW3 & 0x3f) | (0<<6); //I2S 端口切换
    
    I2SCFGH |= I2SEN; // 使能 I2S 模块
    
    // 开中断
    EA = 1;
    
    dac_index = 0;
    
    while (1) {
        // 闪烁P00所在LED,仅仅是为了证明程序已经工作 
        P00 = 0;//LED On
        delay_ms(500);
        P00 = 1;//LED Off
        delay_ms(500);
    }
}
// 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++;
        }
}
}

代码说明:

1、设置I2SCR

图片1.png

I2SCR = 0x80;   //使能发送缓冲区空中断(0x80)


TXEIE : B7 = 1,表示当发送缓冲区数据被发送完成后,会产生中断。在本例中,I2S外设是被当做主设备使用的,向外发送数据。


2、设置I2SPRH 和 I2SPRL 

图片2.png


#define     FOSC            45158400UL      // 定义主时钟
#define     SampleRate      44100           // 定义采样率44.1KHz
#define     MCKOE           1               // I2S 主时钟输出控制 , 0:禁止 I2S 主时钟输出, 1:允许 I2S 主时钟输出
#if (MCKOE == 1) //允许主时钟输出
    #define I2SDIV FOSC/(16*2*8*SampleRate) //对于双声道允许主时钟输出 16bit 256fs
//则 2*DIV + ODD = I2S 时钟 / 256fs , 需要 DIV >= 2, 即分频系数 >=4.
// 根据计算 I2SDIV=45158400/(16*2*8*44100)=4
#endif
// 设置 I2S 主时钟输出(I2SMCK), 设置 ODD=0,MCKOE=1
I2SPRH = (MCKOE << 1) + (I2SDIV & 1);    //                  =2
I2SPRL = I2SDIV/2;                    // 设置 I2S 时钟分频 =2 
当 I2S 主时钟输出使能时(MCKOE 设置为 1)、当信道帧宽度为 16 位时,音频采样频率 FS=I2S 时钟÷[(16×2)×(2×DIV+ODD)×8)]


3、设置I2SCFGH 和 I2SCFGL

 

图片3.png


#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 标准选择
//0:时钟稳定状态为低电平
//1:时钟稳定状态为高电平
#define CKPOL      0               //I2S 稳态时钟极性
//0:16 位
//1:24 位
//2:32 位
//3:保留
#define DATLEN      0             //数据长度
//0:16 位
//1: 32 位
#define CHLEN       0        //通道长度(每个音频通道的位数)
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)
P_SW3 = (P_SW3 & 0x3f) | (0<<6); //I2S 端口切换
I2SCFGH |= I2SEN; // 使能 I2S 模块


4、数据发送过程中,通道的判断处理

图片4.png

TXE :发送完成标志

CHSID : 0:左通道正在发送或接收数据;1:右通道正在发送或接收数据


程序中为了明显区别左右声道数据的不同,特意做了取反处理,运行起来后用逻辑分析仪测量到的波形:


从波形上看,左声道数据在前,右声道数据在后,数据为16位长度,高位在前,低位在后。

图片8.png

与左对齐模式 Left Justified Standard是一致的。

标准左对齐格式的数据的MSB没有相对于BCLK延迟一个时钟。左对齐格式的左右声道数据的MSB在LRCK边沿变化后BCLK的第一个上升沿有效。左对齐格式的优点在于,由于在LRCK变化后的第一个SCK上升沿就开始采样,它不需要关心左右声道数据的字长。

图片9.png

BLCK的时钟频率:

图片10.png

从波形上看,为5.56MHz的样子,根据公式《SCLK的频率=2×采样频率×采样位数》的计算结果看,出入比较大啊。


工程文件:

main.zip




高工
2025-08-04 12:42:55     打赏
2楼

你这时钟抖动太大了,是不是代码写的有漏洞?


专家
2025-08-04 19:08:10     打赏
3楼

感谢分享


专家
2025-08-04 19:09:31     打赏
4楼

感谢分享


工程师
2025-08-04 16:21:49     打赏
5楼

注意一下文章排版非常乱


院士
2025-08-04 23:47:26     打赏
6楼

王哥 那时钟不匹配有啥解决思路吗?


专家
2025-08-04 15:32:29     打赏
7楼

时钟匹配的问题还没有解决,打算以后再用别家的单片机试试和时钟有关的处理,作对比学习。

现在在学习在STC的实验盒上使用“TLV320AIC23”芯片输出波形。刚好也可以测试时钟能否配合TLV320AIC23的设置输出正常波形。


高工
2025-08-04 17:48:10     打赏
8楼

这个 I2S的时钟最大是多少呢?时钟频率可以稳定在5.56MHZ,实际使用的时候会不会太快?


专家
2025-08-04 15:32:15     打赏
9楼

思路很清晰,感谢分享。


共9条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]
补血最快的方法是什么 lch是什么病 系统b超主要检查什么 严重脱发是什么病先兆 反流性食管炎吃什么食物好
肚子里面跳动是什么原因 什么叫正盐 做糖耐前一天需要注意什么 双签是什么意思 狗为什么会咬人
doge是什么意思 什么是晶体 什么是螨虫 邓紫棋和华晨宇什么关系 正师级相当于地方什么级别
少许纤维灶是什么意思 怀孕了什么时候做检查 腰椎生理曲度变直是什么意思 爱吃甜食是什么原因 数不胜数的胜是什么意思
补办身份证需要带什么hcv9jop2ns8r.cn 什么是平年hcv8jop6ns3r.cn 落魄是什么意思onlinewuye.com 绿原酸是什么luyiluode.com 氨咖黄敏胶囊是什么药hcv9jop0ns7r.cn
松香有毒吗对人体有什么危害hcv8jop8ns3r.cn 四什么八什么的成语hcv8jop7ns8r.cn 补锌吃什么药hcv9jop4ns2r.cn 四次元是什么意思啊hcv9jop7ns0r.cn 什么水果解酒hcv8jop2ns8r.cn
中央电视台台长是什么级别inbungee.com 转网是什么意思hcv9jop5ns0r.cn 生蚝有什么营养价值hcv7jop6ns2r.cn 宝宝不吃奶是什么原因hcv8jop3ns1r.cn 埋线有什么好处和坏处hcv8jop1ns3r.cn
一片狼藉是什么意思hcv8jop1ns6r.cn 赡养是什么意思hcv8jop6ns2r.cn mrmrs是什么牌子hcv8jop5ns7r.cn 什么是挂科hcv8jop5ns8r.cn 牙齿一吸就出血是什么原因hcv7jop9ns4r.cn
百度