| 毕业设计论文-单片机在语音播放与图片显示中的应用 |
|
[ 2008-1-4 11:58:00 | By: wozuishuai ] |
|
1
摘 要:凌阳科技公司推出的SPCE061A芯片具有语音播放的硬件条件,在软件算法上凌阳科技公司提供了大量的语音函数库可供使用,这使得语音播放很容易实现。但是SPCE061A片内的FLASH存储器只有32K,在播放大量语音资源时需要外扩存储器。本论文讨论使用凌阳科技公司的SPR4096作为外扩存储器,与SPCE061A结合播放语音。在使用SPR4096时我们通过凌阳教育推广中心新推出的ResWriter对SPR4096进行读写操作。另外,扩展SPLC501液晶作为图片显示,实现有声有色。本文详细论述了整个功能的实现,包括硬件电路与软件算法。 |
| Menu Item | 功能描述 |
| 文件/载入二进制文件 | 以Append的方式读入多个要整合的*.bin文档,作为Flash烧录的数据资料。 |
| 文件/载入以整合文件 | 读入已经整合后的*.con文檔,作为Flash烧录的数据资料。限制:一次只能读入一个,且读入前关闭已有的文件 |
| 文件/存储 | 以*.con方式保存整合后的文档 |
| 文件/退出 | 退出本软件 |
| 查看 | 显示或者隐藏Tool Bar/Status Bar/Resource View Bar等 |
| 设置/芯片型号 | 设置要烧录的芯片(SPR1024或SPR4096) |
| 设置/操作地址 | 设置对Flash操作的地址空间(Start & End Address) |
| 操作/Erase | 擦除整个Flash 中的数据 |
| 操作/Blank Check | 检查地址空间Start & End Address之间的数据是否为空白,即是否为0xFF |
| 操作/Read | 从Flash读取地址空间Start & End Address中的数据 |
| 操作/Program | 把文件Start & End Address地址间的数据写到Flash相应的地址空间中 |
| 操作/Verify | 检查Flash地址空间Start & End Address中的数据与文档中对应空间的数据是否一致 |
| 操作/Auto | 根据"烧录选项"的设置,执行相应的烧录过程 |
| 烧录选项 | 选择烧录过程:Erase -> Program -> Verify;Erase -> Program;Program -> Verify;Program Only选择后由"操作/Auto"实现 |
| 帮助 |
对文件(资源)的操作说明:
● Resource View包括索引表和读进的各个小文档标题,索引表纪录整合后文档的长度(total_file_length)、小文档的个数、各个小文档长度和某个文档段的起始地址等信息,把索引表放在开始的一段地址空间,作为烧录数据的一部分。小文档标题纪录本文档名称、起始地址和长度;
● 索引表格式:
在整合后的文件中,在正式的文件前面有索引表,方便用户使用SPR4096中的资源。索引表的开头4个字节为"SPRW"特定校验字。然后是整合后文档存放的起始地址与结束地址,分别用双字数据类型标志。接下来存放的为整合前文件的个数,用1个字来存放。然后依次为整合前文件的长度,起始地址,结束地址。具体参考2.4.4索引表。
● 在Load文档前提示用户保存当前的文档,在Load文档时检查每个文档的长度,若这些文档长度之和+索引表的长度(即整合后的文档长度:total_file_length)大于Flash的容量MaxLength(SPR1024/4096:128k/512k Bytes), 给出提示,超过MaxLength后将不能再Load文檔;
● 在Load Bin时如果文件名字与已有的文档名字冲突,不能载入;
● 在烧录操作之前需要检查硬件是否正常连接;(此条不做)
● Blank Check后给出空白的信息,检查过程中一旦踫到一个非空数据,立即结束检查,给出不是空白的信息;(空白数据:0xFF)
● Read后给出信息提示用户是否保存这段数据到*.bin文檔中,然后在Status Bar显示Check Sum;
● Program之后给出是否成功的信息,在Status Bar显示Check Sum;
● Verify后给出一致信息,校验过程中一旦踫到一个数据不一致立即结束校验,给出不一致的信息;
● 执行烧录操作功能(Blank Check、Erase、Read、Program、Verify、Auto Operation)时,有进度显示;
● 操作地址:
● Start Address默认为00000H,End Address为total_file_length (整合后的文档长度:索引表的长度+所有文档的长度),
● End Address删除某个小文档后,如果End Address < total_file_length,自动更新为total_file_length,删除某个小文档后,若total_file_length < Start Address,自动更新Start Address为00000H,
● 设置时,如果Start Address < 00000H或 Start Address > End Address时给出提示,此时不修改,End Addressss < Start Address 或 End Address > total_file_length时给出提示,此时不修改;
● 文檔中在total_file_length与MaxLength之间数据以0xFF填充,Save时不保存这部分数据;
● 关闭本软件时提示用户保存整合后的文档,以*.con方式保存。
2.4.4 索引表
为了便于使用数据,在烧录的时候要对数据文件进行索引,这样在使用的时候就可以知道数据存放在哪些地址,可以对文件进行操作。
资源索引表格式:
考虑到存储语音资源的实际使用情况,索引表包括4个字节的特定码,整合后文档的起始地址、结束地址、整合前文件的总个数、整合前每个文件的起始地址、结束地址。这些项目依次排列。4个字节的特定码为SPRW(Sunplus Read Write)的ASCII码。特定码的作用主要是从芯片读回的数据保存成文件后,在使用ResWriter工具打开时进行检测。如果文件中存在特定码说明芯片中的数据是使用ResWriter工具烧录的,这样的文件可以在ResWriter工具中正确显示,如图 2.5所示:
图 2.5 打开整合后文件图
如果没有特定码,那么芯片中的数据就不是通过ResWriter进行烧录的(SPR1024/SPR4096可以通过SPCE061A等单片机进行读写操作,也可以使用AllWriter工具进行读写操作),那么数据文件在ResWriter工具中显示是没有意义的。整合后文件的起始地址便于引用,结束地址便于检查资源是否超出存储范围。整合前文件的起始、结束地址便于直接访问整合前的文件。考虑到文件名实际用处不大,整合后资源长度可以通过结束地址与起始地址计算得出,在索引表中没有保留。
索引表格式如下:
#define DWORD long int
#define WORD unsigned int
typedef struct //整合后的文件
{
DWORD StartAddress;
DWORD EndAddress;
}CONFLILE;
typedef struct //整合前的小文件
{
DWORD length;
DWORD StartAddress;
DWORD EndAddress;
}UNCONFILE;
typedef struct //索引表
{
"SPRW" ; //特定码SPRW
CONFLILE Index1;
WORD unconfilenumber; //所有整合前小文件的个数
UNCONFILE Index2[unconfilenumber];
}INDEX;
如图 2.6所示:在地址0x00000-0x00003为4字节的特定码,在地址0x00004-0x00007为4字节的整合后文件的起始地址,在地址0x00008-0x0000B为4字节的整合后文件的结束地址,在地址0x0000C-0x0000D为2字节的整合前文件总数。然后每4字节分别为整合前第一个文件的长度、起始地址、结束地址,一直到最后一个整合前文件的长度、起始地址、结束地址。索引表结束,然后是文件的数据。
图 2.6 索引表图示
举例说明:如图 2.7所示:53、50、52、57为特征码SPRW的ASCII码。00 00 00 3E为整合后文件的起始地址,00 00 A2 CF 为整合后文件的结束地址,00 04 为整合前文件的总个数,本例中为4个文件,再接下来每4个字节为一组分别为整合前第一个文件的长度、起始地址、结束地址,整合前第二个文件的长度、起始地址、结束地址……索引表结束,然后是文件的数据,如图蓝色部分为文件数据的开始。
图 2.7 举例说明索引表图
2.5 SPLC501模组简介
由于SPLC501模组是大学计划推出的较早的模组,如果读者对这个模组的使用存在问题可以到凌阳大学计划网站www.unsp.com.cn下载相关资料参考。
3 系统总体方案介绍
系统的结构框图如图 3.1所示。
图 3.1 系统的结构框图
在声音的处理上主要采用凌阳科技的语音压缩格式,将需要播放的声音压缩存在SPR模组里面,然后通过61板将语音资源取出播放出来。在图片的处理上,采用SPLC501液晶模组,使用配套的DM Tool工具将需要显示的图片实现提取出图片资源烧写到SPCE061A中,然后通过61板控制SPLC501A播放出来。
4 系统硬件设计
4.1 电源板电路模块分析
图 4.1是电源部分的电路,4.5V直流电压经过SPY0029后产生3.3V给整个系统供电。
SPY0029是凌阳公司设计的电压调整IC,采用CMOS工艺。SPY0029具有静态电流低、驱动能力强、线性调整出色等特点。
图 4.1图中的VDDH3为SPCE061A的I/O电平参考,接SPCE061A的51脚,这种接法使得I/O输出高电平为3.3V;VDDP为PLL锁相环电源,接SPCE061A的7脚;VDD和VDDA分别为数字电源与模拟电源,分别接SPCE061A的15脚和36脚;AVSS1是模拟地,接SPCE061A的24脚;VSS是数字地,接SPCE061A的38脚; AVSS2接音频输出电路的AVSS2。
图 4.1电源电路图
4.2 CPU语音输出电路
SPCE061A内置2路10位精度的DAC,只需要外接功放电路即可完成语音的播放。
图 4.2是音频输出电路图。可以直接听喇叭输出的声音。图中的SPY0030也是凌阳公司的产品。它的详细说明可以参见SPY0030 data sheet。和LM386相比,SPY0030还具有下述优势,比如LM386工作电压需在4V以上, SPY0030仅需2.4V即可工作(两颗电池即可工作);LM386输出功率100mW以下, SPY0030约700mW。其他特性请参考data sheet。 
图 4.2 CPU语音输出电路
4.3 SPR模组电路
原理图如图 4.3所示:
图 4.3 SPR模组硬件原理图
SPR模组的硬件电路主要分成3大部分,下面分别介绍:
第一部分:ResWriter工具对SPR4096/SPR1024进行烧写的下载缓冲电路如图 4.4所示:
图 4.4 烧写SPR4096/SPR1024硬件电路
此部分电路主要是控制SCK、SDA信号的作用,通过74HC244可以控制SDA信号的高低电平,这样可以使用ResWriter工具发出符合烧写芯片的时序信号,完成对芯片的擦除、写入与校验功能。
第二部分:SPR4096的工作电路,如图 4.5所示:

图 4.5 SPR4096工作电路
此部分工作电路是为了使SPR4096存储器工作的外围电路,通过SCK、SDA与控制芯片/电路相连。
第三部分:SPR1024的工作电路,如图 4.6所示:
图 4.6 SPR1024工作电路
此部分工作电路是为了使SPR1024存储器工作的外围电路,通过SCK、SDA与控制芯片/电路相连。
另外,SPR模组还有跳线、接口电路,如图 4.7所示:
图 4.7 SPR模组的接口跳线电路
5 系统软件设计
在软件设计上,由于语音资源存放在外部的存储器上,只能采用手动的方式播放语音。另外,需要对图片的显示,在播放语音的同时需要刷新图片,这样采用在中断中填充语音队列的方法来实现。
下面是主函数流程图:
图 5.1 主函数流程图
在主函数中首先初始化SIO,这样可以获得存储在SPR4096上的语音资源的起始地址与结束地址,这样便于语音控制。
A2000语音播放函数设计,由于语音资源存储在外扩存储器SPR4096上,语音播放采用手动播放方式。手动语音播放,关键在于语音资源的取得,需要得到语音资源的地址。下面分析一下刚刚烧录文件的数据格式,如图:
图 5.2 语音文件的数据格式
在上图的前4个字节为"SPRW"的ASCII码,主要的目的在于读取Flash中的文件作为特征码使用(请参考2.4.4节索引表部分),在接下来的4个字节为整合后文件的起始地址00 00 00 56(由于SPR4096的最大地址为0x7ffff,所以使用4个字节标识,即两个字的长度),然后是整合后文件的结束地址。整合的概念,就是将多个资源小文件通过特定的数据格式编成一个索引表加在资源文件的开始,然后是资源文件1,资源文件2……ResWriter工具在用户打开文件时自动的完成上述过程,称为整合。ResWriter工具是对整合后的文件进行烧录。在接下来2个字节(00 01)的数据表示整合的文件有1个资源。
以上是整合后文件的一些信息,再接下来分别是添加的语音资源的长度信息,文件起始存储地址,文件结束存储地址。在本例编程中主要关心的就是语音资源文件起始地址、结束地址。由图 5.2可见第一个文件(未整合的)的起始地址存放在0x0012、0x0013(第13、14个字节),在程序中可以依次求得语音资源。参考下面手动播放语音的函数。
ulCon_AddrHighest = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12); // 第一个播放文件地址
ulCon_AddrHighest = ulCon_AddrHighest << 24;
ulCon_AddrHigh =SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12+1);
ulCon_AddrHigh = ulCon_AddrHigh << 16;
ulCon_AddrLow = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12+2);
ulCon_AddrLow = ulCon_AddrLow << 8;
ulCon_AddrLowest = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12+3);
ulCon_StartAddr = ulCon_AddrHighest | ulCon_AddrHigh // 开始地址
| ulCon_AddrLow | ulCon_AddrLowest;
其中BASE_START_ADDRESS定义为0x0012,每个地址采用4个字节存储,在分别取得地址后通过移位然后或操作得到地址。参数SndIndex是由调用函数传递过来的,意义在于使用第几段语音资源。比如使用第一段语音资源,那么传过来0就可以了,与采用自动方式播放语音类似。BASE_START_ADDRESS 是整合后文件的信息长度,在取得整合前文件的信息的时候要跳过这一段数据,即BASE_START_ADDRESS + SndIndex*12为第一段整合前数据文件的起始地址的最高字节(地址采用4个字节表示)。
SPCE061A播放语音的原理如图 5.3所示:
图 5.3 使用SPCE061A实现播放语音
手动播放语音的实现,如图 5.4所示: 
图 5.4 手动播放语音
语音播放的解码部分放在1KHz的中断中进行,这样可以在播放语音的时候不影响图片的显示。
在中断中的函数代码如下:
void BMP_Play_IRQ_Service(void)
{
IRQ1KHz_Couter++; //Counter自加1,用于计时,在主函数中判断时间到
while(SACM_A2000_TestQueue() != 1)
{
if(ulCon_StartAddr >= ulCon_EndAddr)
{
ulCon_StartAddr = ulStart_Save;
SACM_A2000_Initial(0); //放音初始化
SACM_A2000_InitQueue();
SACM_A2000_InitDecoder(3);
}
uiRet = SP_SIOReadAWord(ulCon_StartAddr);
SACM_A2000_FillQueue(uiRet);
ulCon_StartAddr++;
ulCon_StartAddr++;
}
SACM_A2000_Decoder();
*(unsigned int *)0x7012 = 0x0001;
}
如果解码队列为空,那么进行填充队列操作,否则只进行解码操作,然后请看门狗退出中断。
6 验证方案
步骤一:使用10Pin排线将SPR模组与61板的正电源、IOB0、IOB1、负电源对应相连,61板I/O口选择3.3V。
步骤二:使用EZ-probe与SPR模组EZ-probe接口相连。
步骤三:按照下图设置SPR模组跳线:
图 6.1 跳线设置
步骤四:启动ResWriter工具,打开语音文件想大声说爱你.16K(SPR Module配套资料\SPR Module Demo\SLAMDUNK\voice路径下),点击自动烧写按钮。如图:
图 6.2 打开语音文件

图 6.3 打开语音文件后ResWriter工具视图

图 6.4 点击自动烧写工具按钮

图 6.5 自动烧录过程

图 6.6 自动校验过程

图 6.7 完成自动烧录
注意:如果没有正确烧录,那么主要的原因是电源没有接入或者跳线选择错误。
步骤五:按照下图选择跳线:

图 6.8 跳线选择
步骤六:将液晶模组、SPR模组与61板按照下图连接起来,如图:

图 6.9 硬件连接图
步骤七:使用IDE将工程文件(SPR Module配套资料\SPR Module Demo\SLAMDUNK路径下)下载到61板上运行,现象是同时播放声音与图片(无需任何操作)。
注意:如果没能听见语音播放,请注意硬件连线喇叭是否接好,跳线是否设置好。
7 结语
通过上面的应用方案可以看到,在需要存储大量资源包括语音资源可以采用凌阳科技有限公司的存储器来解决。凌阳科技推出的存储器保存资料安全可靠,配备可视化工具使用方便。在与单片机相连时采用并行串行可选的方式传递数据,给用户带来了极大的方便。在方案中看到通过工具烧录的资源可以通过索引表来使用语音资源,而且可以播放语音资源,进行语音的录放,在不同的压缩格式中都可以较长时间的播放语音。在需要显示图片的时候可以考虑使用凌阳科技提供的SPLC501液晶,而且已经有了底层驱动程序,用户只需要直接调用显示函数即可完成显示。
8 参考文献
[1] 罗亚非.凌阳16位单片机应用基础[M]. 北京:北京航空航天大学出版社,2003
[2] 凌阳大学计划网站www.unsp.com.cn



