1 引言
凌陽科技公司推出的SPCE061A芯片具有語音播放的硬件條件,而且還提供了大量的語音播放的函數可供調用。但是由于SPCE061A片內的FLASH存儲器只有32K,在播放大量語音資源時需要外擴存儲器。本文使用SPCE061A與SPR4096實現大量語音播放。在操作SPR4096時使用凌陽教育推廣中心最新推出的可視化工具ResWriter進行對SPR4096的讀寫操作,使得在播放大量語音資源時也變得很容易。本文詳細論述了實現過程。
2 芯片與模組簡介
2.1 SPCE061A特性簡介
SPCE061A是凌陽科技研發生產的性價比很高的一款十六位單片機,使用它可以非常方便靈活的實現語音的錄放系統,該芯片擁有8路10位精度的ADC,其中一路為音頻轉換通道,并且內置有自動增益電路。這為實現語音錄入提供了方便的硬件條件。兩路10精度的DAC,只需要外接功放(SPY0030A)即可完成語音的播放。另外凌陽十六位單片機具有易學易用的效率較高的一套指令系統和集成開發環境。在此環境中,支持標準C語言,可以實現C語言與凌陽匯編語言的互相調用,并且,提供了語音錄放的庫函數,只要了解庫函數的使用,就會很容易完成語音錄放,這些都為軟件開發提供了方便的條件:
特性:
● 16位μ'nSP微處理器;
● 工作電壓:內核工作電壓VDD為3.0~3.6V(CPU),I/O口工作電壓VDDH為VDD~5.5V(I/O);
● CPU時鐘:0.32MHz~49.152MHz;
● 內置2K字SRAM;
● 內置32K閃存ROM;
● 可編程音頻處理;
● 晶體振蕩器;
● 系統處于備用狀態下(時鐘處于停止狀態),耗電小于2μA@3.6V;
● 2個16位可編程定時器/計數器(可自動預置初始計數值);
● 2個10位DAC(數-模轉換)輸出通道;
● 32位通用可編程輸入/輸出端口;
● 14個中斷源可來自定時器A / B,時基,2個外部時鐘源輸入,鍵喚醒;
● 具備觸鍵喚醒的功能;
● 使用凌陽音頻編碼SACM_S240方式(2.4K位/秒),能容納210秒的語音數據;
● 鎖相環PLL振蕩器提供系統時鐘信號;
● 32768Hz實時時鐘;
● 7通道10位電壓模-數轉換器(ADC)和單通道聲音模-數轉換器;
● 聲音模-數轉換器輸入通道內置麥克風放大器和自動增益控制(AGC)功能;
● 具備串行設備接口;
● 低電壓復位(LVR)功和低電壓監測(LVD)功能;
● 內置在線仿真板(ICE,In- Circuit Emulator)接口。
2.2 SPR4096簡介
SPR4096是凌陽科技公司研發生產的性價比很高的512K*8位的高性能FLASH存儲器,同時內嵌4K*8位的SRAM。具有BMI(Bus Memory Interface)接口與SIO(Serial Interface)接口。SPR4096提供兩種電源供電VDDI與VDDQ。VDDI供電范圍在2.25V到2.75V,是對內部的FLASH與邏輯控制器供電。VDDQ供電范圍在2.25V到3.6V,只對I/O口供電。SPR4096的最大工作頻率為5.0MHz,最大讀取電流為2mA最大擦除、燒錄電流為6mA。
特性:
● 512K*8位的FLASH,256個扇區,每個扇區為2K字節
● 可重復擦寫20000次
● 在自然條件下數據保存10年
● 4K*8位的SRAM
● 供電要求:
VDDI: 2.25V-2.75V
VDDQ:2.25V-3.6V
● 最大工作頻率:5.0MHz
● 最大擦除、燒錄電流:6.0mA
● 最大讀取電流:2.0mA
2.3 SPR模組介紹
2.3.1 基本特性與參數指標
產品型號:SPR MODULE V1.0
SPR模組工作電壓:3.3V
SPR模組外形尺寸:50mm×50mm
2.3.2 主要功能
針對凌陽科技公司的存儲器芯片SPR4096/SPR1024,開發的簡易燒寫器。該燒寫器配合PC機ResWriter工具(凌陽科技教育推廣中心提供,下文敘述),通過EZ-probe下載線,完成對SPR4096/1024存儲器芯片的擦除、寫入、校驗等功能。并且在SPR模組上留有與SPCE061A單片機的接口,可以實現SPR模組與SPCE061A單片機組成的系統。
2.3.3 結構框圖

圖 2.1 SPR模組結構框圖
SPR模組預留兩個接口,一個接口是EZ-probe,這是在使用ResWriter工具對SPR4096/1024進行燒寫時連接使用的,另一個是10PIN的排線,主要提供電源以及與SPCE061A連接使用。用戶請注意,SPR模組電路支持SPR4096和SPR1024,但只能同時對其中一種芯片進行使用。SPR模組有兩種基本配置,一種為電路板加SPR4096芯片,另一種為電路板加SPR1024芯片,而且在使用時必須配備下載線使用。用戶在選購時請您注意確認是SPR模組_4096還是SPR模組_1024。
2.3.4 實物圖

圖 2.2 SPR模組_4096實物圖

圖 2.3 SPR模組_1024實物圖
2.3.5 注意事項
● SPR模組使用3.3V電源供電,注意不要使電源接反
● 模組必需配合下載線使用
● 在使用ResWriter工具對SPR4096/SPR1024芯片進行燒寫時也需要對SPR模組供電
● 不能同時對SPR4096與SPR1024進行燒寫
2.4 ResWriter工具簡介
2.4.1 主要功能
ResWriter工具的主要功能:
● SPR1024/4096 Flash Memory 燒錄器:用PC printer port通過Easy Probe 燒錄SPR1024/4096,基本操作內容包括Blank Check(空白檢查),Erase(刪除數據),Read(讀數據),Program(燒錄,寫入數據),Verify(校驗,檢查寫入是否正確);
● 文檔整合:把多個小文檔整合成一個大文檔,作為燒錄Flash的數據資料。
2.4.2 ResWriter工具的界面:

圖 2.4 Res Writer用戶界面
2.4.3 菜單介紹
● 界面:包括標題欄、Menu Bar、ToolBar、Resource View Bar、View、Status Bar等。
● 標題欄:<文檔名> Sunplus Res Writer;
● Menu Bar:見表一;
● ToolBar:包括Load Bin、Load Con、Save、Blank Check、Erase、Read、Program、Verify、Auto Operation、Help等;
● Resource View Bar:在開始的地址空間顯示文檔索引表,接下來顯示讀進來的小文檔的標題,每個標題對應一段地址空間, Double Click某個小文檔標題可以定位到對應數據的起始地址,可以刪除某個小文檔標題(以Popup Menu方式實現,對應的刪除本段數據),Index List不可刪除;
● View:左邊一列顯示地址,右邊十六列顯示數據(十六進制);
● Status Bar:顯示Flash Type、Start Address、 End Address(由菜單"設置/操作地址"指定) 、Check Sum顯示燒錄數據的校驗和(在Read和Program之后)、命令提示。
表 2.1菜單
| 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