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

news2024/11/26 7:35:53

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

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

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

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

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

寄存器4

  • 正点原子代码

正点原子代码中并未设置寄存器4,也就是说使用的是默认值0x050。

  • 野火代码
void wm8978_CfgAudioIF(uint16_t _usStandard, uint8_t _ucWordLen)
{
	uint16_t usReg;

    //WM8978(V4.5_2011).pdf 73页,寄存器列表

	//	REG R4,音频接口控制寄存器
	//	B8		BCP	 = x,BCLK极性,0表示正常,1表示反相
	//	B7		LRCP = x, LRC时钟极性,0表示正常,1表示反相
	//	B6:5	WL = x,字长,00=16bit,01=20bit,10=24bit,11=32bit(右对齐模式只能操作在最大24bit)
	//	B4:3	FMT = x,音频数据格式,00=右对齐,01=左对齐,10=I2S,11=PCM
	//	B2		DACLRSWAP = x,控制DAC数据出现在LRC时钟的左边还是右边
	//	B1 		ADCLRSWAP = x,控制ADC数据出现在LRC时钟的左边还是右边
	//	B0		MONO = 0,0表示立体声,1表示单声道,仅左声道有效
	//
	usReg = 0;
	if (_usStandard == SAI_I2S_STANDARD) //I2S飞利浦标准
	{
		usReg |= (2 << 3);
	}
	else if (_usStandard == SAI_I2S_MSBJUSTIFIED) //MSB对齐标准(左对齐)
	{
		usReg |= (1 << 3);
	}
	else if (_usStandard == SAI_I2S_LSBJUSTIFIED) //LSB对其标准(右对齐)
	{
		usReg |= (0 << 3);
	}
	else //PCM对齐标准(16位通道帧上带长或短帧同步或者16位数据帧扩展为32位通道帧)
	{
		usReg |= (3 << 3);
	}

	if (_ucWordLen == 24)
	{
		usReg |= (2 << 5);
	}
	else if (_ucWordLen == 32)
	{
		usReg |= (3 << 5);
	}
	else
	{
		usReg |= (0 << 5);		/* 16bit */
	}
	wm8978_WriteReg(4, usReg);

    ……
}

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

寄存器4复位默认值为0x050(0b001010000)。

  • BCP

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

  • LRP

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

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

  • WL

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

 对应STM32CubeMX中的设置为:

  • FMT

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

 对应STM32CubeMX中的设置为:

  • DACLRSWAP

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

  • ADCLRSWAP

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

  • MONO

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

根据正点原子和野火的代码,实际采用了默认值0x050(0b001010000),即字长(WL)为24 bits,音频数据格式(FMT)为I2S飞利浦标准格式。

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

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

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

相关文章

php反序列化(2)

一.pop链 在反序列化中&#xff0c;我们能控制的数据就是对象中的属性值&#xff08;成员变量&#xff09;&#xff0c;所以在php反序列化中有一种漏洞利用方法叫“面向属性编程”&#xff0c;即pop&#xff08;property oriented programming&#xff09;。 pop链就是利用魔…

蓝桥杯基础18——第13届省赛真题与代码详解

目录 0.心得体会 1.题目如下 2.代码实现的思路 键值扫描 数码管窗口切换 数码管的动态扫描 继电器工作时L3闪烁&#xff0c;整点时刻L1灯光亮5秒 3.变量列表 定义的常量和数组 功能控制和状态变量 定时器和计数变量 4.代码参考 4.1 头文件 onewire.h ds1302.h 4…

vscode远程免密登录ssh

vscode远程免密登录ssh 1. 安装vscode2. 安装ssh3. 本地vscode配置免密登录远端开发机1. 本地配置秘钥2. 远程开发机配置秘钥 4. vscode常用小工具1. vscode怎么设置ctrl加滚轮放大字体 1. 安装vscode 2. 安装ssh 设置符号打开config配置文件&#xff0c;点击符号ssh连接新的远…

(UDP)其他信息: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。

“System.Net.Sockets.SocketException”类型的异常在 mscorlib.dll 中发生&#xff0c;但未在用户代码中进行处理其他信息: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。这个异常表示端口已经被占用了&#xff0c;需要释放端口或者使用其他端口来建立连接。您可以…

单片机方案 发声毛绒小黄鸭

随着科技的不断进步&#xff0c;智能早教已经成为了新时代儿童教育的趋势。智能早教玩具&#xff0c;一款集互动陪伴、启蒙教育、情感培养于一身的高科技产品。它不仅能陪伴孩子成长&#xff0c;还能在游戏中启迪智慧&#xff0c;是家长和孩子的理想选择。 酷得电子方案开发特…

程序员Java.vue,python前端后端爬虫开发资源分享

bat面试资料 bat面试题汇总 提取码&#xff1a;724z 更多资料

MYSQL5.7详细安装步骤

MYSQL5.7详细安装步骤&#xff1a; 0、更换yum源 1、打开 mirrors.aliyun.com&#xff0c;选择centos的系统&#xff0c;点击帮助 2、执行命令&#xff1a;yum install wget -y 3、改变某些文件的名称 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base…

python 今日小知识2—— globals() 函数

globals() 函数语法&#xff1a; globals() 参数 无 返回值 返回全局变量的字典。 globals()函数示例 下面是一个简单的示例&#xff0c;展示了globals()函数的用法&#xff1a; a 10 b 20def test_func():c 30for key,value in globals().items():print(key,value)t…

如何使用SQL注入工具?

前言 今天来讲讲SQL注入工具&#xff0c;sqlmap。如何使用它来一步步爆库。 sqlmap官方地址如下。 sqlmap: automatic SQL injection and database takeover tool 前期准备&#xff0c;需要先安装好docker、docker-compose。 一个运行的后端服务&#xff0c;用于写一个存在…

关于Unity使用DLL的说法

最近在研究一些构建依赖相关的&#xff0c;特别是Unity在不同平台上使用第三方类库时候的问题。简单查了一下资料&#xff0c;其实不难理解&#xff0c;这里只是简单的记录一下&#xff0c;弄明白一个简单的道理就行了。 为什么有的第三方库(DoTween),NewtonSoft等的dll库&…

HTML、CSS --javaweb学习笔记

记录一些重要的知识点 CSS引入方式 行内样式&#xff1a;<h1 style"...">内嵌样式&#xff1a;<style>…</style>外联样式&#xff1a;xxx.css <link href"..."> 颜色表示 关键字&#xff1a;red、green.......rgb表示法&…

C++矩阵库Armadillo出现warning solve() system is singular错误的解决

本文介绍使用C 语言的矩阵库Armadillo时&#xff0c;出现报错system is singular; attempting approx solution的解决方法。 在之前的文章中&#xff0c;我们介绍过Armadillo矩阵库在Visual Studio软件C环境中的配置方法&#xff08;https://blog.csdn.net/zhebushibiaoshifu/a…

回归预测 | Matlab实现SSA-GRNN麻雀算法优化广义回归神经网络多变量回归预测(含优化前后预测可视化)

回归预测 | Matlab实现SSA-GRNN麻雀算法优化广义回归神经网络多变量回归预测(含优化前后预测可视化) 目录 回归预测 | Matlab实现SSA-GRNN麻雀算法优化广义回归神经网络多变量回归预测(含优化前后预测可视化)预测效果基本介绍程序设计参考资料预测效果

计算机三级数据库技术备考笔记(十二)

第十二章 备份与恢复数据库 备份与恢复的概念 备份数据库就是将数据库中的数据以及保证数据库系统正常运行的有关信息保存起来&#xff0c;以备系统出现问题时恢复数据库时使用。 备份数据库 备份是制作数据库的副本,包括数据库结构、对象和数据。备份数据库的主要目的是为了防…

最新mysql8.3 保姆级 主从复制搭建教程

mysql 主从复制搭建 服务器配置表 机器ip操作系统主机192.168.31.25华为openEuler-22.03-LTS-SP3从机192.168.31.184华为openEuler-22.03-LTS-SP3从机192.168.31.228华为openEuler-22.03-LTS-SP3 1、在3台机器上安装独立的 mysql 1.1 创建myql文件夹用来存放mysql包 mkdir…

Centos7 搭建Mongodb 分片集群4.0/ PSA(三成员副本集)

MongoDB 简介:1、优点和缺点:2、MongoDB适用的业务场景:Centos7 搭建Mongodb 分片集群一、安装MongoDB社区版4.01、配置程序包管理系统(`yum`)2、安装对应版本的MongoDB软件包。3、创建运行mongodb的目录并禁用SELinux4、修改文件打开数5、初始化系统5.1、创建config配置…

LeetCode-5. 最长回文子串【字符串 动态规划】

LeetCode-5. 最长回文子串【字符串 动态规划】 题目描述&#xff1a;解题思路一&#xff1a;动态规划五部曲解题思路二&#xff1a;动态规划[版本二]解题思路三&#xff1a;0 题目描述&#xff1a; 给你一个字符串 s&#xff0c;找到 s 中最长的回文 子串 。 如果字符串的反序…

AndroidAutomotive模块介绍(二)应用及接口介绍

前言 上一篇文章中从整体角度描述了 Android Automotive 模块。本篇文章将对 Android Automotive 中的 APP 以及 API 部分展开描述。 上一篇&#xff1a;AndroidAutomotive模块介绍&#xff08;一&#xff09;整体介绍 下一篇&#xff1a;AndroidAutomotive模块介绍&#xff0…

GitHub repository - Branch - SSH clone URL - Clone in Desktop - Download ZIP

GitHub repository - Branch - SSH clone URL - Clone in Desktop - Download ZIP 1. Branch2. SSH clone URL3. Clone in Desktop4. Download ZIPReferences 1. Branch 显示当前分支的名称。从这里可以切换仓库内分支&#xff0c;查看其他分支的文件。 2. SSH clone U…

JavaWeb--JavaScript-事件绑定/BOM/DOM编程

目录 1. 事件绑定 1.1. 什么是事件 1.2. 常见事件 1.3. 事件的绑定 1.3.1. 属性绑定 1.3.2. DOM编程绑定 1.4. 事件的触发 1.4.1. 行为触发 1.4.2. DOM编程触发 2. BOM 编程 2.1. 什么是 BOM 2.2. window对象的常见属性(了解) 2.3. window对象的常见方法(了解) 2…