
DSP課程設(shè)計報告
8頁西南科技大學(xué)課程設(shè)計報告課程名稱:DSP系統(tǒng)設(shè)計設(shè)計題目: 通信計數(shù)器 專業(yè)班級: 學(xué)生姓名: 學(xué)生學(xué)號: 設(shè)計時間: 2010-04-12~2010-04-23 指導(dǎo)教師: 一. 前言DSP在圖形圖像處理、高精度測量控制、高性能儀器儀表等眾多領(lǐng)域得到越來越廣的應(yīng)用,實(shí)際運(yùn)用中,通常須將DSP采集處理后的數(shù)據(jù)傳送到PC機(jī),然后進(jìn)行存儲和處理TL16C550是一個標(biāo)準(zhǔn)的串口芯片,在板上加上16C550和MAX232以及驅(qū)動電路,就可以實(shí)現(xiàn)pc機(jī)與dsp間的串口通信對TL16C550的操作主要是通過設(shè)置其寄存器來實(shí)現(xiàn)的,這11個寄存器通過TMS320VC5509的三個地址線和線路控制寄存器中的DLAB位對它們進(jìn)行尋址并且通過控制指示燈的點(diǎn)亮情況來計數(shù)所通信的句子數(shù),指示燈的點(diǎn)亮情況以二進(jìn)制形式來計數(shù)二. 設(shè)計思路及框圖要用中斷方式來實(shí)現(xiàn)異步串口通信,就要在初始化TL16C550寄存器的時候使中斷使能寄存器LER的接收中斷使能位置1,初始化中斷向量表。
在接收緩存區(qū)接收到數(shù)據(jù)的時候進(jìn)入中斷函數(shù),再通過調(diào)用顯示程序在PC機(jī)上顯示接收到的數(shù)據(jù)LBDS指示燈有四個,可以表示四位二進(jìn)制數(shù)發(fā)光二極管共陰極連接,接收到高電平就會發(fā)光通過程序?qū)⒅蒂x給LBDS,對應(yīng)的二極管發(fā)光,指示燈被點(diǎn)亮所以定義一個變量來計數(shù)發(fā)送的信息中“.”的數(shù)量,在顯示數(shù)據(jù)的時候?qū)⑦@個值賦給LBDS,相應(yīng)的燈就會被點(diǎn)亮,達(dá)到計數(shù)的效果用查詢法將通信信息發(fā)送到TL16C550的發(fā)送緩沖寄存器,在接受端利用中斷方式接受DSP發(fā)送過來的信息,并且定義一個變量來計數(shù)發(fā)送的信息中“.”的數(shù)量,在接收數(shù)據(jù)的同時根據(jù)計數(shù)情況點(diǎn)亮LBDS指示燈具體可用如下框圖表示三. 硬件設(shè)計(算法原理)(一)、TL16C550是一個標(biāo)準(zhǔn)的串口芯片,它的引腳圖如下表示,各主要引腳的功能說明如下: A0~A2:片內(nèi)寄存器的選擇信號;D0~D7:雙向8位數(shù)據(jù)線;CS0,CS1,CS2:輸入片選信號,當(dāng)CS0=CS1=1且CS2=0時,TL16C550被選中;ADS非:地址選通信號,該引腳有效時,片選信號(CS0,CS1,CS2)及寄存器選擇信號(A0~A2)可直接驅(qū)動TL16C550內(nèi)部的選擇邏輯;SN,SOUT:串行數(shù)據(jù)輸入與串行數(shù)據(jù)輸出;MR:主設(shè)備復(fù)位信號;NTRPT:中斷信號,共有4種情況可以觸發(fā)中斷。
二)、MAX232芯片是美信公司專門為電腦的RS-232標(biāo)準(zhǔn)串口設(shè)計的接口電路,使用+5v單電源供電內(nèi)部結(jié)構(gòu)基本可分三個部分: 第一部分是電荷泵電路由1、2、3、4、5、6腳和4只電容構(gòu)成功能是產(chǎn)生+12v和-12v兩個電源,提供給RS-232串口電平的需要 第二部分是數(shù)據(jù)轉(zhuǎn)換通道由7、8、9、10、11、12、13、14腳構(gòu)成兩個數(shù)據(jù)通道 其中13腳(R1IN)、12腳(R1OUT)、11腳(T1IN)、14腳(T1OUT)為第一數(shù)據(jù)通道 8腳(R2IN)、9腳(R2OUT)、10腳(T2IN)、7腳(T2OUT)為第二數(shù)據(jù)通道 TTL/CMOS數(shù)據(jù)從T1IN、T2IN輸入轉(zhuǎn)換成RS-232數(shù)據(jù)從T1OUT、T2OUT送到電腦DB9插頭;DB9插頭的RS-232數(shù)據(jù)從R1IN、R2IN輸入轉(zhuǎn)換成TTL/CMOS數(shù)據(jù)后從R1OUT、R2OUT輸出第三部分是供電15腳GND、16腳VCC(+5v)具體引腳圖如下所示: 通過在Dsp板子上加上TL16C550和MAX232以及驅(qū)動電路,實(shí)現(xiàn)pc機(jī)與dsp間的串口通信,TL16C550是一個標(biāo)準(zhǔn)的串口芯片,它的控制寄存器基地址位0x,寄存器占用TMS320VC5509的八個地址單元,串口中斷與TMS320VC5509的INT0連接。
可以使用TMS320VC5509的中斷0響應(yīng)串口中斷TL16C550有11個寄存器,通過TMS320VC5509的三個地址線和線路控制寄存器中的DLAB位對它們進(jìn)行尋址驅(qū)動電路主要完成將輸出的0—3.3V的電平轉(zhuǎn)換成異步串口通信的工作電平,轉(zhuǎn)換的工作由MAX232芯片完成,但由于他是5V器件,所以它同dsp間的信號線必須有電平轉(zhuǎn)換,此版采用的是74LVC245TL16C550的SN為串行數(shù)據(jù)輸入引腳,SOUT為串行數(shù)據(jù)輸出引腳,這兩條信號線連接到MAX232上,可用下圖所示的框圖表示LBDS指示燈有四個,可以表示四位二進(jìn)制數(shù)發(fā)光二極管共陰極連接,接收到高電平就會發(fā)光通過程序?qū)⒅蒂x給LBDS,對應(yīng)的二極管發(fā)光,指示燈被點(diǎn)亮四. 軟件設(shè)計為了激活擴(kuò)展口的串口通信功能,需要對TL16C550進(jìn)行一系列的操作:(1) 設(shè)置波特率:波特率除數(shù)寄存器為16位,由高8位(DLM)和低8位(DLL)組成除數(shù)的值可由UART的工作時鐘和波特率共同確定,計算公式為:除數(shù)/(期望的波特率*16)2) 設(shè)置通信參數(shù):通信雙方除了速度匹配之外、還必須使用相同的數(shù)據(jù)格式,這包括數(shù)據(jù)位長度、停止位長度、使用何種校驗(yàn)方式等,這些參數(shù)通過對線路控制寄存器LCR賦值來設(shè)置。
另外,還需設(shè)置發(fā)送和接受的波特率以及中斷方式等在本次設(shè)計中采用c語言編寫dsp對TL16C550的初始化等,在進(jìn)行程序編寫前:(1)、我們首先定義相關(guān)的寄存器變量:#define UART_BASE_ADDR 0x //片選基地址#define RBR *((int *)(UART_BASE_ADDR+0)) //接受緩沖寄存器地址,只讀#define THR *((int *)(UART_BASE_ADDR+0)) //發(fā)送保持寄存器地址,只寫#define IER *((int *)(UART_BASE_ADDR+1)) //中斷使能寄存器地址,讀寫#define IIR *((int *)(UART_BASE_ADDR+2)) //中斷標(biāo)志寄存器地址,只讀#define FCR *((int *)(UART_BASE_ADDR+2)) //FIFO控制寄存器地址,只寫#define LCR *((int *)(UART_BASE_ADDR+3)) //線路控制寄存器地址,讀寫#define MCR *((int *)(UART_BASE_ADDR+4)) //MODEM控制寄存器地址,讀寫#define LSR *((int *)(UART_BASE_ADDR+5)) //線路狀態(tài)寄存器地址,只讀#define MSR *((int *)(UART_BASE_ADDR+6)) // MODEM狀態(tài)寄存器地址,只讀#define SCR *((int *)(UART_BASE_ADDR+7)) //暫存寄存器地址,讀寫#define DLL *((int *)(UART_BASE_ADDR+0)) //低位除數(shù)寄存器地址,讀寫#define DLM *((int *)(UART_BASE_ADDR+1)) //高位除數(shù)寄存器地址,讀寫(2)、完成系統(tǒng)的初始化,包括DSP時鐘、EMIF、TL16C550的各寄存器的初始化。
調(diào)用以下初始化函數(shù):void INTR_init( void ) //中斷向量表初始化{IVPD=0xd0; //IVDP為DSP中斷向量指針,指向256字節(jié)大小的程序空間中的中斷向量表(IV0~IV15和IV24~IV31),這些中斷向量供DSP專用IVPH=0xd0; //IVPH為主機(jī)中斷向量指針,指向256字節(jié)大小的程序空間中的中斷向量表(IV16~IV23),這些中斷向量供DSP和主機(jī)共享使用IER0=0x04; //中斷使能寄存器,通過設(shè)置IER0的位為1打開相應(yīng)的可屏蔽中斷,置0關(guān)閉相應(yīng)的可屏蔽 DBIER0 =0x10; //調(diào)試中斷使能寄存器IFR0=0xffff; //中斷標(biāo)志寄存器的初始化,置1表示與中斷向量X關(guān)聯(lián)的中斷未決 asm(" BCLR INTM");}void EMIF_init(void) //外部存儲器接口初始化{ ioport unsigned int *ce21 =(unsigned int *)0x809; *ce21 = 0x1fff;}void CLK_init( void ) //時鐘初始化{ ioport unsigned int *clkmd; clkmd=(unsigned int *)0x1c00; *clkmd = 0x21f3;}void TMCR_reset( void ) //時鐘設(shè)置{ ioport unsigned int *TMCR_MGS3=(unsigned int *)0x07FE; ioport unsigned int *TMCR_MM =(unsigned int *)0x07FF; *TMCR_MGS3 =0x510; *TMCR_MM =0x000;}void UART_init( void ) // TL16C550寄存器的初始化{ LCR = 0x80; DLL = 0x18; DLM = 0x00; LCR = 0x03; FCR = 0x01; MCR = 0x20;IER = 0x01; // IER 為中斷使能寄存器,第一位是接收中斷使能位,置1表示接收中斷使能 }(3)、判斷線路狀態(tài)寄存器是否使能,若是則開始發(fā)送數(shù)據(jù),否則繼續(xù)等待,由以下程序?qū)崿F(xiàn):void UART_trasmit(char data){ unsigned int uWork; do { uWork=LSR;} while ( uWork&0x040 != 0x040 ); // LSR為線路狀態(tài)寄存器,第7位為1表示發(fā)送保持寄存器空,可以發(fā)送數(shù)據(jù) THR=data; wait(12); }(4)、進(jìn)入中斷程序接收數(shù)據(jù),以“.”為結(jié)束標(biāo)志,并且計數(shù)所遇到的“.”的個數(shù)。
由以下程序?qū)崿F(xiàn):void interrupt Uart_Rx(){ char Rdata; Rdata = RBR; cBuffer[mm]=Rdata; if ( Rdata=='.' ) { bReceive=1; //以“.”為結(jié)束 num++; //計數(shù)所有的“.”的個數(shù) nLen=mm+1; cBuffer[nLen]='\0'; } mm++; mm%=16;(5)、顯示接收到的數(shù)據(jù),并根據(jù)前面的計數(shù)情況點(diǎn)亮相應(yīng)的LBDS燈由以下程序?qū)崿F(xiàn):void xianshi(char *add,int nn){ int aa; for(aa=0;aa<=nn;aa++) UART_trasmit(*(add++));} //一位一位的顯示相應(yīng)的數(shù)據(jù) LBDS=num;程序流程圖如下:五. 結(jié)論我們的設(shè)計是在實(shí)驗(yàn)308的基礎(chǔ)上進(jìn)行修改來完成的把原來的查。
