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

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

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

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中的寄存器1和寄存器2的配置操作,本文接着讲解对于其它寄存器的配置。

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

  • 正点原子代码
//WM8978初始化
//返回值:0,初始化正常
//     其它,错误代码
u8 WM8978_Init(void)
{
	u8 res;

	IIC_Init(); //初始化I2C接口

	res = WM8978_Write_Reg(0, 0); //软复位WM8978
	if(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.5x
	WM8978_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
};

寄存器3

  • 正点原子代码
    WM8978_Write_Reg(3, 0x06C);	//R3,LOUT2、ROUT2输出使能(喇叭工作),RMIX、LMIX使能
  • 野火代码
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步:根据输入通道参数配置寄存器
    ……
    //
	//	R3 寄存器 Power manage 3
	//	Bit8	OUT4EN,	OUT4 enable
	//	Bit7	OUT3EN,		OUT3 enable
	//	Bit6	LOUT2EN,	LOUT2 output enable
	//	Bit5	ROUT2EN,	ROUT2 output enable
	//	Bit4	0,
	//	Bit3	RMIXEN,		Right mixer enable
	//	Bit2	LMIXEN,		Left mixer enable
	//	Bit1	DACENR,		Right channel DAC enable
	//	Bit0	DACENL,		Left channel DAC enable
	//
	usReg = 0;
	if (_OutPath & OUT3_4_ON)
	{
		usReg |= ((1 << 8) | (1 << 7));
	}
	if (_OutPath & SPK_ON)
	{
		usReg |= ((1 << 6) | (1 << 5));
	}
	if (_OutPath != OUT_PATH_OFF)
	{
		usReg |= ((1 << 3) | (1 << 2));
	}
	if (_InPath & DAC_ON)
	{
		usReg |= ((1 << 1) | (1 << 0));
	}
	wm8978_WriteReg(3, usReg); //写寄存器

    ……
}

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

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

  • OUT4EN

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

同时参见WM8978手册第59~60页,如下:

  • OUT3EN

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

同时参见WM8978手册第59~60页,如下:

  • LOUT2EN和ROUT2EN

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

同时参见WM8978手册第49~50页,如下:

  • RMIXEN和LMIXEN

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

同时参见WM8978手册第49~50页,如下:

  • DACENR和DACENL

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

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

根据正点原子和野火的代码,实际使能了LOUT2、ROUT2(喇叭工作)和RMIX、LMIX。

结合前一篇文章,整体看一下WM8978的输出通路,参见WM8978手册的第61页:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue,table页签里的一列,点击时,会弹出时间线提示,高度自适应

需求&#xff1a;点击商品来源这一列 弹出一个时间线&#xff0c;查看商品的来源记录 <el-popover></el-popover> 弹出框组件 <el-timeline-item></el-timeline-item>时间线组件slot-scopescope slot是插槽&#xff0c;slot-scope“scope“语义更加明…

无惧烈日!看小米SU7的防晒杀手锏

小米SU7&#xff0c;为颜值设计&#xff0c;更为体验设计。 其中&#xff0c;女性车主占比近30%&#xff0c;算上给太太/女朋友、姐姐、妹妹等亲友买的&#xff0c;实际女车主预计占比是40%甚至50%。 为啥呢&#xff1f;因为小米SU7好看、防晒、收纳&#xff0c;丰富优雅。 小米…

全排列 和 排列 模板

3429. 全排列 - AcWing题库 #include<bits/stdc.h> using namespace std; string s; int n; vector<char> path; vector<vector<char>> res; bool check[10]; void dfs() {if(s.size()path.size()){res.push_back(path);return;}for(int i0;i<s.siz…

vue将html生成pdf并分页

jspdf html2canvas 此方案有很多的css兼容问题&#xff0c;比如虚线边框、svg、页数多了内容显示不全、部分浏览器兼容问题&#xff0c;光是解决这些问题就耗费了我不少岁月和精力 后面了解到新的技术方案&#xff1a; jspdf html-to-image npm install --save html-to-i…

Day:007(2) | Python爬虫:高效数据抓取的编程技术(scrapy框架使用)

Scrapy 数据的提取 Scrapy有自己的数据提取机制。它们被称为选择器。我们可以通过使用的选择器re、xpath、css提取数据 提示 不用再安装与引入Xpath,BS4 获得选择器 Response对象获取 正常使用 response.selector.xpath(//span/text()).get() response.selector.css(span::…

架构设计-权限系统之权限系统设计方案

前言 权限管理是所有后台系统的都会涉及的一个重要组成部分&#xff0c;主要目的是对不同的人访问资源进行权限的控制&#xff0c;避免因权限控制缺失或操作不当引发的风险问题&#xff0c;如操作错误&#xff0c;隐私数据泄露等问题。 目前在公司负责权限这块&#xff0c;所…

blender安装mmd并导入pmx,pmd文件

点击链接GitHub上下载这个&#xff0c;值得注意的是blender4.0以上版本暂时不支持&#xff0c;这里使用的是blender3.6版本GitHub - powroupi/blender_mmd_tools: mmd_tools is a blender addon for importing Models and Motions of MikuMikuDance. 复制当前内容 粘贴到当前…

对LSTM的通俗易懂理解--可变权重

RNN的问题&#xff1a;长期依赖&#xff0c;即对短期的数据敏感&#xff0c;对比较远的长期数据不敏感&#xff0c;这是因为RNN隐藏状态权重在不同时刻是共享相同的&#xff0c;随着时间步的增加&#xff0c;梯度会指数级地衰减或者增长&#xff0c;导致梯度消失或者爆炸&#…

040—pandas 实现RFM用户分层

使用步骤 读入数据 代码如下&#xff08;示例&#xff09;&#xff1a; # RFM 是典型的用户分层方法&#xff0c; 是评估用户消费能力、 衡量用户贡献价值的重要工具。 # RFM 代表的是最近一次消费时间间隔&#xff08;Recency&#xff09;、消费频率&#xff08;Frequency&…

qutip,一个高级的 Python 量子力学研究库!

目录 前言 安装 特性 基本功能 量子态的创建和操作 量子态的测量 示例代码 动力学模拟 高级功能 退相干和噪声模拟 控制和优化 量子信息学工具 实际应用场景 量子态演化研究 量子计算机模拟 量子纠错协议 总结 前言 大家好&#xff0c;今天为大家分享一个高级的 Pytho…

蓝桥杯-STL-string

目录 字符串定义 字符串初始化 字符串输入输出 字符串输出 字符串输入 字符串访问 字符串拷贝 字符串拼接 直接相加 append(const char*str,int n) 字符串比较 ​编辑字符串长度length()/size() 字符串查找find(string str) 查找子串substr(int a,int b) 字符串的…

家居网购项目(三)

文章目录 1.后台管理—添加家居1.需求分析2.程序框架图3.修改FurnDao添加方法add 4.修改FurnDaoImpl添加方法add 5.单元测试FurnDaoTest.java 6.修改FurnService添加方法add 7.修改FurnServiceImpl添加方法add 8.单元测试FurnServiceTest.java 9.修改furn_add.jsp10.修改FurnSe…

用于扩展Qt自身的插件(下)

扩展Qt自身的插件 引言必须满足项创建插件示例代码生成插件配置加载插件的环境创建使用插件的项目配置库和头文件依赖的步骤:应用程序代码运行结果总结引言 本文继上篇的扩展Qt自身的插件,接着记录Qt自身的插件,只不过本文提及的用于扩展Qt自身的插件是可以在QtCreator的设…

读《AI营销画布》客户关系维护的当代挑战(二)

前言 技术进步、用户连接与信息冗余这三股力量已经让人无法真正高质量的获取有用的信息&#xff0c;在对进步与高质量前面提出解决方案时&#xff0c;我们需要对挑战清楚的认识&#xff0c;所以&#xff0c;今天就这三个也解读一下。 1.信息泛滥与爆炸 如图还是19年的&#xf…

股票价格预测 | Python使用GAN预测股票价格

文章目录 效果一览文章概述代码设计效果一览 文章概述 生成对抗网络(GAN)是一种强大的机器学习模型,用于生成以假乱真的数据。然而,使用GAN来预测股票价格可能会面临以下挑战: 数据可用性:GAN需要大量的数据进行训练,以便生成准确的输出。对于股票价格预测,历史股票价…

基于单片机的智能居家火灾报警系统

摘要:采用STC15L2K32单片机设计了一种智能火灾报警系统,它是控制中心与多个不同功能的探测模块构成,实现了一个中心、多点辐射的火灾检测和报警功能。 关键词:智能居家,火灾报警系统,单片机,模块化设计。 0 引言 近些年电子技术、计算机技术为火灾报警系统和灭火系统在…

Python实现PDF页面的删除与添加

在处理PDF文档的过程中&#xff0c;我们时常会需要对PDF文档中的页面进行编辑操作的情况&#xff0c;如插入和删除页面。通过添加和删除PDF页面&#xff0c;我们可以增加内容或对不需要的内容进行删除&#xff0c;使文档内容更符合需求。而通过Python实现PDF文档中的插入和删除…

明明设置数字居中对齐,为什么excel的数字却不居中?

有时候在excel里&#xff0c;选中数据&#xff0c;设置对齐方式 左右居中&#xff0c;然而&#xff0c;数字却怎么都不居中&#xff0c;为什么呢&#xff1f; 1.按快捷键Ctrl1&#xff0c;打开单元格自定义格式对话框&#xff0c;看到是初始界面是在数字的会计专用&#xff0c;…

TDengine too many open files

too many open files 是比较常见的报错&#xff0c;尤其使用TDengine 3.0 集群时&#xff0c;大概率会遇到。这个报错很简单&#xff0c;但要想顺利解决&#xff0c;却涉及到很多知识点。 目录 知识点&#xff1a;fs.nr_open知识点&#xff1a;file-max & fs.file-nr知识点…

VSCode中 task.json 和 launch.json 的作用和参数解释以及配置教程

前言 由于 VS Code 并不是一个传统意义上的 IDE&#xff0c;所以初学者可能在使用过程中会有很多的疑惑&#xff0c;其中比较常见的一个问题就是 tasks.json和 launch.json两个文件分别有什么作用以及如何配置 tasks.json VSCode 官网提供的 tasks.json 配置教程 使用不同的…