基于SPI总线的语音录放系统实现131040061黄崇摘要ISD4004语音系列芯片是SPI接口,具有多次重复录放,存储时间长,使用时不需扩充存储器,所需外围电路简单等特点。本文使用ISD4004芯片在录音放音系统中的一个实际应用。笔者通过这个系统的实现,掌握了SPI总线的协议规范和编程方法。关键字:SPI总线ISD4004单片机目录1前言.............................................................................................................................................32SPI总线简介.............................................................................................................................32.1SPI总线简介....................................................................................................32.2接口信号..........................................................................................................32.3SPI接口硬件结构............................................................................................33硬件电路设计...........................................................................................................................43.1ISD4004简介...................................................................................................43.2ISD4004与单片机接口电路...........................................................................43.3录音模块电路...................................................................................................53.4放音模块电路...................................................................................................54软件设计....................................................................................................................................64.1录音程序设计..................................................................................................64.2放音程序设计..................................................................................................64.3部分工作子程序..............................................................................................64.4录音放音暂停功能的实现..............................................................................75结束语......................................................................................................................................71前言语音生成技术用于工业监控系统、自动应答系统、多媒体查询系统、智能化仪表、办公自动化系统或家用电气产品中,使它们具有语音输出功能,使之能在适当的时候用语音实时报告系统的工作状态、警告信息、提示信息或相关的解释说明等,无疑在提高人机通信能力、减少对错误处理的遗漏、提高系统性能、降低人们的工作强度等方面都有极大的好处。数字录音放音系统是将现场的语音模拟信号转变为离散的数字信号,然后存储在一定的存储介质上的一种录音方式,它也是数字语音处理技术中常用的一种方式。采用数字录音技术,有较高的效率和自动化程度,录音时间也长,并可将信息长期保存于存储介质中,同时对语音信息进行编辑整理非常方便,可快速查找。2SPI总线简介2.1SPI总线简介SPI(SerialPeripheralInterface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。它是一种符合工业标准、全双工、三线或四线通信方式的总线系统。它允许MCU与各种外围设备以串行方式进行通信。在SPI接口中,数据的传输需要一条时钟线,一条数据线和一条控制线(有些芯片需要两条控制线)。SPI可以工作在主模式下或从模式下。在主模式下每位数据发送/接收需要一个时钟周期。2.2接口信号(1)MOSI–主器件数据输出,从器件数据输入(2)MISO–主器件数据输入,从器件数据输出(3)SCLK–时钟信号,由主器件产生(4)SS–从器件使能信号,由主器件控制图2.1为SPI常见的与控制器的连接图。图2.1SPI常见的与控制器的连接图2.3SPI接口硬件结构SPI接口在内部硬件实际上是两个简单的移位寄存器,传输的数据为8位,在主器件产生的从器件使能信号和移位脉冲下,按位传输,高位在前,低位在后。如下图所示,在SCLK的上升沿上数据改变,同时一位数据被存入移位寄存器。3硬件电路设计本文讨论的语音录放系统包括单片机控制器模块、语音录放模块、键盘控制模块以及显示模块。考虑到本文主要的任务应该是讨论与系统总线相关的内容,也就是与ISD4004有关的硬件软件设计,所以下边的内容讲的主要是与SPI总线相关的内容,硬件模块包括与单片机接口模块、录音模块以及放音模块。因为ISD4004芯片在音频输入端和输出端都集成了合适的滤波器和放大器,所以实际实现起来的硬件电路非常简单。3.1ISD4004简介ISD4004语音芯片是与普通的录音/重放芯片相比,ISD4004具有如下特点:(1)记录声音没有段长度限制,并且声音记录不需要A/D转换和压缩。(2)快速闪存作为存储介质,无需电源可保存数据长达100年,重复记录10000次以上。(3)ISD4004具有记录时间长(可达16分钟,本文采用的为8分钟的ISD4004语音芯片)的优点。(4)ISD4004开发应用具有所需外围电路简单的优点,这一点从本文介绍的其在语音报站器中的实际应用中可以体会到。图3.1为ISD4004内部结构图。图3.1ISD4004内部结构图3.2ISD4004与单片机接口电路本文讨论的语音录放系统主电路主要由单片机AT89S52和ISD4004构成。该系统的硬件电路连接如图2.1所示。AT89S52单片机并没有集成SPI控制器,所以设计中必须用普通IO口来模拟,单片机的32个IO口理论上说说是可以随便连接四个的。本设计中单片机的P1.0-P1.3引脚接分别接的ISD4004的SS、SCLK、MOSI、MISO引脚,可以看出AT89S52和ISD4004之间的连接较少。图3.2ISD4004与单片机接口电路3.3录音模块电路正如前文所述,ISD4004内部集成有音频输入端的放大器和滤波器,所以这部分电路也是非常简单的。麦克风输出信号经过一个三极管放大电路输入到ISD4004中。在实践中,笔者也尝试着将此部分电路去除,直接接到ISD4004上,但是发现录音声音太小,看来此部分电路还是不能省的。图3.3录音模块电路3.4放音模块电路放音模块电路连接图如图3.4所示。LM386是一款常用的音频放大芯片,只需要简单的外围电路就能实现一个语音放大电路。本设计中放音模块电路就是把ISD4004的音频输出接到LM386放大器上,经过放大驱动喇叭发声。图中header3为一个滑动变阻器,通过改变此变阻器的阻值,可以调节输出声音的大小。图3.4放音模块电路4软件设计系统软件设计从文件的角度说,包括主程序文件、ISD4004驱动文件、功能函数文件。主程序文件调用功能函数文件提供的函数构造主程序框架,功能函数调用ISD4004文件提供的驱动函数实现录音、放音、暂停等等功能函数。ISD4004驱动文件时根据ISD4004芯片手册编写的驱动程序,包括发送启动、8位命令、发送16位命令、暂停等等相关的函数。本文主要的任务是阐述与SPI总线相关的软件设计部分,在4.3部分会详细阐述SPI总线协议的实现方法。至于系统其他的与SPI总线关联不大的软件设计本文不再过多阐述,以免淡化了主题。4.1录音程序设计发POWERUP命令;等待TPUD(上电延时);发POWERUP命令;4.等待2倍TPUD;发地址值为00的SETREC命令;发REC命令。器件便从00地址开始录音,一直到出现OVF(存贮器末尾)时,录音停止。4.2放音程序设计发POWERUP命令;等待TPUD(上电延时);发地址值为00的SETPLAY命令;发PLAY命令。器件会从此00地址开始放音,当出现EOM时,立即中断,停止放音。4.3部分工作子程序图4.1为向ISD4004发送一个八位命令的时序图。从图中可以看出,从MOSI数据线向ISD4004发送命令的同时,主机也会从MISO数据线得到8位数据。无论主机是否选择接受,ISD4004都会在主机发送命令的同时,将一组状态数据发送回来。图4.1ISD4004发送八位命令的时序图正如前文所述,由于AT89S52单片机内部没有集成SPI控制器,所以需要通过普通IO口来模拟这样的时序。虽然这带来的编程的复杂性,但是对于理解SPI总线的协议是非常有帮助的,因为实际上程序模拟了一个SPI控制器。笔者从源程序中摘出了SPI串行发送8位命令并同时接收8位数据的函数,接收的8位数据的这样一个函数见于附录。从这段代码可以看出,程序发送命令isd_cmd,同时接收一个8位的数据保存在isd_rxd。这也验证了SPI全双工通信的特征。数据在发送和接收过程中,需要通过SCLK来驱动数据流动,这样体现了SPI通信的同步特征。isd_rxd=isd_rxd1和isd_cmd=isd_cmd1这两句代码模拟了主机的移位寄存器,这也是对SPI控制器的硬件电路用软件方法的模拟实现。4.4录音放音暂停功能的实现录音放音暂停功能是非常重要的功能,一个成熟的录音放音系统是不能缺少的。ISD4004可以向主机发送当前录音放音的存储地址给系统实现这种功能提供了硬件支持。实现思路是这样的:在录音或者放音进行中,可以通过发送一个暂停命令,在停止录音放音的同时,将ISD4004会将当前录音放音的存储器地址发送给控制器。控制器在接收到这个地址后,可以从这个地址继续放音或者录音,从