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

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

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

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

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

  •  正点原子代码
//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
};

寄存器6

  • 正点原子代码
    WM8978_Write_Reg(6, 0);	//R6,MCLK由外部提供
  • 野火代码
void wm8978_CfgAudioIF(uint16_t _usStandard, uint8_t _ucWordLen)
{
	uint16_t usReg;

	……
	//
	//	R6,时钟产生控制寄存器
	//	MS = 0,  WM8978被动时钟,由MCU提供MCLK时钟
	//
	wm8978_WriteReg(6, 0x000);
}

关于寄存器6的说明,参见笔者文章:

WM8978 —— 带扬声器驱动程序的立体声编解码器(5)-CSDN博客

寄存器6复位默认值为0x140(0b101000000)。

  • CLKSEL

参见WM8978手册第68~69页,如下:


 

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

  • BCLKDIV

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

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

这里由于将WM8978设置为了slave mode即从模式,因此BCLKDIV并不需要设置。

  • MS

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

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

 对应STM32CubeMX中的设置为(PC7为笔者实际方案中的MCLK引脚):

根据正点原子和野火的代码,实际并没有使用默认值0x140(0b101000000),而是使用了0x000(0b000000000),即WM8978的MCLK为被动时钟,由外部MCU提供。

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

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

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

相关文章

C++学习进阶:哈希思想的进一步体现

目录 前言 1.位图 1.1.位图的实现与原理 1.2.如何使用位图处理海量数据 2.布隆过滤器 2.1.知识引入 2.2.布隆过滤器的实现 2.3.布隆过滤器的应用 3.哈希切割 前言 我们在之前对哈希表的学习&#xff0c;明白了哈希的本质就是一种映射&#xff01;&#xff01;&#xf…

安达发|APS智能优化排产软件之模具约束

在制造业中&#xff0c;模具是生产过程中不可或缺的重要工具。然而&#xff0c;由于模具的制造周期长、成本高以及生产过程中的复杂性&#xff0c;如何合理安排模具的使用和生产计划成为了一个关键问题。为了解决这个问题&#xff0c;许多企业开始采用APS&#xff08;高级计划与…

主干网络篇 | YOLOv8更换主干网络之VanillaNet | 华为方舟实验室提出全新轻量级骨干架构

前言:Hello大家好,我是小哥谈。华为方舟实验室所提出的VanillaNet架构克服了固有复杂性的挑战,使其成为资源受限环境的理想选择。其易于理解和高度简化的架构为高效部署开辟了新的可能性。广泛的实验表明,VanillaNet提供的性能与著名的深度神经网络和vision transformers相…

深度剖析Java中的String类

目录 引言 String类的特性 String类的部分实现代码&#xff1a; 不可变性&#xff1a; 补充&#xff1a; 常量池&#xff1a; 不可变性的好处 创建String对象 创建String对象的常用的三种方法如下&#xff1a; 使用常量串构造&#xff08;最常用&#xff09;&#xf…

帝国cms仿《鳄鱼下载站》网站源码

仿《鳄鱼下载站》网站源码手机安卓软件网站模版 PHP网站源码 帝国cms内核 采用帝国cms7.5 环境PHPmysql 恢复数据库后如何修改密码: 双击表&#xff0c;进入对应的详细数据表&#xff0c;然后找到&#xff1a;www_96kaifa_com_enewsuser这个表&#xff0c;双击打开修改&…

SAP SD学习笔记06 - 受注的据否,受注的理由,简易变更(一括处理)

上文讲了一括处理和Block&#xff08;冻结&#xff09;处理。 SAP SD学习笔记05 - SD中的一括处理&#xff08;集中处理&#xff09;&#xff0c;出荷和请求的冻结&#xff08;替代实现承认功能&#xff09;-CSDN博客 本章继续讲SAP的流程中一些常用的操作。 1&#xff0c;受注…

【算法】分治-快排

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 前言1. 75. 颜色分类1.1 分析1.2 代码 2. 912. 排序数组2.1 分析2.2 代码 3. 215. 数组中的第K个最大元素3.1 分析3.2 代码 4. LCR 159. 库存管理 III4.1 分析4.2 代码 前言 分治就是分而治之 1. 75. 颜色分类 1.1 分析…

基于java+springboot+vue实现的网上购物系统(文末源码+Lw+ppt)23-42

摘 要 随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&#xff0c;人们更趋向于足不出户解决生活上的问题&#xff0c;网上购物系统展现了其蓬勃生命力和广阔的前景。与此同时&#xff0c;为…

Linux【实战篇】—— NFS服务搭建与配置

目录 一、介绍 1.1什么是NFS&#xff1f; 1.2客户端与服务端之间的NFS如何进行数据传输&#xff1f; 1.3RPC和NFS的启动顺序 1.4NFS服务 系统守护进程 二、安装NFS服务端 2.1安装NFS服务 2.2 创建共享目录 2.3创建共享目录首页文件 2.4关闭防火墙 2.5启动NFS服务 2.…

Java 语言程序设计(基础篇)原书第10版 梁勇著 PDF 文字版电子书

简介 Java 语言程序设计&#xff08;基础篇&#xff09;原书第 10 版 是 Java 语言的经典教材&#xff0c;中文版分为基础篇和进阶篇&#xff0c;主要介绍程序设计基础、面向对象程序设计、GUI 程序设计、数据结构和算法、高级 Java 程序设计等内容。本书通过示例讲解问题求解…

抖音滑块验证码加密的盐的位置

最近更新后之前很容易找到盐的位置的方法变了&#xff0c;抖音特意把盐隐藏起来了 {"reply": "RJC","models": "yAd8rl","in_modal": "DTn0nD2","in_slide": "ou7H0Ngda","move": …

C++算法题 - 双指针

目录 125. 验证回文串392. 判断子序列167. 两数之和 Ⅱ - 输入有序数组11. 盛最多的水15. 三数之和 125. 验证回文串 LeetCode_link 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 …

arm工作模式、arm9通用寄存器、异常向量表中irq的异常向量、cpsr中的哪几位是用来设置工作模式以及r13,r14,15别名是什么?有什么作用?

ARM 首先先介绍一下ARM公司。 ARM成立于1990年11月&#xff0c;前身为Acorn计算机公司 主要设计ARM系列RISC处理器内核 授权ARM内核给生产和销售半导体的合作伙伴ARM公司不生产芯片 提供基于ARM架构的开发设计技术软件工具评估版调试工具应用软件总线架构外围设备单元等等CPU中…

一起学习python——基础篇(20)

前言&#xff0c;之前经常从网上找一些免费的接口来测试&#xff0c;有点受制于人的感觉。想了想还不如直接写一个接口&#xff0c;这样方便自己测试。自己想返回什么格式就返回什么样子&#xff0c;不用担心服务报错&#xff0c;因为自己就可以完全掌控。然后宿舍二哥告诉我py…

spring boot集成logback到mysql 8

spring boot集成logback到mysql 8 依赖数据库准备创建log日志用户&#xff0c;并创建数据库执行建表sql 配置文件bugbug 1&#xff1a;Failed to instantiate type ch.qos.logback.classic.db.DBAppenderbug信息&#xff1a;解决&#xff1a; bug2: DBAppender cannot function…

windows SDK编程 --- 第一个程序

一、基础知识 1.Unicode 和 ANSI 在 Windows 编程中&#xff0c;Unicode 和 ANSI 是两种不同的字符编码方法&#xff0c;它们用于定义如何在计算机中表示和存储字符数据。 ANSI ANSI&#xff08;American National Standards Institute&#xff09;编码是一种基于单字节的字符…

最新视频理解大模型之MiniGPT4-video

前言 随着大模型的爆火&#xff0c;多模态大模型也随之卷了起来&#xff0c;基本每隔一小段时间就会冒出一个新模型。 今天给大家带来一个最新发现的关于视频理解的多模态大模型。 它的名字是MiniGPT4-video&#xff0c;可以看的出来其是MiniGPT4的一个分支&#xff1b;Mini…

vue3实现时钟效果

鼬鼬鼬鼬鼬被提需求了&#xff01;&#xff01;&#xff01; 产品&#xff1a;你学什么的&#xff1f; 我&#xff1a;跟CV有点关系 产品&#xff1a;control C加control V是吧 我&#xff1a;对对对 效果 时间实时变化&#xff1a; 页面部分 <template><div clas…

开源博客项目Blog .NET Core源码学习(14:App.Hosting项目结构分析-2)

开源博客项目Blog的前台页面&#xff08;如下图所示&#xff09;的控制器类保存在App.Hosting项目的Controllers文件夹内&#xff0c;页面保存在Views文件夹内&#xff0c;网页中使用的图标、js、css文件等保存在wwwroot文件中。 前台各个页面、Controller文件夹中的控制器类及…

Vue2电商前台项目(三):完成Search搜索模块业务

目录 一、请求数据并展示 1.写Search模块的接口 2.写Vuex中的search仓库&#xff08;三连环&#xff09; 3.组件拿到search仓库的数据 用getters简化仓库中的数据 4.渲染商品数据到页面 5.search模块根据不同的参数获取数据展示 &#xff08;1&#xff09;把派发action…