1、实验13 MCS-51与SPI串行接口语音芯片连接,一、实验目的 二、实验设备与器材 三、实验电路 四、实验原理(ISD4000系列语音芯片简介)五、实验内容、过程及要求,一、实验目的(1) 理解SPI串行总线传输协议。(2) 理解ISD4000系列语音芯片的工作原理以及其放音、录音的控制过程。(3) 理解MCS-51与SPI总线外设(如ISD4000系列语音芯片)的硬件连接、读/写方式。,二、实验设备与器材仿真器及其附件、图1所示的实验电路板各一套。,三、实验电路本实验仅仅涉及实验板上的U101、U103、U104、U401(ISD4002语音芯片)、U404(集成功率放大器),而与其他元器
2、件无关。接通电源前,将JP103的1-2引脚短路,使ISD4002语音芯片的中断输出端引脚与MCS-51外中断(P3.2)引脚相连。由于多数MCS-51芯片没有内置的SPI串行总线接口部件,因此只能用软件模拟SPI总线时序方式读/写SPI总线接口器件。,四、实验原理(ISD4000系列语音芯片简介)ISD4000系列语音芯片包括ISD4002、ISD4003、ISD4004三个子系列芯片,电源电压为3 V,单片录音时间在216分钟之间。音质中上,它们被广泛应用于公共汽车语音报站系统、移动及自动应答电话设备、语音复读机等电子产品中。,该系列语音芯片采用CMOS工艺,内含振荡器、防混淆滤波器、平滑
3、滤波器、音频放大器、自动静噪及高密度多电平Flash ROM存储器阵列。通过串行通信接口(SPI或Microwire总线协议)与微控制器(如MCS-51芯片)相连,所有操作均由微控制器控制。内部采用多电平直接模拟量存储技术,每个采样值直接存储在片内Flash ROM存储器中,因此能逼真、自然地再现语音、音乐、音调等声响效果,避免了一般固体录音电路因量化和压缩造成的量化噪声和“金属声”。可选4.0,5.3,6.4,8.0 kHz等多个采样频率。采样频率越低,录放时间就越长(但音质会略有下降),片内信息存放在Flash ROM存储器中,在断电状态下可保存100年(典型值),能反复录音10万次以上。
4、,1主要参数,表13-1 主 要 参 数,2封装及引脚排列ISD4000系列语音芯片采用28引脚TSOP、PDIP或SOIC封装方式,其中PDIP或SOIC封装方式引脚排列如图13-1所示。引脚功能如下:VCCD:芯片内部数字电路电源引脚。VSSD:芯片内部数字电路地线引脚。VCCA:芯片内部模拟电路电源引脚。VSSA:芯片内部模拟电路地线引脚。,图13-1 PDIP或SOIC封装引脚排列,为了减小噪声,芯片内部模拟、数字电路具有各自的电源、地线总线,以方便在印制板上实现数字、模拟电路电源和地线分开走线,形成单点接地的布线规则。ANA IN+、ANA IN-:分别是录音输入放大器的同相输入端和
5、反相输入端。输入放大器可用单端或差分方式驱动。采用单端驱动时,信号由耦合电容输入,最大为32 mV(峰-峰值)。耦合电容与本端内部的3 k串联电阻构成的输入阻抗决定了芯片频带的低端截止频率。采用差分驱动时,最大为16 mV(峰-峰值)。,XCLK:外部采样时钟输入端,可选的采样频率如表13-1所示。一般使用芯片内部采样频率(在出厂前已调校,误差在+1%以内),除非对采样精度要求很高。当不用外部采样时钟信号时,XCLK引脚必须接地。 AM CAP:自动静噪输入端。当录音信号电平下降到内部设定的某一阈值以下时,自动静噪功能使信号衰弱,这样有助于养活无信号(静音)时的噪声。一般情况下,该引脚对地接1
6、 F电容,构成内部信号电平峰值检测电路的一部分。检出的峰值电平与内部设定的阈值作比较,决定自动静噪功能的翻转点。大信号时,自动静噪电路不衰减,静音时衰减6 dB。1 F电容也影响自动静噪电路对信号幅度的响应速度。当AM CAP引脚接VCCA时,则禁止自动静噪。,AUD OUT:音频输出,可驱动5 k的负载。MOSI:命令及数据信息的串行输入端。MIS0:状态信息的串行输出端。SCLK:串行时钟输入端,由SPI总线主设备(一般为MCU)提供。:片选信号输入端,输入,低电平有效。当片选信号无效时,芯片处于待用状态,静态电流典型值为1 A。,:中断输出端,漏极开路(OD)输出,低电平有效。在放音(包
7、括快进)、录音操作过程中,遇到到段结束(EOM)、存储器末尾(OVF)时, 引脚输出低电平并保持,直到SPI总线主设备向ISD芯片写入新的命令。 RAC:行地址时钟输出端,漏极开路(OD)。每个RAC周期表示ISD存储器的操作进行了一行(ISD4003系列中的存储器有1200行)。该信号高电平时间为200 ms,低电平时间为25 ms。快进模式下,RAC的218.75 s是高电平,31.25 s是低电平。该端可用于存储管理技术。,3控制命令及SPI端口控制寄存器位ISD4000系列语音芯片控制命令如表13-2所示,SPI端口控制寄存器位含义如图13-2所示。,表13-2 控 制 命 令,图13
8、-2 SPI端口控制寄存器位及含义,1) 放音过程(1) 执行上电命令(POWER UP)。(2) 延迟等待,上电结束(当采样频率为8 kHz时,上电延迟时间约为25 ms)。(3) 执行“SET PLAY”命令,设置放音段起始地址。录音、放音段起始地址与每段最短时间及放音长度有关。例如,对ISD4002-120芯片来说,最多有600段(段地址编号为000599),每段最短录音时间为200 ms。如果每段记录一个单音,长度为400 ms(即每个单音占用两段),则第n个单音对应的段地址为(n2)。,2) 录音过程(1) 执行上电命令(POWER UP)。(2) 延迟等待,直到上电结束(当采样频率
9、为8 kHz时,上电延迟时间TPUD约为25 ms)。(3) 再执行上电命令(POWER UP)。(4) 延迟两倍上电等待时间(即延迟2TPUD时间)。(5) 执行“SET REC”命令,设置录音段的起始地址。执行“REC”命令,从当前地址开始录音,直到出现存储器末尾标志OVF信号。,在录音过程中,未录到存储器末尾时,就执行“STOP”或“STOP WRDN”命令,将终止当前录音操作,并产生EOM标志。因此,可利用这一特性在芯片上录制多段语音信息。可见,录音过程与放音过程相似,只是每次录音操作操作只能录一段,如图13-3(b)所示。,图13-3 放音、录音流程 (a) 放音流程;(b) 录音流
10、程,4SPI总线接口时序及命令格式芯片支持8位、16位命令格式,传输时序如图13-4所示,ISD4000系列语音芯片SPI总线参数如表13-3所示。,表13-3 ISD4000系列语音芯片SPI总线参数,图13-4 命令格式 (a) 传输时序;(b) 8位命令格式;(c) 16位命令格式,图13-4 命令格式 (a) 传输时序;(b) 8位命令格式;(c) 16位命令格式,图13-4 命令格式 (a) 传输时序;(b) 8位命令格式;(c) 16位命令格式,从ISD4000系列语音芯片SPI总线时序可以看出:其SPI总线时序与SPI总线接口存储器EEPROM 25C01/02/04兼容。在接收
11、控制命令时,先接收LSB(这要求SPI总线控制器先输出LSB);空闲时,SCLK为低电平,在SCLK上升沿锁存MOSI引脚上的信息。,5典型应用电路及与MCS-51的连接MCS-51芯片一般没有内置SPI总线部件,可通过软件方式模拟SPI总线操作时序控制ISD4000系列语音芯片的操作,典型连接线路如图13-5所示。,图13-5 与MCS-51芯片的典型连接,6参考驱动程序根据图13-5的连接方式,下面给出了与SPI模拟总线驱动程序、组合播放、从指定段连续播放、单段录音有关的参考程序段。 MOSI BIT P1.5 MISO BIT P1.6 SCLK BIT P1.7 ISDSS BIT P
12、1.4 ;片选信号 MIC_C BIT P1.3 ;功放电源控制,同时也作放音/录音标志(0-放音、1-录音),ISDBUF DATA 50H ;ISD语音芯片命令缓冲区;50H单元存放命令码(C4C0)及段高3位地址(A10A8);51H单元存放段低8位地址(A7A0) ISDBUFSP DATA 52H ;播放指针 TASK3 DATA 53H ;语音播放状态,b2b0记录放音或录音状态 ISDTIME DATA 54H ;语音播放延迟时间 XmtDat DATA 60H ;段缓冲区 RECNO EQU 0F0H ;可录音的最小段号 ;初始化外中断INT0SETB IT0 ;下降沿触发(采
13、用查询方式检测),;从指定段连续播放初始化CLR MIC_C ;设置放音标志MOV ISDBUFSP,#0 ;设置播放的起始段号MOV TASK3,#05H ;启动标志(未上电标志) HERE1:LCALL ISD_RD_A ;调用逐段播放过程MOV A,TASK3CJNE A,#0,HERE1SJMP $ ;虚拟等待,;段组合播放初始化 ;把待播放的段编号(一次最多可播放16段)装入播放缓冲区内 ;当待播放的段号不足16时,在播放段后放0FFH,作为结束标志 MOV R0,#XmtDat MOV R0,#02h ;初始化语音段缓冲区 INC R0 MOV R0,#01H INC R0 MOV
14、 R0,#22h,INC R0CLR MIC_C ;设置放音标志MOV ISDBUFSP,#0 ;初始化播放指针;段组合播放启动MOV TASK3,#05H ;启动标志(未上电标志) HERE2:LCALL ISD_RD ;调用段组合播放过程MOV A,TASK3CJNE A,#0,HERE2 SJMP $ ;虚拟等待,;单段录音初始化MOV R0,#XmtDatMOV R0,#xxh ;段地址送缓冲区首字节INC R0MOV R0,#xx ;录音时间送缓冲区第二字节SETB MIC_C ;设置录音标志;单段录音过程启动MOV TASK3,#05H ;启动标志(未上电标志) HERE3:LCA
15、LL ISD_WR ;调用单段录音过程MOV A,TASK3CJNE A,#0,HERE3 SJMP $ ;虚拟等待,;把语音缓冲区语音段送IDS4000芯片播放子程序 PROC ISD_RD ;入口参数:TASK3置为05H;b2b0记录放音或录音状态;000-空闲;001-执行上电延迟(25 ms);010-段播放延迟;011-段间延迟;101-未上电标志 ISD_RD:JNB MIC_C,RUN;录音状态,不执行!JMP EXIT ;退出,RUN:MOV A,TASK3ANL A,#07H ;保留标志位b2b0CJNE A,#000B,NEXT1;b2b0为000,空闲JMP EXIT
16、;退出 NEXT1:CJNE A,#101B,NEXT2;b2b0为101,未上电,先执行上电操作;执行“POWER UP” (上电)命令MOV R0,#ISDBUF ;语音命令缓冲首地址送R0,MOV R0,#20H ;00100XXX,执行上电操作LCALL SPIBW ;调用SPI总线控制命令写入子程序MOV ISDTIME,#5 ;延迟时间为55 ms(即25 ms)MOV TASK3,#1 ;进入上电延迟状态JMP EXIT NEXT2:CJNE A,#001B,NEXT3;b2b0为001,处于上电延迟期间,检查延迟时间 NEXT30:MOV A,ISDTIMEJZ NEXT31,
17、;不是0,上电延迟时间未到,等待SJMP EXIT NEXT31:MOV A,#XmtDatADD A,ISDBUFSPMOV R0,AMOV A,R0 ;取出待放音段编号MOV B,#2 ;假设每一单音占用两个最小段MUL AB ;计算段首地址MOV R0,#ISDBUF+1 ;语音命令缓冲首地址送R0MOV R0,A ;段地址低8位送命令缓冲DEC R0MOV A,B ;段地址高位送A,ORL A,#11100000B ;形成地址控制码11100(SET PLAY) MOV R0,A ;命令码送命令缓冲区 LCALL SPIBW ;调用SPI总线控制命令写入子程序 ;执行PLAY命令 MO
18、V R0,#ISDBUF ;语音命令缓冲首地址送R0 MOV A,#0F0H ;11110XXX,执行PLAY/REC命令 MOV R0,A ;命令码送命令缓冲区 LCALL SPIBW ;调用SPI总线控制命令写入子程序 ;开始放音 MOV TASK3,#02H ;b2b0置为010态(修改作业号) CLR IE0 ;清除INT0中断标志(采用查询方式确定段播放是否已结束)SJMP EXIT,NEXT42:JC NEXT43;指针大于或等于16,缓冲区所有段已播放结束SJMP NEXT441 NEXT43:MOV A,#XmtDatADD A,ISDBUFSPMOV R0,AMOV A,R0
19、 ;取出将要播放的段编号CJNE A,#0FFH,NEXT44;尽管指针小于16,但缓冲区内已经没有需要播放的段号,NEXT441:MOV R0,#ISDBUF ;语音命令缓冲首地址送R0MOV R0,#10H ;0001X XXX,执行STOP WRDN命令,停止当前操作LCALL SPIBW ;调用SPI总线控制命令写入子程序SETB MIC_C ;关闭功率放大器电源MOV TASK3,#0 ;将b2b0置为000,结束播放SJMP EXIT NEXT44:MOV TASK3,#3 ;进入段间延迟状态MOV ISDTIME,#8 ;延迟时间为85 ms(即40 ms)SJMP EXIT,N
20、EXT4:CJNE A,#3,EXIT;b2b0处于011态,属于段间延迟JMP NEXT30 ;处理方式与上电延迟相同 EXIT:RET END;把IDS4000语音芯片内的语音段逐一播放出来 PROC ISD_RD_A;入口参数:TASK3置为05H,;b2b0记录放音或录音状态;000-空闲;001-执行上电延迟(25 ms);010-段播放延迟;011-段间延迟;101-未上电标志 ISD_RD_A:JNB MIC_C,RUN;录音状态,不执行!JMP EXIT ;退出,RUN:MOV A,TASK3ANL A,#07H ;保留标志位b2b0CJNE A,#000B,NEXT1;b2b
21、0为000,空闲JMP EXIT ;退出 NEXT1:CJNE A,#101B,NEXT2;b2b0为101,未上电,先执行上电操作;执行“POWER UP” (上电)命令MOV R0,#ISDBUF ;语音命令缓冲首地址送R0MOV R0,#20H ;00100XXX,执行上电操作,LCALL SPIBW ;调用SPI总线控制命令写入子程序MOV ISDTIME,#5 ;延迟时间为550 ms(即25 ms)MOV TASK3,#1 ;进入上电延迟状态JMP EXIT NEXT2:CJNE A,#001B,NEXT3;b2b0为001,处于上电延迟期间 NEXT30:MOV A,ISDTIM
22、EJZ NEXT31;不是0,上电延迟时间未到SJMP EXIT ;退出,继续等待,NEXT31:MOV A,ISDBUFSPMOV B,#2 ;假设每一单音占两个最小段MUL AB ;计算段首地址MOV R0,#ISDBUF+1 ;语音命令缓冲首地址送R0MOV R0,A ;段地址低8位送命令缓冲区DEC R0MOV A,B ;段地址高位送AORL A,#11100000B ;形成地址控制码11100(SET PLAY)MOV R0,A ;命令码送命令缓冲区LCALL SPIBW ;调用SPI总线控制命令写入子程序;执行PLAY命令MOV R0,#ISDBUF ;语音命令缓冲首地址送R0,M
23、OV A,#0F0H ;11110XXX,执行PLAY命令MOV R0,A ;命令码送命令缓冲区LCALL SPIBW ;调用SPI总线控制命令写入子程序;开始放音MOV TASK3,#02H ;b2b0置为010态(修改作业号)CLR IE0 ;清除INT0中断SJMP EXIT NEXT3:CJNE A,#2,NEXT4;b2b0处于010态,属于段播放期间延迟JB IE0,NEXT41;INT0中断无效,即未遇到EOF或VOFSJMP EXIT ;等待,NEXT41:CLR IE0 ;清除INT0中断INC ISDBUFSP ;指针加1MOV A,ISDBUFSPCJNE A,#0F0H
24、,NEXT42 NEXT42:JC NEXT43;指针大于等于F0H,退出MOV R0,#ISDBUF ;语音命令缓冲首地址送R0MOV R0,#10H ;0001X XXX,执行STOP WRDN命令,停止当前操作LCALL SPIBW ;调用SPI总线控制命令写入子程序SETB MIC_C ;关闭功率放大器电源,MOV TASK3,#0 ;将b2b0置为000,结束播放SJMP EXIT NEXT43:MOV TASK3,#3 ;进入段间延迟状态MOV ISDTIME,#10 ;延迟时间为105 ms(即50 ms)SJMP EXIT NEXT4:CJNE A,#3,EXIT;b2b0置为
25、011 ;属于段间延迟JMP NEXT30 ;处理方式与上电延迟相同 EXIT:RET END,;从指定地址开始录音(单段录音) PROC ISD_WR ;从指定地址开始录音(单段录音) ;入口参数:TASK3置为05H;b2b0记录放音或录音状态;000-空闲;001-执行上电延迟(25 ms);010-录音过程的再上电延迟;011-录音延迟;101-未上电标志 ISD_WR:JB MIC_C,RUN;非录音状态,不执行!JMP EXIT,RUN:MOV A,TASK3ANL A,#07H ;保留标志位b2b0CJNE A,#00H,NEXT1;b2b0为000,空闲JMP EXIT NEX
26、T1:CJNE A,#101B,NEXT2;b2b0为101,未上电,先执行上电操作;执行“POWER UP” (上电)命令MOV R0,#ISDBUF ;语音命令缓冲首地址送R0MOV R0,#20H ;00100XXX,执行上电操作,LCALL SPIBW ;调用SPI总线控制命令写入子程序MOV ISDTIME,#5 ;延迟时间为55 ms(即25 ms)MOV TASK3,#1 ;进入上电延迟状态JMP EXIT NEXT2:CJNE A,#001B,NEXT3;b2b0为001,处于上电延迟期间MOV A,ISDTIMEJZ NEXT31;不是0,上电延迟时间未到SJMP EXIT
27、;退出,继续等待,NEXT31:;再执行“POWER UP” (上电)命令MOV R0,#ISDBUF ;语音命令缓冲首地址送R0MOV R0,#20H ;00100XXX,执行上电操作LCALL SPIBW ;调用SPI总线控制命令写入子程序MOV ISDTIME,#10 ;延迟时间为105 ms(即50 ms)MOV TASK3,#2 ;进入再上电延迟状态(时间50 ms)SJMP EXIT ;退出,NEXT3:CJNE A,#010B,NEXT4;b2b0为010,处于再上电延迟期间MOV A,ISDTIMEJZ NEXT41;不是0,再上电延迟时间未到SJMP EXIT ;退出,继续等
28、待,NEXT41:MOV R0,#XmtDatMOV A,R0CJNE A,#RECNO,NEXT42 NEXT42:JNC NEXT43;小于允许录音段地址,关闭电源退出SJMP NEXT51,NEXT43:MOV B,#2 ;假设前面每一单音占用两个最小段MUL AB ;计算段首地址MOV R0,#ISDBUF+1 ;语音命令缓冲首地址送R0MOV R0,A ;段地址低8位送命令缓冲区DEC R0MOV A,B ;段地址高位送AORL A,#10100000B ;形成地址控制码10100(SET REC)MOV R0,A ;命令码送命令缓冲区LCALL SPIBW ;调用SPI总线控制命令
29、写入子程序;执行REC命令MOV R0,#ISDBUF ;语音命令缓冲首地址送R0,MOV A,#0B0H ;10110XXX,执行REC命令MOV R0,A ;命令码送命令缓冲区LCALL SPIBW ;调用SPI总线控制命令写入子程序;从指定地址开始录音MOV TASK3,#03H ;b2b0置为011态(修改作业号)MOV R0,#XmtDat+1 ;取录音时间MOV ISDTIME,R0 ;录音时间送计时单元CLR IE0 ;清除INT0中断SJMP EXIT,NEXT4:CJNE A,#3,EXIT;b2b0为011,处于录音等待期间JB IE0,NEXT51 ;INT0中断有效,即
30、遇到VOF;检查延迟时间是否为0?MOV A,ISDTIMEJZ NEXT51 ;录音已经结束SJMP EXIT ;录音尚未结束,退出!,NEXT51:CLR IE0 ;清除中断MOV R0,#ISDBUF ;语音命令缓冲首地址送R0MOV R0,#10H ;0001X XXX,执行STOP WRDN命令,停止当前操作LCALL SPIBW ;调用SPI总线控制命令写入子程序SETB MIC_C ;关闭功率放大器电源MOV TASK3,#00 ;将b7、b6置为00,结束播放 EXIT:RET END ;控制命令送ISD4000语音芯片(16位命令格式) PROC SPIBW ;SPI总线控制
31、命令写入子程序,;入口参数:16位命令码(两字节)存放在ISDBUF缓冲区内 ;出口参数:无 ;使用资源:R0、R6、R7及ACC、PSW、DPTR(使用进位标志C) SPIBW:CLR EACLR SCLK ;空闲时SCLK处于高电平,以减小功耗。而ISD采用正极性SCLK脉冲头。因此,在片选信号SS为低电平前应先将SCLK置为低电平CLR ISDSS ;片选信号为低MOV R0,#ISDBUF+1 ;取命令码低位字节MOV R6,#2 ;传送两字节,LOOP2:MOV A,R0MOV R7,#08H ;移动次数 LOOP1:RRC A ;带Cy右移MOV MOSI,C ;CPU输出数据SE
32、TB SCLK ;利用SCLK上升沿锁存输入的数据NOP ;由于SCLK信号时钟频率最高为1 MHz,即高低电平时间必须大于400 s,可根据晶振频率插入02条NOP指令(对于晶振频率在12 MHz以内时,不用),CLR SCLK ;时钟信号为低电平DJNZ R7,LOOP1DEC R0 ;指针减1,指向下一字节DJNZ R6,LOOP2SETB ISDSS ;执行结束后将SS引脚置为高电平SETB SCLK ;空闲时SCLK处于高电平,以减小功耗SETB EARET END,五、实验内容、过程及要求(1) 写出ISD4002语音芯片的读/写控制程序。要求:逐段播放实验板上ISD4002语音芯片内已录好的语音信息。(2) 在空白处录制5 s左右的语音信息。(3) 在实验9(1)的基础上,实现每按下一个按键时,通过语音芯片报出键名。,