dsp語音錄放課程設計--基于tms320c5416 dsp的語音信號的采集和放送_第1頁
已閱讀1頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  課 程 設 計 報 告</p><p>  課程設計名稱:語音采集和放送 </p><p>  學 院: 信息工程學院 </p><p>  學生姓名: </p><p>  班 級: 電子信息工程1班 </p

2、><p>  學 號: </p><p>  指導教師: </p><p>  基于TMS320C5416 DSP的語音信號的采集和放送</p><p>  一、實踐的目的和要求</p><p><b>  1、實踐

3、目的</b></p><p>  信息技術和超大規(guī)模集成電路工藝的不斷發(fā)展,極大地推動了 DSP 的發(fā)展。DSP 技術的應用領域也越來越廣,尤其在音頻處理領域。目前,在很多語音處理系統(tǒng)中都用到了語音錄放模塊,采集現場的聲音并存儲起來供以后回放。語音處理系統(tǒng)的實時性、功耗、體積、以及對語音信號的保真度都是很影響系統(tǒng)性能的關鍵因素。本設計采用的高速54x DSP 芯片,最高頻率能達到160MIPS,能夠很

4、好的解決系統(tǒng)的實時性;采用的數字編解碼芯片TLV320AIC23(以下簡稱AIC23)具有16~32 位采樣精度,錄音回放模式下僅23mW 的功耗。因此,該音頻編解碼芯片與54x DSP 的結合是可移動數字音頻錄放系統(tǒng)、現場語音采集系統(tǒng)的理想解決方案。</p><p>  在CCS環(huán)境下基于TMS320C5416芯片的語音采集壓縮存儲與回放。通過這次課程設計,加深對CCS集成開發(fā)環(huán)境,熟悉DSP 54X同步串口原

5、理,了解音頻編解碼芯片TLV320AIC23原理,了解存儲芯片NAND FLASH原理,掌握DSP54X中斷原理 以及DSP試驗系統(tǒng)箱的使用。鍛煉邏輯思維能力、動手能力以及獨立解決問題的能力,對以后更深入地學習和應用數字信號處理及相關知識作準備。</p><p>  經過實驗表明,本設計實現的基于定點 DSP 的語音錄放系統(tǒng)具有如下優(yōu)點:</p><p>  1) 音頻數據占用資源少<

6、;/p><p><b>  2) 聲音保真度高</b></p><p><b>  3) 開發(fā)難度低</b></p><p>  4) 語音芯片與DSP 接口電路簡單</p><p><b>  5) 體積小</b></p><p><b>  2

7、、實踐要求</b></p><p> ?。?)了解DSP開發(fā)工具及其安裝過程</p><p>  (2)熟悉DSP開發(fā)軟件CCS使用</p><p> ?。?)熟悉工程文件的建立方法、匯編程序開發(fā)調試過程</p><p>  (4)熟悉常用C5416系列指令的用法</p><p>  (5)通過McBSP1

8、設置AIC23工作模式,通過McBSP0控制AIC23編碼和解碼,語音信號可由MIC輸入和LINEIN輸入,采集的語音數據存儲在NAND FLASH上,語音的回放方式可以為BYPASS和LOOP-BACK。</p><p><b>  實踐原理</b></p><p>  1 TMS320C5416芯片的基本原理</p><p>  TMS32

9、0C5416 數字信號處理器是TI公司為實現低功耗,高速實時信號處理而專門設計的16位定點數字信號處理器,采用改進的哈佛結構,具有高度的操作靈活性和運行速度,適用于遠程通信等實時嵌入式應用的需要。廣泛應用于電子測試、電子設計、模擬仿真、通信工程中。</p><p>  TMS320C5416具有的主要優(yōu)點如下:</p><p>  (1) 圍繞一組程序總線、三組數據總線和四組地址總線而建立

10、的改進哈佛結構,提高了系統(tǒng)的多功能性和操作的靈活性。</p><p>  (2) 具有高度的并行性和專用硬件邏輯的CPU設計,提高了芯片的性能。</p><p>  (3) 具有完善的尋址方式和高度專業(yè)化指令系統(tǒng),更適用于快速算法的實現和高級語言編程的優(yōu)化。</p><p>  (4) 模塊化結構設計,使派生器件得到了更快的發(fā)展。</p><p&

11、gt;  (5) 采用先進的IC制造工藝,降低了芯片的功耗,提高了芯片的性能。</p><p>  (6) 采用先進的靜態(tài)設計技術,進一步降低了功耗,使芯片具有更強的應用能力。</p><p>  TMS320C5416主要有中央處理器CPU,特殊功能寄存器,數據存儲器RAM,程序存儲器ROM,I/O接口功能,串行口,主機通信接口HPI,定時器,中斷系統(tǒng)等10部分組成。</p>

12、<p><b>  各部分功能如下:</b></p><p>  (1) 中央處理器(CPU)</p><p>  它是DSP芯片的核心,它有以下特點:</p><p>  (a) 采用多總線結構,通過一組程序總線、三組數據總線和四組地址總線來實現。</p><p>  (b) 40位算術邏輯運算單元ALU

13、,包括一個40位的桶形移位寄存器和兩個獨立的40位累加器。</p><p>  (c) 17×17位并行乘法器,與40位專用加法器相連,可用于進行非流水線的單周期乘法—累加運算。</p><p>  (d) 比較、選擇、存儲單元,可用于Viterbi譯碼器的加法-比較-選擇運算。</p><p>  (e) 指數編碼器,是一個支持單周期指令EXP的專用硬件

14、。可以在一個周期內計算40位累加器數值的指數。</p><p>  (f) 配有兩個地址生成器,包括8個輔助寄存器和2個輔助寄存器運算單元。</p><p>  (2)數據存儲器RAM</p><p>  TMS320C5416有兩種片內數據存儲器:</p><p>  (a) 雙尋址RAM:在一個指令周期內,可對其進行兩次存取操作,一次讀出

15、和一次寫入;</p><p>  (b) 雙尋址RAM:在一個指令周期內,只能進行一次存取操作。</p><p>  (3) 程序存儲器ROM</p><p>  T4 MS320VC516的程序存儲器可由ROM和RAM配置而成,程序空間可以定義在ROM上,也可以定義在ROM上。當需要高速運行程序時,可以將片外ROM中的程序調入到片內RAM中,以提高程序運行速度。降

16、低對外部ROM的要求,增強系統(tǒng)整體抗干擾性能。</p><p><b>  (4) I/O口</b></p><p>  TMS320C5416芯片只有兩個通用I/O引腳BIO和XF,BIO主要用來監(jiān)測外部設備工作狀態(tài),而XF用來發(fā)信號給外部設備。 </p><p>  另外,芯片還配有主機接口HPI,同步串行口和64K字的I/O空間,HPI和

17、串行口通過控制,用做通用I/O口使用。而64K字I/O空間可通過外加緩沖器或鎖存電路,配合外部I/O讀寫控制時序構成片外外設的控制電路。</p><p><b>  (5) 定時器</b></p><p>  定時器是一個軟件可編程計數器,用來產生定時中斷。定時器主要由定時寄存器TM,定時周期寄存器PRD,定時控制寄存器TCR及相應的邏輯控制電路組成。其中寄存器TIM

18、、PRD和TCR都是存儲映象寄存器,它們在數據存儲器中的地址分別為0024H、0025H和0026H。TIM是一個減1寄存器。PRD用來存放定時時間常數。TCR中包含定時器的控制位和狀態(tài)位。</p><p><b>  (6) 中斷系統(tǒng)</b></p><p>  TMS320C5416的中斷系統(tǒng)具有硬件中斷和軟件中斷。 </p><p>  

19、硬件中斷:由外圍設備引起的中斷分為片外外設所引起的中斷和片內外設所引起的中斷。</p><p>  軟件中斷:有程序指令INTR、TRAP和RESET所引起的中斷。中斷管理優(yōu)先級為11—16個固定級,有4種工作方式。</p><p>  (7) 主機接口HPI</p><p>  HPI是一個與主機通信的并行接口,主要用于DSP與其他總線或CPU進行通信,信息可通過

20、TMS320C5416的片內存儲器與主機進行數據交換。不同型號的器件配置不同的HPI口,可分為8位標準HPI口、8位增強型HPI接口和16位增強型HPI接口。</p><p><b>  (8) 指令系統(tǒng)</b></p><p>  支持單指令重復和塊指令重復;支持存儲器塊傳送指令;支持32位長操作數指令;具有支持2操作數或3操作數的讀指令;具有能并行存儲和并行加載的

21、算術指令;支持條件存儲指令及中斷快速返回指令。</p><p>  2 語音編碼芯片的選擇</p><p>  從適應語音信號頻率、滿足實時性、降低成本、簡化設計的要求出發(fā),本系統(tǒng)選擇TLV320AIC23。AIC23 工作電壓3.3 伏特,能在數字和模擬電壓下工作,與TMS320C5416的I/O 電壓相兼容,其控制接口和數字接口與DSP 的MCBSP 端口能夠無縫連接。AIC23的模數

22、轉換(ADCs)和數模轉換(DACs)部件高度集成在芯片內部,采用了先進的Sigma-delta 過采樣技術,可以在8K 到96K 的頻率范圍內提供16bit、20bit、24bit 和32bit 的采樣,ADC 和DAC 的輸出信噪比分別可以達到90dB 和100dB[1]。</p><p><b>  3 系統(tǒng)硬件設計</b></p><p>  AIC23 有獨

23、立的控制接口和數字接口??刂瓶谟糜诮邮湛刂破鞯拿钭?,數據接口與DSP 完成語音數據的交換。AIC23 的工作時鐘由外接的一個11.2896M 的晶振提供,同時該晶振也為DSP 提供工作時鐘。DSP 的工作時鐘是5 倍頻后的時鐘:56.488M。本系統(tǒng)用到了利用DSP 的MCBSP0 和MCBSP1,分別與AIC23 的控制和數據接口相連。DSP 與AIC23的接口電路如圖1</p><p>  圖2 C54

24、16與AIC23的接口圖</p><p> ?。?) 音頻控制接口</p><p>  MCBSP1 接 AIC23 的控制接口。AIC23 提供SPI 和I2C 兩種控制接口方式。該器件的模式終端狀態(tài)(MODE)決定了控制接口的形式。本設計將MODE 引腳接高,選擇SPI 方式。AIC23 的控制口主要是為了接收DSP 的控制字,因此這里DSP 的MCBSP1 作為主器件。AIC23

25、有許多可編程特性,其內部有11 個9 位可編程控制寄存器,DSP 通過MCBSP1 來訪問這些控制寄存器。SDIN 為串行數據輸入端,它接收DSP 串行數據,數據字長16 位,其中高7 位為地址信息,低9 位為AIC23 的命令字。SCLK 為控制端口串行數據時鐘輸入, DSP串口的采樣率發(fā)生器對CPU 時鐘分頻后得到串口的發(fā)送時鐘BCLKX1=225.952KHz,產生的時鐘通過SCLK 引腳驅動AIC23。</p>&

26、lt;p> ?。?) 音頻數據接口</p><p>  DSP 與AIC23 的數據交換是通過串口0 實現的。其中MCBSP 多通道緩沖串口數據的接收是通過三級緩沖完成的[2],即引腳DR 上的數據先到達移位寄存器RSR,當收到一個滿字之后數據被裝載到數據接收寄存器RBR 中,最后數據才被拷貝到接收數據寄存器DRR中。DSP 通過串口0 接收AIC23 采集的語音數字信號,并且在回放模式下,通過串口將語音信

27、號傳送給AIC23。這時音頻芯片為主器件,給DSP 提供幀同步和時鐘信號。</p><p>  AIC23 芯片與數字系統(tǒng)的接口有右判斷模式、左判斷模式、I2S 模式和DSP 模式四種數據格式。數字音頻接口由時鐘信號BCLK、數據信號DIN 和DOUT、同步信號LRCIN 和LRCOUT 組成。由于DSP 的MCBSP 接口與該芯片的DSP 模式相兼容,因此該音頻模塊采用了DSP 模式?,F對DSP 模式進行說明。

28、該音頻處理模塊采用的是DSP 作為從設備,AIC23為主設備。DSP 模式下的數據格式為:發(fā)送、接收幀長度為2 個字,每個字長16 位。幀同步信號有效后跟著是兩個數據字。</p><p>  AIC23 作為數據接口的主器件,為DSP 提供發(fā)送接收時鐘,以及幀同步信號,在幀同步信號的下降沿開始傳送數據,左通道數據組成了首先傳送的數據字,緊接著傳送右通道的數據。傳送字長32 位,其中左通道數據16 位,右通道數據1

29、6 位。BCLK 在主動方式下是輸出,而在從動方式下是輸入。在LRCIN 或LRCOUT 的下降沿開始數據傳輸。DSP 為了接收正確的語音數據,應該將串口的數據格式配置為與AIC23 相同。幀同步脈沖高電平有效。接收、發(fā)送時鐘CLKR、幀同步信號由外部時鐘驅動。其中幀同步信號寬度是1 個BCLK時鐘寬度。幀周期為32 個BCLK 時鐘。在CLKR 的上升沿,發(fā)送或采樣接收數據。DSP 模式下的數據傳輸時序入下:</p>&

30、lt;p> ?。?) 語音數據存儲模塊</p><p>  考慮到存儲器芯片的容量、系統(tǒng)供電、以及對語音信號的讀取速率。本系統(tǒng)采用了具有32MX8 位存儲空間的K9F5608 Nandflash。Nandflash 以容量大價格低的優(yōu)勢被廣泛應用在便攜式設備中。同時Nandflash 存儲器在寫入時需要復雜的操作命令,這樣確保了數據寫入的正確性。K9F5608 有8 位I/O 端口,地址、命令字以及數據復用

31、這8 位I/O 端口。它采用復雜的操作順序來區(qū)分地址、命令、數據信息。DSP 采集到的32 位語音數據通過外部數據總線的低8 位分4 次,從左聲道的高8 位到右聲道的低8 位依次寫入Nandflash。</p><p> ?。?) 液晶屏顯示模塊</p><p>  對于 DSP 來講LCD 是典型的慢速設備,如果僅僅靠設置DSP 等待周期寄存器,在訪問外部I/O 時最多只能插入14 個等

32、待周期,這點延時對DSP 來說是遠遠不夠的。因此,需要在DSP 與LCD 之間加入時序控制電路。與Nandflash 模塊類似,液晶屏、Nandflash 與DSP 的接口電路由CPLD 來完成,液晶屏占用DSP 兩個I/O 地址,分別是命令和數據地址。DSP 對I/O 空間的操作由地址線、數據線和三根信號線IOSTRB、R/W 和IS 來完成[4] 。CPLD根據DSP 給出的讀寫信號以及地址信號,產生液晶屏的片選、讀寫信號、以及鍵盤

33、的掃描信號。</p><p><b>  4 軟件設計</b></p><p>  系統(tǒng)的軟件開發(fā)環(huán)境是 TI 公司的DSP 集成開發(fā)環(huán)境CCS 2.0。CCS 提供了軟件開發(fā)、程序調試和系統(tǒng)仿真環(huán)境。CCS 不但能支持匯編語言,而且還支持C/C++語言進行軟件開發(fā)。CCS 提供的C 編譯器能優(yōu)化代碼,提高C 程序的運行效率。系統(tǒng)有兩種工作方式,一種是現場采集并播放,

34、即系統(tǒng)采集現場的線路輸入信號或麥克語音信號,并存儲在NandFlash中,在采集的過程中,同時通過耳機播出。另一種是播放錄制的語音數據,即不采集現場語音信號,直接播放已經存儲在NandFlash 中的語音數據。這兩種工作方式可以在系統(tǒng)初始化工程時通過按鍵選擇。具體的程序代碼段設計主要包括MCBSP 口的配置、AIC23 的初始化、NandFlash 燒寫、DSP 上電自舉,這四個部分。其中現場采集、播放的流程圖如下:</p>

35、<p>  (1) MCBSP 的配置</p><p>  5416 提供的MCBSP 口是一種高速、雙向、多通道帶緩沖的串行接口。它可以與其他C54x DSP 器件、編碼器或其他串行接口器件通信。MCBSP 的硬件部分是基于標準串行接口的[3]。MCBSP 的控制模塊包括幀同步信號發(fā)生器、內部時鐘發(fā)生器、以及它們的控制電路和多通道選擇。與MCBSP 有關的控制寄存器是通過子地址尋址來訪問的,它有2

36、8 個子寄存器只占用一個DSP 內存地址。MCBSP 的子地址寄存器(SPSA)用來指向這些使用同一個內存地址的寄存器中的某一個。MCBSP 子數據寄存器(SPSDx)用來訪問選中的寄存器。由于配置每個寄存器的代碼段相同,首先指定子地址寄存器地址,接著給數據。為了保證程序的簡潔與可讀性,這里采用調用函數的方法來替代這些重復代碼,代碼具體實現如下:</p><p>  #define MCBSP1_SET(add,

37、data)</p><p>  MCBSP1_SPSA = add, MCBSP1_SPSD = data // 定義一個宏函數,第一個參數add 為子地址寄存器的地址,data 為子地址寄存器的值</p><p>  MCBSP1_SET( SPCR1, 0x1801)</p><p>  // SPCR1=0x1801</p><p> 

38、 MCBSP1_SET( SPCR2, 0x03C1)</p><p>  // SPCR2=0x03C1</p><p>  (2) AIC23 的初始化</p><p>  AIC23 具有8 個可編程的內部寄存器,通過軟件編程能隨時控制AIC23 的采樣頻率,高、低通濾波器的截止頻率,模擬輸入及輸出的增益。DSP 通過串口1 完成對AIC23 的初始化工作。程

39、序中把對AIC23 的初始化命令寫在一個數組中,采用循環(huán)方式將這些命令通過串口發(fā)送出去。</p><p>  codec[10]={0x1e00,0x0c00,0x0811,0x0a04,0x0e43,0x102c,0x1201,0x0117,0x05ff, 0x07ff};</p><p>  MCBSP1_DXR1=codec[i];</p><p>  (3)

40、DSP 上電自舉</p><p>  當軟硬件設計工作完成后,需要系統(tǒng)能夠脫離PC 機獨立運行。這就需要將調試好的.out燒寫到外部Flash 中,并要求目標系統(tǒng)上電后可自行啟動并執(zhí)行用戶軟件代碼,這就需要用到DSP 的自舉引導(Bootloader)技術。這里采用的是16 位并行Flash 引導方式。使用Hex500.exe 將.out 文件轉換成16 進制的自舉表文件,通過燒寫器將這個自舉表文件燒寫到flas

41、h 中。然而,這種脫機燒寫不能燒寫貼片封裝的芯片,系統(tǒng)的靈活性受到很大的限制。本設計采用了一種新的一次裝載程序并燒寫的在線燒寫方法。用 Hex500.exe 生成好自舉表文件后,另外跟據Flash 的編程方法,編寫燒寫代碼,并讀取自舉表文件。在C 程序源碼中讀取的自舉表文件是ASCII 值,因此需要在程序中加一段格式轉換代碼,將數據轉換成二進制文件,并且去掉自舉表的表頭和表尾。轉換時采用一個4 次循環(huán),先讀取4 位16進制數的最高位,把

42、這個ASCII 值轉換成二進制數字,將其左移4 位,接著讀取次高位。循環(huán)4 次便得到了可以直接燒寫的數據。系統(tǒng)脫機工時,通過外部并行總線,用DMA 方式將這些代碼從數據空間搬移到程序</p><p><b>  三、實踐步驟</b></p><p><b>  1.實驗準備:</b></p><p><b>  

43、⑴ 連接實驗設備</b></p><p> ?、?準備音頻輸入、輸出設備。 </p><p>  ①用PC機的媒體播放器選擇一段音樂循環(huán)播放。 </p><p> ?、谟靡纛l線連接PC機聲卡的Speaker Out到5416-A板的J5插座,即上圖中“麥克風輸入”。</p><p> ?、蹖⒍鷻C上音頻輸入插頭插到5416-A板的J

44、7插座,即上圖中“立體聲輸出”。 </p><p> ?、苷{節(jié)耳機上音量旋鈕到適中位置。 </p><p>  2.設置Code Composer Studio 3.3在硬件仿真(Emulator)方式下運行 </p><p>  3.啟動Code Composer Studio 3.3: </p><p>  選擇菜單Debug→Reset

45、 CPU。</p><p>  4.打開工程文件: </p><p><b>  工程目錄為:</b></p><p>  C:\ICETEK\VC5416Ae\VC5416Ae\Lab0701-Echo\Echo.pjt。 </p><p>  5.編譯、下載程序,選擇菜單Debug->Go Main,使程序運行

46、到main函數入口位置。</p><p><b>  6.設置觀察窗口:</b></p><p>  打開源程序Echo.c,將變量bEcho、nCount和nTime加入觀察窗口。</p><p>  7.運行程序觀察結果:</p><p>  - 按“F5”鍵運行,注意觀察窗口中的bEcho=0,表示數字回聲功能沒有

47、激活。</p><p>  - 這時從耳機中能聽到麥克風中的輸入語音放送。 </p><p>  - 將觀察窗口中bEcho的取值改成非0值。</p><p>  - 這時可從耳機中聽到帶數字回聲的語音放送。</p><p><b>  8.退出CCS</b></p><p><b> 

48、 四、心得體會</b></p><p>  通過這次的DSP課程設計,讓我充分認識到了我的不足。我雖然學習過C語言的編程,但一旦將它應用到實際的比較專業(yè)的問題上,我所學的知識就變得完全不夠用了,為了這次課程設計我查詢了大量的資料,無論是C語言方面的還是其他方面的都讓我們花費了很多時間,查詢到了需要的資料我們又對它們進行了整理,提取出我們需要的a律壓縮和μ律壓縮的算法和原理,并且努力去理解其中的知識,使

49、其能為我們所用,盡管如此我們仍然沒能成功的編出屬于我們自己的程序,因此我們找到了一份編好的程序,用我們已經理解的知識去分析它,理解這份程序的原理,并根據我們的實際對它進行一些修改,從而我們才得出我們現在的程序。雖然程序編寫成功了但我們在調試上又遇到了很多的問題,比如在CCS環(huán)境下我們要如何觀察波形,波形有代表什么等等,為此我們又不斷的翻閱課件和資料,才最終解決了所有的問題,我的課程設計才算基本完成了。</p><p&

50、gt;  整個課程設計過程中,我在不斷的查閱資料和開動腦筋過程中,鍛煉了我的資料采集能力,也鍛煉了我的分析整理能力,為以后做畢業(yè)設計打下了基礎;同樣在實驗過程中我遇到很多困難,而這些困難則鍛煉了我的耐心和分析解決問題的能力;通過編程鍛煉了我的編程能力,使我對C語言,匯編語言更加熟悉,讓我能更好的運用它們;同時也鍛煉了我們的團結協(xié)作能力,為將來走入社會能更好的工作打下了基礎。</p><p>  總之通過這次的實驗

51、,讓我認識到了自己的不足,同時又通過這次的實驗讓我們學到了讓我們受用一生的知識。</p><p><b>  參考文獻</b></p><p>  [1]戴明楨等編著.TMS320C54X DSP 結構原理及應用. 北京:航空航天大學出版社,第2版,2007;</p><p>  [2]彭啟琮編著.DSP技術的發(fā)展與應用.北京:高等教育出版社,

52、2002;</p><p>  [3]胡廣書編著.數字信號處理理論、算法與實現.北京:清華大學出版社,2005;</p><p>  [4]北京合眾達電子技術有限公司編著.SEED-DTK系列實驗手冊.北京合眾達電子技術有限公司出版,2007。</p><p>  [5]鄒彥主編.DSP原理及應用.電子工業(yè)出版社,2012.1</p><p>

53、;<b>  附錄:源程序代碼</b></p><p>  #include "scancode.h"</p><p>  #include "myapp.h"</p><p>  char ConvertScanToChar(unsigned char cScanCode);// 將鍵盤掃描碼轉換為字

54、符</p><p>  #define REGISTERCLKMD (*(unsigned int *)0x58)</p><p>  #define WAITSTATUS (*(unsigned int *)0x28)</p><p>  #define SOUNDBUFFERLENGTH 0x0f000</p><p>  unsigne

55、d int nSoundNumber,bPlayBack,bRecord,nCurrentSound,js,bls,bStop,bLongEnough;</p><p>  #pragma DATA_SECTION(uSound,".sound")</p><p>  unsigned int uSound[SOUNDBUFFERLENGTH];</p>

56、<p>  ioport unsigned int port0000;</p><p>  ioport unsigned int port8000;</p><p>  ioport unsigned int port8001;</p><p>  ioport unsigned int port8002;</p><p>  i

57、oport unsigned int port8007;</p><p>  void main( void )</p><p><b>  {</b></p><p><b>  int i,j;</b></p><p>  unsigned int nScanCode,nScanCode1;&l

58、t;/p><p>  unsigned char cKey;</p><p>  port8000=0; port8000=0x80; port8000=0;</p><p>  port8007=0; port8007=0x40; i=port8002;</p><p>  REGISTERCLKMD=0;</p><p&g

59、t;  WAITSTATUS=0x0ffff;</p><p>  js=nSoundNumber=bPlayBack=bRecord=nCurrentSound=bls=bStop=0;</p><p>  for ( i=0;i<SOUNDBUFFERLENGTH;i++ ) uSound[i]=0;</p><p>  initCLK(CPU_SPEED

60、_160M);</p><p>  initMcBSP1();</p><p>  initAIC23();</p><p>  initMcBSP0();</p><p>  initInterrupt();</p><p>  initVal();</p><p>  REGISTERCLK

61、MD=0x1007;</p><p>  for ( i=0;i<2048;i++ )nScanCode++;</p><p>  DesableInterrupt(); js=0; bStop=1; bLongEnough=0;</p><p>  port0000=1;</p><p><b>  for(;;)<

62、/b></p><p><b>  {</b></p><p>  if ( bls )</p><p>  if ( bPlayBack==0 )</p><p><b>  {</b></p><p>  DesableInterrupt();</p>

63、<p><b>  bls=0;</b></p><p><b>  js=0;</b></p><p><b>  bStop=1;</b></p><p><b>  }</b></p><p>  if ( js==0 )</p&g

64、t;<p><b>  {</b></p><p>  nScanCode1=port8001;</p><p>  for ( i=0;i<1024;i++ );</p><p>  nScanCode=port8001;</p><p>  nScanCode&=0x0ff;</p&

65、gt;<p>  if ( nScanCode!=0 && nScanCode!=0x0ff )</p><p><b>  {</b></p><p>  if ( nScanCode==SCANCODE_Enter )break;</p><p><b>  else</b></p

66、><p><b>  {</b></p><p>  cKey=ConvertScanToChar(nScanCode);</p><p>  switch ( cKey )</p><p><b>  {</b></p><p>  case '0':// 錄

67、音</p><p>  if ( bRecord )</p><p><b>  {</b></p><p>  bRecord=0;</p><p>  nCurrentSound=nSoundNumber;</p><p>  DesableInterrupt(); bStop=1;</

68、p><p><b>  js=0;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  bRecord=1;</p>&

69、lt;p>  nSoundNumber=nCurrentSound=0;</p><p>  EnableInterrupt(); bStop=0;</p><p>  bLongEnough=0;</p><p><b>  }</b></p><p><b>  break;</b><

70、;/p><p>  case '1':// 放音</p><p>  if ( bLongEnough )</p><p><b>  {</b></p><p>  bPlayBack=1; nSoundNumber=0;</p><p><b>  bls=1; <

71、;/b></p><p>  EnableInterrupt(); bStop=0;</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  case 0:</b></p><p>  

72、default: break;</p><p><b>  }</b></p><p><b>  }</b></p><p>  i=port8002;</p><p><b>  }</b></p><p><b>  }</b>

73、;</p><p>  if ( bStop )</p><p><b>  {</b></p><p>  for ( i=0;i<1024;i++ )</p><p>  for ( j=0;j<1024;j++ );</p><p><b>  }</b>&

74、lt;/p><p><b>  }</b></p><p><b>  }</b></p><p>  interrupt void rxData( void )</p><p><b>  {</b></p><p>  unsigned int i;&l

75、t;/p><p>  unsigned int uL,uR;</p><p>  js++; js%=61440;</p><p><b>  uL=DRR10;</b></p><p><b>  uR=DRR20;</b></p><p>  if ( bPlayBack )

76、</p><p><b>  {</b></p><p>  i=nCurrentSound+nSoundNumber; i%=SOUNDBUFFERLENGTH;</p><p>  DXR10=uSound[i];</p><p>  DXR20=uSound[i];</p><p>  nS

77、oundNumber++;</p><p>  if ( nSoundNumber>=SOUNDBUFFERLENGTH )</p><p>  bPlayBack=0;</p><p><b>  }</b></p><p>  else if ( bRecord)</p><p><

78、;b>  {</b></p><p>  uSound[nSoundNumber]=uL;</p><p>  nSoundNumber++;</p><p>  if ( nSoundNumber>=SOUNDBUFFERLENGTH )</p><p><b>  {</b></p>

79、;<p>  bLongEnough=1;</p><p>  nSoundNumber=0;</p><p><b>  }</b></p><p><b>  DXR10=uL;</b></p><p><b>  DXR20=uR;</b></p>

80、;<p><b>  }</b></p><p><b>  }</b></p><p>  char ConvertScanToChar(unsigned char cScanCode)</p><p><b>  {</b></p><p>  char cR

81、eturn;</p><p>  cReturn=0;</p><p>  switch ( cScanCode )</p><p><b>  {</b></p><p>  case SCANCODE_0: cReturn='0'; break;</p><p>  case

82、SCANCODE_1: cReturn='1'; break;</p><p>  case SCANCODE_2: cReturn='2'; break;</p><p>  case SCANCODE_3: cReturn='3'; break;</p><p>  case SCANCODE_4: cReturn

83、='4'; break;</p><p>  case SCANCODE_5: cReturn='5'; break;</p><p>  case SCANCODE_6: cReturn='6'; break;</p><p>  case SCANCODE_7: cReturn='7'; break

84、;</p><p>  case SCANCODE_8: cReturn='8'; break;</p><p>  case SCANCODE_9: cReturn='9'; break;</p><p><b>  }</b></p><p>  return cReturn;<

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論