STM32H743VIT6使用STM32CubeMX通过I2S驱动WM8978(2)

接前一篇文章:STM32H743VIT6使用STM32CubeMX通过I2S驱动WM8978(1)

本文参考以下文章及视频:

STM32CbueIDE Audio播放音频 WM8978 + I2S_stm32 cube配置i2s录音和播放-CSDN博客

STM32第二十二课(I2S,HAL,cubemx)_i2s cubemax-CSDN博客

STM32:I2S驱动WM8978_stm32 iis输出-CSDN博客

STM32:利用VM8978和I2S实现录音的频率分析-CSDN博客

第35讲-I2S 6(配套例程讲解)_哔哩哔哩_bilibili

第83讲 音乐播放器实验讲解_哔哩哔哩_bilibili

特此致谢!

上一回开始讲解WM8978的第一个函数即初始化函数wm8978_init。讲了WM8978的复位函数,也就是对于寄存器0的配置操作,本文接下来讲解对于其它寄存器的配置。

为了便于理解和回顾,再次贴出正点原子和野火的代码,分别如下:

  • 正点原子代码
//WM8978初始化
//返回值:0,初始化正常
//     其它,错误代码
u8 WM8978_Init(void)
{u8 res;IIC_Init(); //初始化I2C接口res = WM8978_Write_Reg(0, 0); //软复位WM8978if(res) //发送指令失败,WM8978异常return 1;//以下为通用设置WM8978_Write_Reg(1, 0x01B); //R1,MICEN设置为1(MIC使能),BIASEN设置为1(模拟器工作),VMIDSEL[1:0]设置为11(5K)WM8978_Write_Reg(2, 0x1B0); //R2,ROUT1、LOUT1输出使能(耳机可以工作),BOOSTENR、BOOSTENL使能WM8978_Write_Reg(3, 0x06C);	//R3,LOUT2、ROUT2输出使能(喇叭工作),RMIX、LMIX使能WM8978_Write_Reg(6, 0);	//R6,MCLK由外部提供WM8978_Write_Reg(43, 1<<4);	//R43,INVROUT2反向,驱动喇叭WM8978_Write_Reg(47, 1<<8);	//R47,PGABOOSTL,左通道MIC获得20倍增益WM8978_Write_Reg(48, 1<<8);	//R48,PGABOOSTR,右通道MIC获得20倍增益WM8978_Write_Reg(49, 1<<1);	//R49,TSDEN,开启过热保护WM8978_Write_Reg(49, 1<<2);	//R49,SPEAKER BOOST,1.5xWM8978_Write_Reg(10, 1<<3);	//R10,SOFTMUTE关闭,128x采样,最佳SNR(信噪比)WM8978_Write_Reg(14, 1<<3);	//R14,ADC 128x采样率return 0;
}
  • 野火代码
/*** @brief  配置I2C GPIO,并检查I2C总线上的WM8978是否正常* @param  无* @retval 1,初始化成功*         0,初始化失败*/
uint8_t wm8978_Init(void)
{uint8_t res;I2cMaster_Init(); //初始化I2C接口res = wm8978_Reset(); //硬件复位WM8978所有寄存器到缺省状态wm8978_CtrlGPIO1(1); //控制WM8978的一个GPIO接口,控制其为放音状态return res;
}
/*** @brief  复位wm8978* @param  无* @retval 1:复位成功* 		0:复位失败*/
uint8_t wm8978_Reset(void)
{//wm8978寄存器缺省值const uint16_t reg_default[] = {0x000, 0x000, 0x000, 0x000, 0x050, 0x000, 0x140, 0x000,0x000, 0x000, 0x000, 0x0FF, 0x0FF, 0x000, 0x100, 0x0FF,0x0FF, 0x000, 0x12C, 0x02C, 0x02C, 0x02C, 0x02C, 0x000,0x032, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,0x038, 0x00B, 0x032, 0x000, 0x008, 0x00C, 0x093, 0x0E9,0x000, 0x000, 0x000, 0x000, 0x003, 0x010, 0x010, 0x100,0x100, 0x002, 0x001, 0x001, 0x039, 0x039, 0x039, 0x039,0x001, 0x001};uint8_t res;uint8_t i;res = wm8978_WriteReg(0x00, 0);for (i = 0; i < sizeof(reg_default) / 2; i++)wm8978_RegCash[i] = reg_default[i];return res;
}
//WM8978寄存器缓存
//由于WM8978的I2C两线接口不支持读取操作,因此寄存器值缓存在内存中
//当写寄存器同步更新缓存,读寄存器时直接返回缓存中的值
static uint16_t wm8978_RegCash[] = {0x000, 0x000, 0x000, 0x000, 0x050, 0x000, 0x140, 0x000,0x000, 0x000, 0x000, 0x0FF, 0x0FF, 0x000, 0x100, 0x0FF,0x0FF, 0x000, 0x12C, 0x02C, 0x02C, 0x02C, 0x02C, 0x000,0x032, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,0x038, 0x00B, 0x032, 0x000, 0x008, 0x00C, 0x093, 0x0E9,0x000, 0x000, 0x000, 0x000, 0x003, 0x010, 0x010, 0x100,0x100, 0x002, 0x001, 0x001, 0x039, 0x039, 0x039, 0x039,0x001, 0x001
};

寄存器1

  • 正点原子代码
    WM8978_Write_Reg(1, 0x01B); //R1,MICEN设置为1(MIC使能),BIASEN设置为1(模拟器工作),VMIDSEL[1:0]设置为11(5K)
  • 野火代码
void wm8978_CfgAudioPath(uint16_t _InPath, uint16_t _OutPath)
{uint16_t usReg;//查看WM8978数据手册的 REGISTER MAP 章节,第89页if ((_InPath == IN_PATH_OFF) && (_OutPath == OUT_PATH_OFF)){wm8978_PowerDown();return;}//第1步:根据输入通道参数配置寄存器////	R1 寄存器 Power manage 1//	Bit8    BUFDCOPEN,Output stage 1.5xAVDD/2 driver enable//	Bit7    OUT4MIXEN,OUT4 mixer enable//	Bit6    OUT3MIXEN,OUT3 mixer enable//	Bit5    PLLEN,不用//	Bit4    MICBEN,Microphone Bias Enable (MIC偏置电路使能)//	Bit3    BIASEN,Analogue amplifier bias control必须设置为1,模拟放大器才工作//	Bit2    BUFIOEN,Unused input/output tie off buffer enable//	Bit1:0  VMIDSEL,必须设置为非00值,模拟放大器才工作//usReg = (1 << 3) | (3 << 0);if (_OutPath & OUT3_4_ON) //OUT3和OUT4使能输出GSM模块{usReg |= ((1 << 7) | (1 << 6));}if ((_InPath & MIC_LEFT_ON) || (_InPath & MIC_RIGHT_ON)){usReg |= (1 << 4);}wm8978_WriteReg(1, usReg); //写寄存器……
}

由正点原子和野火代码的对比可以看到,正点原子的代码简单直接,给出了注释,一目了然;而野火的代码则并不是单独的一句,而是放在了一个更大的函数中(此函数相当于正点原子代码的初始化函数中那许多行代码),这样的代码更优雅、也更正规,也更为全面,函数功能划分也更清楚。总的来说,这两家的代码各有所长。

关于寄存器1的说明,参见笔者文章:WM8978 —— 带扬声器驱动程序的立体声编解码器(4)-CSDN博客

寄存器1复位默认值为0x000(0b000000000)。

VMID和BIASEN的说明参见WM8978手册第79页,如下:

同时参见WM8978手册第34页,如下:

寄存器2

  • 正点原子代码
    WM8978_Write_Reg(2, 0x1B0); //R2,ROUT1、LOUT1输出使能(耳机可以工作),BOOSTENR、BOOSTENL使能
  • 野火代码
void wm8978_CfgAudioPath(uint16_t _InPath, uint16_t _OutPath)
{uint16_t usReg;//查看WM8978数据手册的 REGISTER MAP 章节,第89页if ((_InPath == IN_PATH_OFF) && (_OutPath == OUT_PATH_OFF)){wm8978_PowerDown();return;}//第1步:根据输入通道参数配置寄存器……////	R2 寄存器 Power manage 2//	Bit8	ROUT1EN,ROUT1 output enable 耳机右声道输出使能//	Bit7	LOUT1EN,LOUT1 output enable 耳机左声道输出使能//	Bit6	SLEEP,0 = Normal device operation   1 = Residual current reduced in device standby mode//	Bit5	BOOSTENR,Right channel Input BOOST enable 右通道输入自举电路使能//	Bit4	BOOSTENL,Left channel Input BOOST enable 左通道输入自举电路使能//	Bit3	INPGAENR,Right channel input PGA enable 右声道输入PGA使能//	Bit2	INPGAENL,Left channel input PGA enable 左声道输入PGA使能//	Bit1	ADCENR,Enable ADC right channel//	Bit0	ADCENL,Enable ADC left channel//usReg = 0;if (_OutPath & EAR_LEFT_ON){usReg |= (1 << 7);}if (_OutPath & EAR_RIGHT_ON){usReg |= (1 << 8);}if (_InPath & MIC_LEFT_ON){usReg |= ((1 << 4) | (1 << 2));}if (_InPath & MIC_RIGHT_ON){usReg |= ((1 << 5) | (1 << 3));}if (_InPath & LINE_ON){usReg |= ((1 << 4) | (1 << 5));}if (_InPath & MIC_RIGHT_ON){usReg |= ((1 << 5) | (1 << 3));}if (_InPath & ADC_ON){usReg |= ((1 << 1) | (1 << 0));}wm8978_WriteReg(2, usReg); //写寄存器……
}

这里不再对正点原子和野火两家代码进行比较(上边已经说得比较清楚了),而重点说明具体的配置实现的功能。

关于寄存器2的说明,参见笔者文章:WM8978 —— 带扬声器驱动程序的立体声编解码器(4)-CSDN博客

寄存器2复位默认值为0x000(0b000000000)。 

  • ROUT1EN和LOUT1EN

参见WM8978手册第63页,如下:

同时参见WM8978手册第52页,如下:

  • SLEEP

参见WM8978手册第63页,如下:

  • BOOSTENR和BOOSTENL

参见WM8978手册第33页,如下:

同时参见WM8978手册第32页,如下:

  • INPPGAENR和INPPGAENL

参见WM8978手册第28页,如下:

同时参见WM8978手册第27页,如下:

  • ADCENR和ADCENL

参见WM8978手册第35页,如下:

同时参见WM8978手册第35页,如下:

更多寄存器配置的详细说明与讲解请看下回。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/812215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CLIP大模型图文检索——原理解读及代码实现

一. 核心思想 通过自然语言处理获得的监督信号可用于训练迁移效果出色的视觉模型。本论文的作者团队构建了一个庞大的图像文本配对数据集&#xff0c;其中包含400 million个图片文本的配对。利用最大规模的ViT-large模型&#xff0c;他们提出了CLIP&#xff08;Contrastive La…

机器学习和深度学习 -- 李宏毅(笔记与个人理解)Day 13

Day13 Error surface is rugged…… Tips for training :Adaptive Learning Rate critical point is not the difficult Root mean Square --used in Adagrad 这里为啥是前面的g的和而不是直接只除以当前呢? 这种方法的目的是防止学习率在训练过程中快速衰减。如果只用当前的…

自然语言处理NLP关键知识点

大家好&#xff0c;在人工智能出现之前&#xff0c;机器智能处理结构化的数据&#xff0c;例如 Excel 里的数据。但是网络中大部分的数据都是非结构化的&#xff0c;例如文章、图片、音频、视频等。在非结构数据中&#xff0c;文本的数量是最多的&#xff0c;他虽然没有图片和视…

信息系统项目管理师——第27章管理科学基础知识

1 最大流量问题[简单] 百度百科:最大流问题&#xff0c;一种组合最优化问题&#xff0c;就是要讨论如何充分利用装置的能力&#xff0c;使得运输的流量最大&#xff0c;以取得最好的效果。 教材P869:在起点和终点之间可能存在多条运输路径&#xff0c;总的最大流量就是求出各…

智能EDM邮件营销推广工具哪个好?

有效且精准的客户沟通已经成为企业成功的关键要素之一&#xff0c;云衔科技以其尖端的智能EDM邮件营销系统解决方案脱颖而出&#xff0c;为全球各行业的企业提供了一个强有力的竞争优势和业绩增长引擎。 云衔科技深谙市场营销的艺术与科学&#xff0c;凭借多年积累的专业技术研…

SPI 机制

一、简述 本文介绍 SPI 机制。 二、什么是 SPI 机制 SPI&#xff08;Service Provider Interface&#xff09;机制是 Java 编程语言中的一种机制&#xff0c;用于实现组件之间的解耦和扩展。SPI 允许开发者编写服务接口&#xff08;Service Interface&#xff09;&#xff0…

计算机网络 路由器基本配置

一、实验内容 1、按照下表配置好PC机IP地址和路由器端口IP地址 2、配置好路由器特权密文密码“abcd&#xff0b;两位班内序号”和远程登录密码“star” 3、验证测试 a.验证各个接口的IP地址是否正确配置和开启 b.PC1 和 PC2 互ping c.验证PC1通过远程登陆到路由器上&#…

目前深圳嵌入式单片机就业环境如何?

深圳作为中国的科技创新中心之一&#xff0c;嵌入式行业的就业环境相对较好。我这里有一套嵌入式入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习嵌入式&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&#xff0c;我在…

docker 上达梦导入dump文件报错:本地编码:PG GBK,导入女件编码:PGGB18030

解决方案&#xff1a; 第一步进入达梦数据容器内部 docker exec -it fc316f88caff /bin/bash 第二步&#xff1a;在容器中 /opt/dmdbms/bin目录下 执行命令 cd /opt/dmdbms/bin./dimp USERIDSYSDBA/SYSDBA001 FILE/opt/dmdbms/ZFJG_LJ20240407.dmp SCHEMASZFJG_LJUSERIDSYSD…

linux安装

1、解压vm ware压缩包 2双击安装 3点击自定义硬件 4双击cd/dvd,给虚拟光驱里放虚拟光盘 5记得启动时链接勾上&#xff0c;勾上起点系统时 虚拟光驱才会一起启动 6点击确认即可&#xff01; 开机 选择第一个 7进入图形化安装界面 8设置时区 9选择硬盘 10网络配置 开启以太网&am…

C语言进阶课程学习记录-数组指针和指针数组分析

C语言进阶课程学习记录-数组指针和指针数组分析 实验-数组指针的大小实验-指针数组小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录 实验-数组指针的大小 #include <stdio.h>typedef int(AINT…

【MoS2】应变增强的单层MoS2光电探测器

这篇文章的标题是《Strain-Enhanced Large-Area Monolayer MoS2 Photodetectors》&#xff0c;作者是Borna Radatovic等人&#xff0c;发表在《ACS Applied Materials & Interfaces》期刊的2024年第16卷。文章主要研究了应变增强的大面积单层MoS2光电探测器的性能和应用潜力…

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题1

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题1 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 任务书&#xff0c;赛题&#xff0c;解析等资料&#xff0c;知识点培训服务 添加博主wx&#xff1a;liuliu548…

Testng测试框架(3)-数据驱动TestNG@DataProvider

TestNG 是一个强大的 Java 测试框架&#xff0c;它提供了许多高级功能&#xff0c;如参数化测试、依赖注入、分组等。其中&#xff0c;DataProvider 是 TestNG 中一个非常有用的注解&#xff0c;用于为测试方法提供数据。 DataProvider 的作用 使用 DataProvider 注解的方法可…

java数据结构与算法刷题-----LeetCode260. 只出现一次的数字 III

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 与运算取末尾1分组 与运算取末尾1分组 解题思路&#xff1a;时间…

文献速递:深度学习肝脏肿瘤诊断---基于多相增强 CT 和临床数据的恶性肝肿瘤鉴别诊断深度学习

Title 题目 Deep learning for diferential diagnosisof malignant hepatic tumors based on multi-phase contrast-enhanced CT and clinical data 基于多相增强 CT 和临床数据的恶性肝肿瘤鉴别诊断深度学习 Abstract 摘要 Liver cancer remains the leading cause of can…

计算机网络——TCP和UDP协议

目录 前言 前篇 引言 TCP与UDP之间的区别 TCP 三次握手 为什么要三次握手而不是两次握手&#xff1f; 丢包问题与乱序问题的解决 四次挥手 为什么客户端需要等待超时时间&#xff1f; UDP协议 TCP和UDP的主要区别 前言 本博客是博主用于复习计算机网络的博客&…

软件开发安全备受重视,浙江某运营商引入CWASP认证课程,

​浙江省某大型运营商是一家实力雄厚、服务优质的通信运营商&#xff0c;致力于为全省用户提供优质、高效的通信服务。数字时代&#xff0c;该运营商顺应信息能量融合发展趋势&#xff0c;系统打造以5G、算力网络、能力中台为重点的新型信息基础设施&#xff0c;夯实产业转型升…

Redis入门到通关之五大基本数据类型及其使用场景

文章目录 一 什么是NoSQL&#xff1f;二 Redis是什么&#xff1f;三 Redis五大基本类型1 String&#xff08;字符串&#xff09;应用场景 2 List&#xff08;列表&#xff09;应用场景 3 Set&#xff08;集合&#xff09;4 sorted set&#xff08;有序集合&#xff09;应用场景…

代码随想录阅读笔记-回溯【组合总和II】

题目 给定一个数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 说明&#xff1a; 所有数字&#xff08;包括目标数&#xff09;都是正整数。解集不能包含重复的组…