代码编织梦想

第七章 实战项目提升,完善简历

18.SD卡存放音频WAV播放(上)

        在最后一章里,我们来做几个实战项目,一方面是对前面学习知识的一种回顾,另一方面这几个小项目也非常贴近实际工程,其中例程“SD卡存放音频WAV播放”比较偏向校园电子大赛项目,比较新颖涉及知识点多,会给面试官们留下不错的印象;例程“OV7725摄像头实时采集HDMI显示边缘检测”,帮助大家举一反三地实现其他图像前后处理、多帧缓存技术等应用; 例程“USB2.0/RS232/LAN控制并行DAC输出任意频率的正弦波、梯形波、三角波、方波“,有很多关键技术,涵盖报文分割、报文解析、串口Modbus CRC校验、USB2.0 CRC校验、网口ARP/ ICMP/ UDP协议实现,DDS IP核等。

       在这一个例程“SD卡存放音频WAV播放”和最后一个例程“USB2.0/RS232/LAN控制并行DAC输出任意频率正弦波、梯形波、三角波、方波”中,其实都涉及到DAC数模转换的实际应用。

        在这里大家不妨想想DAC数模转换和ADC模数转换的应用场景,相信本科学自动化、电子、通信等专业的同学,上学时都会开设“数字信号处理”、“自动化控制原理”、“信号与系统”、“电力电子”、“模拟电路”等相关课程,当时只记得书上各种各样的复杂公式推导和抽象概念理论,仅仅看书通过字面意思学来学去,还是感到不知所云。

      有趣的是在工作以后再遇到这些问题时,迫不得已笔者试着买了几本国外的教程学习,不得不说国外教程写得真的很好站在了实践的角度在写书,而相反的国内教程把公式和理论无限放大内容枯燥,在这推荐一本数字信号处理好书给大家“understanding digital signal procesing 2nd edition”,书里深入浅出地把数字信号处理中的滤波器设计、采样和量化、离散傅立叶变换、数字变频等说得很清楚,这本书的中文电子版也已经附带在开发板的资料中方便大家课后学习。

       在这个例程中我们通过一颗应用广泛的音频编解码芯片WM8731去播放SD卡中存储的WAV格式语音数据文件,这也是一个比较综合性的项目类例程,如图1所示是豌豆开发板Artix7上WM8731电路。

图1 豌豆开发板Artix7上WM8731电路

       WM8731芯片本身既支持通过DAC数模转换接口把语音数据转化为音频信号通过输出端音频连接器外放,也支持ADC模数转换接口把输入端音频连接器上的音频信号采集为语音数据,对照原理图和实物大家可以清楚地看到豌豆开发板上板载3个音频连接器,其中粉色的接口作为麦克风输入,绿色的接口作为耳机输出,蓝色的接口作为音频输入用于连接DVD等音频输出口。     

       在这个例程中我们仅使用了WM8731的DAC转换功能,即把SD卡中事先存储的WAV格式语音数据转化为音频信号通过输出端绿色接口的音频连接器外放,大家不妨把这个例程当做一个实战小项目,同样的在编码之前我们来一起读一读WM8731的芯片手册,下面请朋友们跟随笔者的脚步,化难为易,化整为零从64页繁琐的手册中整理出程序设计方面关键性信息。

       如图2所示是WM8731的功能概述和典型应用,大家可以清楚地看到WM8731是一款高效的耳机驱动芯片,其中给出了一些关键性的规格指标,包括了SNR信噪比参数、模数和数模转换的电压范围和采样频率、主从模式配置、芯片封装类型等,广泛应用在MP3、多功能耳机、录音机等产品上。

图2 WM8731的功能概述和典型应用

        如图3所示是WM8731的内部结构和引脚说明这里可以对照图1中所示的原理图,其中关键的部分笔者都用了红框进行标记,对于本例程的功能实现,实际上我们关心的只需要去关注3个部分即可,即结构图中的1处的初始化配置控制接口,2处的语音数据到音频信号数模DAC转换接口,3处的音频连接器耳机输出接口,分别对应引脚图中6处的CSB、MODE、SCLK、SDIN,4处的BCLK、DACDAT、DACLRC、ADCDAT、ADCLRC以及5处的LHPOUT和RHPOUT。

 

图3 WM8731的内部结构和引脚说明

      对照上述3个关键点,我们再去带着问题在手册中寻找关键的信息,首先第一点初始化模式配置上,细心的同学不难发现图7-3中包含了4个相关引脚即CSB、MODE、SCLK、SDIN,注意到手册里指出WM8731初始化配置中支持三线制和二线制两种模式。

       如图4所示是WM8731的三线制和二线制配置时序逻辑示意图,大家可以看出在PCB设计上只需要把MODE引脚下拉到地接低电平即默认为二线制配置方式,而把MODE引脚上拉到电源接高电平即默认为三线制配置方式,三线制的通信模式类似SPI通信,二线制的通信模式则类似IIC通信,为了节约豌豆开发板的引脚,在硬件设计上选择了二线制通信方式,即把MODE引脚接地为低电平,同时不难看出CSB引脚在二线制的通信模式下不起任何作用,接地或者不接都可以。

 

图4 WM8731的三线制和二线制配置时序逻辑示意图

      其次我们需要去关注5个核心引脚即BCLK、DACDAT、DACLRC、ADCDAT、ADCLRC,注意到如上图2的芯片概述所示,WM8731芯片内部ADC和DAC的采样频率是8KHz到96KHz可调的,同时对应的可转换数据长度也是16-32位可调的。

      再次芯片又有I2S、Left justified、Right justified、DSP/PCM四种数字音频接口模式和主从时钟模式可供用户选择,并且这些模式的配置都是通过WM8731芯片内部11个寄存器初始化而来的。

       在分析完这些关键信息后,我们再带着问题到数据手册里去逐一寻找答案,如图5所示是WM8731在主从时钟模式下的接口连接示意图,注意到在主时钟模式下BCLK(数字音频的位时钟)、ADCLRC(ADC数字音频信号输出)、DACLRC(DAC采样左/右声道信号)都是由WM8731端产生给到SOC芯片,而相反的在从时钟模式下这三个信号都由SOC芯片产生去给到WM8731端,所以为了简化设计,我们可以选择配置成主时钟模式,由WM8731端去产生BCLK、ADCLRC、DACLRC三个信号,而FPGA端则用一个快时钟去实时检测这些信号的上升沿或者下降沿,再去进一步地实现采集数据或者发送数据等处理。

 

 图5 WM8731在主从时钟模式下的接口连接示意图

        如图6所示是WM8731在四种数字音频接口模式下的说明,结合手册里的这段核心说明来为大家简要地去解读BCLK、DACDAT、DACLRC、ADCDAT、ADCLRC这5个引脚的作用。

      首先WM8731芯片支持四种数字音频接口模式即I2S、Left justified、Right justified、DSP/PCM,其对应的时序逻辑会马上逐一展开介绍。

        其次对于ADC的采样,注意到手册上的描述:数字音频接口从内部ADC数字滤波器获取数据并将其置于ADCDAT引脚上输出,所以ADCDAT上产生的是左声道和右声道复用在一起的数字音频数据流,ADCLRC则是控制ADCDAT上是否存在左声道或右声道数据,并且ADCDAT上产生的数据流与BCLK时钟同步。

        简而言之即ADCDAT引脚上采集了音频接口输入端产生的模拟信号并把其转换为音频数据流,ADCLRC在不同模式下控制了ADCDAT上产生的是左声道和右声道数据流,BCLK则作为同步时钟同步了ADCDAT引脚上的输出数据。

       再次对于DAC的变换,和ADC的采样大同小异,数字音频接口还接收内部DAC数字滤波器的数字音频数据,也是左声道和右声道复用在一起的数字音频数据流,同样的也需要DACLRC指示左声道和右声道,以及BCLK时钟同步DACDAT上的输入数据,将其通过音频接口输出端外放。

       最后我们还需要注意到一点即四种模式下都是MSB即高比特位先操作,且一次操作数据位是16-32位,而在Right justified模式下明确标注是不支持32位数据的。

图6 WM8731在四种数字音频接口模式下的说明

       如图7所示是WM8731在Left justified模式下的时序逻辑图,可以看到手册上对于该模式的描述为:Left Justified mode is where the MSB is available on the first rising edge of BCLK following a ADCLRC or DACLRC transition,对照图片和描述很容易理解到,即在Left justified模式下,ADCLRC或者DACLRC传输数据的最高位在BCLK第一个上升沿有效,且ADCLRC或者DACLRC为高电平时代表左声道,为低电平时代表右声道。

图7 WM8731在Left justified 模式下的时序逻辑图

       如图8所示是WM8731在I2S模式下的时序逻辑图,可以看到手册上对于该模式的描述为:I2S mode is where the MSB is available on the 2nd rising edge of BCLK following a DACLRC or ADCLRC transition,对照图片和描述很容易理解到,即在I2S模式下,ADCLRC或者DACLRC传输数据的最高位在BCLK第二个上升沿有效,且ADCLRC或者DACLRC为高电平时代表右声道,为低电平时代表左声道。

图8 WM8731在I2S模式下的时序逻辑图

       如图9所示是WM8731在Right justified模式下的时序逻辑图,可以看到手册上对于该模式的描述为:Right Justified mode is where the LSB is available on the rising edge of BCLK preceding a DACLRC or ADCLRC transition, yet MSB is still transmitted first,对照图片和描述很容易理解到,即在Right justified模式下,ADCLRC或者DACLRC传输数据的最低位在BCLK上升沿可用,同样也是最高位先被发送,且ADCLRC或者DACLRC为高电平时代表左声道,为低电平时代表右声道。

图9 WM8731在Right justified模式下的时序逻辑图

       如图10所示是WM8731在DSP/PCM模式下的时序逻辑图,可以看到手册上对于该模式的描述为:In DSP/PCM mode, the left channel MSB is available on either the 1st (mode B) or 2nd (mode A) rising edge of BCLK (selectable by LRP) following a rising edge of LRC. Right channel data immediately follows left channel data. Depending on word length, BCLK frequency and sample rate, there may be unused BCLK cycles between the LSB of the right channel data and the next sample,对照图片和描述很容易理解到,即在DSP/PCM模式下,又细分为A和B两种模式,这种模式相对于前三种模式更加灵活,操作数字音频接口可方便地支持不同的采样率和字长,也就是说根据字长、BCLK频率时钟以及所配置的采样率,右通道数据的最低位和下一个采样之间可能存在多个没有使用到的BCLK周期。

       同时应该注意到图10的手册下方的标注:In all modes DACLRC and ADCLRC must always change on the falling edge of BCLK, refer to Figure 26, Figure 27, Figure 28, Figure 29 and Figure 30,即在所有的模式下DACLRC和ADCLRC必须始终在BCLK下降沿变化,这也是后续程序设计中的一项参考点。

图10 WM8731在DSP/PCM模式下的时序逻辑图

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wandou0511/article/details/128070277

【学习分享】0、创龙 tms320c6748开发例程使用手册_tronlong818的博客-爱代码爱编程

如果需要从头开始进行本使用手册的阅读,欢迎阅读本博其他文章(见置顶或文章结尾)        由广州创龙自主研发的SOM-TL6748核心板是基于TI TMS320C6748定点/浮点DSP核心板,55mm*33mm,仅硬币大小,功耗小、成本低、性价比高。采用沉金无铅工艺的6层板设计,专业的PCB Layout保证信号完整性的同时,经过严格的质量控制,通

OMAPL138 + SPARTAN6 DSP+ARM+FPGA开发例程-爱代码爱编程

目 录 本例程基于信迈OMAPL138+SPARTAN6评估板开发。   开发板准备 16 查看仿真器驱动是否正常安装 17程序加载和烧写 19 基于仿真器的程序加载和烧写 19 设置工程配置文件信息 19测试仿真器是否正常连接 20加载 GEL 文件 21CCS 连接开发板 CPU 22查看 CPU 版本号 23加

i.MX6ULL系统移植:uboot移植1 - 编译官方uboot-爱代码爱编程

NXP官方uboot编译,主要参考《i.MX Porting Guide》文档。按文档中方法进行编译测试。 一、下载NXP 官方uboot uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 二、将uboot 拷贝到ubuntu onlylove@ubuntu:~/linux/uboot/nxp_uboot$ ls

sd_card_audio-爱代码爱编程

我们在前文中讲过一个关于audio的例程,它主要完成了录制播放功能(直接从SDRAM中写/读数据),而本文相较之前的例程有两处不同,第一处:本例程是从SD卡中读取数据;第二处:本例程添加了文件检索功能(但是并没有添加文件系统)。关于第一处我们没有太多问题,因为在之前关于SD卡的读写已经详细讲解过了,那么第二处的文件检索就成为了重中之重,在没有文件系统的情况

SD卡读取BMP图片显示例程-爱代码爱编程

在前面的实验中我们练习了SD卡读写,VGA视频显示等例程,本实验将SD卡里的BMP图片读出,写入到外部存储器,再通过VGA、LCD等显示。在前面的实验中我们在VGA上显示的是彩条,是FPGA内部产生的数据,本实验将彩条替换为SD内的BMP图片数据,但是SD卡读取速度远远不能满足显示速度的要求,只能先写入外部高速RAM,再读出后给视频时序模块显示。  

努力更新技术博客,赠人玫瑰手留余香-爱代码爱编程

       一晃眼已经离开学校工作了第四个年头,从懵懵懂懂地走上嵌入式研发这条道路,到一路上磕磕绊绊不断在成长和收获,写一篇博客给曾经的自己,也写给更多在校读书的同学们和准备在这条道路上一起深耕的朋友们。        可能大家都会有这种类似的感觉,在学校的时候会接触到很多网络学习资料,现在学习资源比起几年前,甚至十几年前可以说丰富了很多,各种琳琅满目

FPGA 20个例程篇:6.EEPROM的任意地址读写断电存储-爱代码爱编程

三、数据断电存储,工程必备 6.EEPROM的任意地址读写断电存储         在FPGA 20个例程专栏的第三章节里,我们将围绕Eeprom,Qspi-Flash和Sd卡的读写时序逻辑设计展开,这也是实际项目开发当中所必备的,可能专栏里第一个章节比较基础,通过按键、点灯、蜂鸣器找到些编码的感觉,第二章节通过UART SPI IIC来展开,主要为了

【2022集创赛】安谋科技杯三等奖:基于arm处理器的无线soc设计_极术社区的博客-爱代码爱编程

本篇文章是2022年第六届全国大学生集成电路创新创业大赛安谋科技杯三等奖作品分享,参加极术社区的**【有奖征集】分享你的2022集创赛作品,秀出作品风采**活动。 团队介绍 参赛单位:厦门大学 队伍名称:产教融

nios烧写到epcs的问题处理_gzc0319的博客-爱代码爱编程

原理图如下图,板卡FPGA同时使用2片flash配置芯片,左侧M25P64即EPCS64。2片flash配置芯片使用相同的SPI总线。  在不使用nios的quartus工程中,使用jtag烧写jic的方式固化程序到EPCS64,始终正常。 近期使用含有nios的quartus工程,发现无论是使用Nios® II Flash Programmer还

vivado下按键实验_向兴的博客-爱代码爱编程

Vivado下按键实验 1,按键硬件工作原理 1.1,FPGA开发板原理图 1.2,程序设计 2,RTL代码设计

fpga学习-vivado软件的使用_丸子的蓝口袋的博客-爱代码爱编程

FPGA学习-vivado软件的使用 1.杂谈2. vivado新建工程 1.杂谈 又被封了7天。 正好封控前领导让我改下fpga代码,趁这个机会好好学习下,虽然在这块一片空白,但是毕竟这块是我的短板,一个不

verilog高级知识点_fpga代码中input能被赋值吗-爱代码爱编程

一、阻塞和非阻塞        阻塞和非阻塞也是FPGA经常会遇到的概念,不仅仅在信号的赋值时候会出现,也经常在Xilinx IP核配置中出现,所以笔者想在这里把这个概念阐述清楚,方便大家对后续程序编写和IP核配置上的理解。 阻塞赋值(Blocking)         阻塞顾名思义,就是说后面的语句会受到前面的语句的影响,通俗的说就是如果在一条阻塞

fpga20个例程专栏介绍_fpga例程-爱代码爱编程

             通过“FPGA基础知识”专栏的实践学习,相信朋友们已经踏上了有趣的FPGA学习之路,掌握了一些必备的FPGA基础知识、开发工具、代码技巧等等,是一个进阶提升的好契机,这里闲话不多说,开门见山笔者结合实际的项目工程经验,精心准备了20个经典的例程。        从例程选取、章节安排、文档说明、代码规范、工程实践等多个方面,笔者

fpga 20个例程篇:8.sd卡任意地址的读写_micro sd 读写时序-爱代码爱编程

三、数据断电存储,工程必备 8.SD卡任意地址的读写         SD卡作为最常见的外设之一,本身也是一种基于半导体快闪记忆器的新一代记忆设备。它具有体积小、传输速度快、支持热插拔等优点,在便携式装置领域得到了非常广泛的应用,例如数码相机、多媒体播放器、笔记本电脑、行车记录仪等等都能看到它的身影,相比EEPROM和FLASH而言,SD卡具有断电存储