WM8960音频播放

发布者:快乐舞步最新更新时间:2024-12-04 来源: elecfans关键字:WM8960  音频播放 手机看文章 扫描二维码
随时随地手机看文章

第一节 音频播放原理
首先需要申明一下,本章的代码来自网络,参考了亚嵌教育李明老师(论坛ID:limingth)的帖子:

http://www.arm9home.net/read.php?tid=20515&page=1#175657

image
S5PV210通过i2s和i2c与音频编解码芯片wm8960进行交互,其中i2s负责只传输声音数据,而i2c负责传输控制信息(如音量调节、静音等),wm8960负责编解码。
要驱动wm8960,我们需要做三件事:(1)初始化i2s,(2)初始化i2c,(3)初始化wm8960。
Mini210S相关的原理图如下:

image
第二节 程序详细讲解
完整代码见目录详细代码下载链接。
1. Makefile
在makefile中,我们将程序的链接地址设置为0x21000000,也就是说程序只有
位于0x21000000才能正常运行,所有我们的程序一开始就必须被下载到内存0x21000000处。
2. main.c
代码如下:
void main(void)
{
    printf('Audio Testrn');
    int offset = 0x2E; // 音频数据开始的地方
    short * p = (short *)0x22000000; // 音频文件应该位于的位置
    iic_init(); // 初始化i2c
    wm8960_init(); // 初始化wm8960
    iis_init(); // 初始化iis
    // 循环播放音频文件
    while (1)
    {
        // polling Primary Tx FIFO0 full status indication.
        while((IISCON & (1<<8)) == (1<<8));
        IISTXD = *(p+offset); // 每次发送2byte
        offset++;
        if (offset > (882046-0x2e) /2) // 有多少个2byte = (文件大小-偏移)/2
        offset = 0x2E;
    }
}
main函数共做了4件事:
第一步 调用iic_init()初始化i2c;
第二步 调用wm8960_init()初始化wm8960;
第三步 调用iis_init()初始化i2s;
第四步 用i2s中发出声音数据,循环播放音频文件;
3. audio.c
audio.c里有几个核心的函数,下面我们来逐个分析。
函数一 iic_init(),代码如下:
void iic_init(void)
{
    GPD1CON |= 0x22; // 配置引脚
    GPD1PUD |= 0x5;
    I2CCON0 = (1<<7) | (0<<6) | (1<<5) | (0xe);
    I2CSTAT0 = 0x10;
}
初始化i2c很简单,分三步:
第一步 配置引脚用于i2c功能;
第二步 配置i2c控制器,包括设置时钟,使能ack等;
第三步 使能接收和发送功能;
函数二 iic_write (),代码如下:
void iic_write(int slave_addr, int addr, int data)
{
    // 地址
    I2CDS0 = slave_addr;
    // 发送s信号和地址
    I2CSTAT0 = 0xf0;
    // 等待
    while ((I2CCON0 & 0x10) == 0); // 等待数据发送
    while ((I2CSTAT0 & 0x1)); // 等待从机发来ACK
    // 发7bit地址和9bit数据
    I2CDS0 = addr<<1 | ((data>>8) & 0x0001);
    I2CCON0 &= ~(1<<4); // 清中断
    while ((I2CCON0 & 0x10) == 0); // 等待数据发送
    while ((I2CSTAT0 & 0x1)); // 等待从机发来ACK
    I2CDS0 = (data & 0x00FF);
    I2CCON0 &= ~(1<<4); // 清中断
    while ((I2CCON0 & 0x10) == 0); // 等待数据发送
    while ((I2CSTAT0 & 0x1)); // 等待从机发来ACK
    // 发p信息
    I2CSTAT0 = 0xd0;
    I2CCON0 &= ~(1<<4); // 清中断
    // 延时等待
    int i=0;
    for(i=0; i<50; i++);
    return;
}
i2c的写操作也不难,整体上分三步:
第一步 发s信号和设备地址, slave_addr的bit[0:6]是7bit的设备地址,bit[7]=0,表示发送;
然后需等待数据发送完成和等待ack应答;
第二步 发16bit的数据,其中前7bit是寄存器偏移地址,后9bit是寄存器的值;
第三步 发p信号,表示结束;
第四步 延时,等待p信号发送成功;
函数三 wm8960_init (),核心代码如下:
void wm8960_init(void)
{
    #define WM8960_DEVICE_ADDR 0x34 // 重置
    iic_write(WM8960_DEVICE_ADDR, 0xf, 0x0); // 设置电源
    iic_write(WM8960_DEVICE_ADDR, 0x19, 1<<8 | 1<<7 | 1<<6);
    iic_write(WM8960_DEVICE_ADDR, 0x1a, 1<<8 | 1<<7 | 1<<6 | 1<<5 | 1<<4 | 1<<3);
    iic_write(WM8960_DEVICE_ADDR, 0x2F, 1<<3 | 1<<2); // 设置时钟
    iic_write(WM8960_DEVICE_ADDR, 0x4, 0x0); // 设置ADC-DAC
    iic_write(WM8960_DEVICE_ADDR, 0x5, 0x0);
    …
}
wm8960_init()主要是调用了iic_write()来初始化wm8960芯片,具体的初始化步骤需要自行详细阅读wm8960的芯片手册,
这里只是简单了整理了网友limingth的初始化步骤:
第一步 确定wm8960的设备地址,查看wm8960的芯片手册可知其设备地址为0x1a,左移1位且低位补0(表示发送)后,WM8960_DEVICE_ADDR = 0x34,reset;
第二步 设置power1 2 3;
第三步 设置时钟;
第四步 设置ADC-DAC,注意设置非静音;
第五步 设置audio interface;
第六步 设置volume;
第七步 设置mixer;
这些都是wm8960芯片手册里相关的内容,需自行阅读该芯片手册。
函数四 iis_init (),核心代码如下:
void iis_init(void)
{
    int N;
    // 配置引脚用于i2s功能
    GPICON = 0x22222222;
    // 设置i2s相关时钟
    EPLL_CON0 = 0xa8430303; // MPLL_FOUT = 67.7Mhz
    EPLL_CON1 = 0xbcee;  // from linux kernel setting
    CLK_SRC0 = 0x10001111;
    CLK_CON = 0x1; // 1 = FOUT_EPLL MUXI2S_A 00 = Main CLK
    // 设置i2s控制器
    N = 5;
    IISPSR = 1<<15 | N<<8;
    IISCON |= 1<<0 | (unsigned)1<<31;
    IISMOD = 1<<9 | 0<<8 | 1<<10;
}
i2s的初始化整体上分为三个步骤:
第一步 配置引脚用于i2s功能;
第二步 设置i2s相关时钟,具体包括设置EPLL_CON0、1使EPLL输出67.7Mhz,设置时钟开关CLK_SRC0;
第三步 设置i2s控制器,具体包括设置分频,时钟选择和发送接收模式;
第三节 实验现象
开发板上插入耳机,就能重复地听到windows xp启动时的音乐了。


关键字:WM8960  音频播放 引用地址:WM8960音频播放

上一篇:S5PV210的根文件系统制作
下一篇:S5PV210 ADC转换

推荐阅读最新更新时间:2026-03-25 12:11

WM8960音频播放
第一节 音频播放原理 首先需要申明一下,本章的代码来自网络,参考了亚嵌教育李明老师(论坛ID:limingth)的帖子: http://www.arm9home.net/read.php?tid=20515&page=1#175657 S5PV210通过i2s和i2c与音频编解码芯片wm8960进行交互,其中i2s负责只传输声音数据,而i2c负责传输控制信息(如音量调节、静音等),wm8960负责编解码。 要驱动wm8960,我们需要做三件事:(1)初始化i2s,(2)初始化i2c,(3)初始化wm8960。 Mini210S相关的原理图如下: 第二节 程序详细讲解 完整代码见目录详细代码下载链接。 1. Makefile 在
[单片机]
<font color='red'>WM8960</font><font color='red'>音频</font><font color='red'>播放</font>
单片机与BY8301-16P语音模块串口通信详解:实现指定音频播放功能
一、串口语音模块 这里我们使用的具体型号是:CH32V307VCT6开发板和BY8301-16P 语音模块。 以下是BY8301-16P语音模块的一些主要特点: 高品质音频播放: 支持MP3和WAV两种主流音频格式解码,提供高品质的声音输出。具有24位DAC输出,支持90dB的动态范围和85dB的信噪比(SNR)。 内置存储介质: 内置SPI-FLASH作为存储介质,通常有4MB(32Mbit)或更大的容量,最大可支持16M Byte容量的SPI FLASH(例如GD25Q128)。 方便的音频更新: 配有Micro USB接口,无需上位机软件,可以直接通过数据线连接电脑(支持XP和WIN7系统)自由更换FLASH中的音频内
[单片机]
单片机与BY8301-16P语音模块串口通信详解:实现指定<font color='red'>音频</font><font color='red'>播放</font>功能
如何使用编解码器加速开发音频播放应用
在嵌入式系统中,越来越需要提供高保真音频而不是蜂鸣器来实现用户反馈,包括报警和警报。虽然过去哔哔声或者鸣叫声很有效,但用户期望通过播放 MP3 等文件格式音频才能产生的高级声音。问题是,音频播放可能会让人紧张,并增加系统成本和复杂性。第一直觉是找到可以播放 MP3 的微控制器,但这往往会使物料清单 (BOM) 增加几美元并需要相当复杂的嵌入式软件。 音频编解码器就是一个特别能平衡额外成本和软件复杂性的解决方案。音频编解码器不仅能接受来自微控制器的音频数据流,往往还具有多种功能,使得开发人员可以对音频播放系统进行精心调校,提高系统播放音质。 本文将讨论音频编解码器的作用、开发者在选择时应考虑的主要特点以及如何有效使用。本文将
[嵌入式]
如何使用编解码器加速开发<font color='red'>音频</font><font color='red'>播放</font>应用
汽车音响行业首创的384kHz/32bit Hi-Res高音质音频播放
凭借“完美同步”营造临场感的世界顶级汽车音响 “AlpineF#1Status(AlpineF#1Status)” 集阿尔卑斯阿尔派技术与知识之大成,采用行业最高规格的水晶振荡器 主营电子元器件、汽车电子产品的开发、生产、销售业务的阿尔卑斯阿尔派株式会社(东京都大田区,栗山年弘社长)及其日本营销公司阿尔派营销株式会社(东京都大田区,石田宗树社长)共同开发了世界顶级汽车音响“AlpineF#1Status(AlpineF#1Status)”。预计从今年秋季开始全球销售。 AlpineF#1Status是完美地体现了阿尔派远景《Emotion in Mobility让移动感动生活》的汽车音响系统,阿尔派作为提供享
[汽车电子]
汽车音响行业首创的384kHz/32bit Hi-Res高音质<font color='red'>音频</font><font color='red'>播放</font>
总倍速播放音频、视频,对你的大脑好吗?
我的朋友梅吉(Meggie)不管看什么都用 1.5 倍速。这个习惯起初是因为她被迫在谷歌上观看工作培训视频和会议记录,后来她开始把上下班两个小时途中收听的播客和有声读物的速度也调快了。按照这种方式,她估计自己一周能听十个小时的音频,这样一个月就能听完好几本书。   她说:‘我可以通过加快速度来阅读更多的书,也就能吸收更多知识。’   YouTube、有声读物(Audible)、播客软件以及网飞(Netflix)现在都有倍速播放功能。支持者认为,视频或者音频用 1.25、1.5 甚至 2 倍速度播放可以提高效率,节省宝贵的时间,让你做更多事。但是按照这个速度,你从这次经历中接收到的还是同样的信息吗?更不用说享受了。   尽管这
[手机便携]
DIY你的电子玩具:FLAC高保真数字音频播放
一、项目概述 1.1 引言 目前,大部分的音乐文件都是以mp3格式来保存的,mp3是一种有损的音频压缩格式,它无法完美地再现原版音乐。随着存储器容量的扩大、网络带宽的增加、处理器性能的增强以及人们对生活品质要求的提高,无损音乐越来越受到人们的青睐,对无损音乐播放器的需求也就越来越大。 1.2 项目背景/选题动机 我们希望能在AVR单片机上实现一个“FLAC高保真音频播放器”。播放器用ATMEL的EVK1105套件来实现,它将从SD卡、U盘和网络中读取音频文件,并对其进行解码及播放。该播放器能播放高保真音频文件,具有设备体积小、操作简单和便于携带使用等优点。 二、需求分析 2.1 功能要求 音频播放:能支持FLAC格式的音频
[单片机]
DIY你的电子玩具:FLAC高保真数字<font color='red'>音频</font><font color='red'>播放</font>器
基于STM32的WAV音频格式播放
STM32从SD卡中读取语音文件进行播放,因此需要对语音进行解码,刚开始就一直使用Speex的音频压缩格式,最近发现,在进行语音格式转换时,我们不能很好地分析spx格式音频文件的文件头,这样就会导致语音的播放出现问题。由于WAV采用PCM编码,音质也十分不错,于是考虑用STM32对WAV格式音频文件进行解码,上周末开始找资料和编程,其中也遇到了不少问题,不过功夫不负有心人,最终还是顺利的跑起来了。先将资料和编程过程整理成本文,供大家一起学习和进步。 WAV文件格式是一种重要的用于存放声音文件的文件格式,尽管现在有MP3,RAM等压缩效率更高的声音文件格式,并且广泛被音乐文件所采用,但是又很多的应用程序仍然采用WAV文件格式。由于W
[单片机]
基于STM32的WAV<font color='red'>音频</font>格式<font color='red'>播放</font>器
ROHM开发出可播放所有常见音源的支持高分辨率Audio SoC“BM94803AEKU” 同时推出业界首款支持高分辨率的音频参考设计
全球知名半导体制造商ROHM面向从传统的收录机、CD组合音响到最新的蓝牙音箱、USB-DAC等各种音频设备,开发出可播放所有常见音源、并将控制管理外围部件和输入输出接口的机构(可称为音响应用的大脑)集成于一枚芯片的支持高分辨率*1的Audio SoC*2“BM94803AEKU”。下面就随嵌入式小编一起来了解一下相关内容吧。   背景 近年来,不仅高分辨率音源,各种音频设备对于忠实再现所有音源(媒体、音乐文件)信息量的需求日益高涨。 而要想支持所有音源,不仅需要包括外围部件在内的CD、USB及Bluetooth等多个媒体解码器,而且运行这些设备的软件也越来越复杂,因此存在开发耗时长的问题。 ROHM面向音频领域,继运算放大器
[嵌入式]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved