在最后一章里,我们来做几个实战项目,一方面是对前面学习知识的一种回顾,另一方面这几个小项目也非常贴近实际工程,其中例程“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模式下的时序逻辑图