原来的DSP初始化程序及AD数据采样程序是这样的:<br /> .global _InitC5402 <br /> .global _OpenMcBSP<br /> .global _CloseMcBSP <br /> .global _READAD50 <br /> .global _WRITEAD50<br /> .include MMRegs.h<br />_InitC5402:<br /> NOP<br /> LD #0, DP ; reset data–page pointer<br /> STM #0, CLKMD ; software setting of DSP clock<br /> STM #0, CLKMD ; (to divider mode before setting)<br />TstStatu1:<br /> LDM CLKMD, A<br /> AND #01b, A ;poll STATUS bit<br /> BC TstStatu1, ANEQ <br /> STM #0xF7FF, CLKMD ; set C5402 DSP clock to 10MHzv <br />* STM #0x4007, CLKMD ; set C5402 DSP clock to 100MHz<br />; (based on DSK crystal at 20MHz)<br />******* Configure C5402 System Registers *******<br /> STM #0x7fff, SWWSR ; 2 wait cycle for IO space &<br />; 0 wait cycle for data&prog spaces<br /> STM #0x0000,BSCR ; set wait states for bank switch:<br />; 64k mem bank, extra 0 cycle between<br />; consecutive prog/data read<br />; STM #0x1800,ST0 ; ST0 at default setting<br />; STM #0x2900,ST1 ; ST1 at default setting(note:INTX=1)<br />; STM #0x00A0,PMST ; MC mode & OVLY=1, vectors at 0080h<br />******* Set up Timer Control Registers *******<br /> STM #0x0010, TCR ; stop on–chip timer0<br /> STM #0x0010, TCR1 ; stop on–chip timer1<br />; Timer0 is used as main loop timer<br />; STM #2499, PRD ; timer0 rate=CPUCLK/1/(PRD+1)<br />; =40M/2500=16KHz<br />* STM #6249, PRD ; if CPU at 100M/6250=16KHz <br /><br /><br /> <br />******* Initialize McBSP1 Registers *******<br /> STM SPCR1, McBSP1_SPSA ; register subaddr of SPCR1<br /> STM #0000h, McBSP1_SPSD ; McBSP1 recv = left–justify<br />; RINT generated by frame sync<br /> STM SPCR2, McBSP1_SPSA ; register subaddr for SPCR2<br />; XINT generated by frame sync<br /> STM #0000h, McBSP1_SPSD ; McBSP1 Tx = FREE(clock stops<br />; to run after SW breakpoint<br /> STM RCR1, McBSP1_SPSA ; register subaddr of RCR1<br /> STM #0040h, McBSP1_SPSD ; recv frame1 Dlength = 16 bits<br /> STM RCR2, McBSP1_SPSA ; register subaddr of RCR2 <br /> STM #0040h, McBSP1_SPSD ; recv Phase = 1<br />; ret frame2 Dlength = 16bits<br /> STM XCR1, McBSP1_SPSA ; register subaddr of XCR1<br /> STM #0040h, McBSP1_SPSD ; set the same as recv<br /> STM XCR2, McBSP1_SPSA ; register subaddr of XCR2<br /> STM #0040h, McBSP1_SPSD ; set the same as recv<br /> STM PCR, McBSP1_SPSA ; register subaddress of PCR<br /> STM #000eh, McBSP1_SPSD ; clk and frame from external (slave)<br />; FS at pulse–mode(00)<br />******* Finish DSP Initialization *******<br /> STM #0x0000, IMR ; disable peripheral interrupts<br /> STM #0xFFFF, IFR ; clear the intrupts’ flags<br /> RET ; return to main<br /> NOP<br /> NOP <br /> <br />******* Waiting for McBSP0 RX Finished *******<br />IfRxRDY1:<br /> NOP<br /> STM SPCR1, McBSP1_SPSA ; enable McBSP1 Rx<br /> LDM McBSP1_SPSD, A<br /> AND #0002h, A ; mask RRDY bit<br /> BC IfRxRDY1, AEQ ; keep checking<br /> NOP<br /> NOP<br /> RET ; return<br /> NOP<br /> NOP<br />******* Waiting for McBSP0 TX Finished *******<br />IfTxRDY1:<br /> NOP<br /> STM SPCR2, McBSP1_SPSA ; enable McBSP1 Tx<br /> LDM McBSP1_SPSD, A<br /> AND #0002h, A ; mask TRDY bit<br /> BC IfTxRDY1, AEQ ; keep checking <br /> NOP<br /> NOP<br /> RET ; return<br /> NOP<br /> NOP<br /><br />******************************************<br />******************************************<br />_OpenMcBSP:<br /><br /> stm 1000h,ar0<br /> st 00,*ar0<br /> portw *ar0,8001h ;reset AD50 XF=0<br /> NOP<br /> call wait<br /> NOP<br /> NOP<br /> NOP<br /> STM SPCR1, McBSP1_SPSA ; enable McBSP1 RX for ADC data in<br /> LDM McBSP1_SPSD,A<br /> OR #0x0001, A<br /> STLM A, McBSP1_SPSD<br /> STM SPCR2, McBSP1_SPSA ; enable McBSP1 TX for DTMF out<br /> LDM McBSP1_SPSD,A<br /> OR #0x0001, A<br /> STLM A, McBSP1_SPSD<br /> LD #0h, DP ; load data page 0<br /> rpt #23<br /> NOP <br /> stm 1000h,ar0<br /> st 0xff,*ar0<br /> portw *ar0,8001h ;out reset aD50 XF=1<br /> NOP<br /> NOP<br /> ; STM 0x4007,CLKMD <br />; CALL IfTxRDY1<br />; STM #0x0101, McBSP1_DXR1<br /> <br />; CALL IfTxRDY1<br />; STM #0x0208, McBSP1_DXR1<br /><br />;; rsbx xf<br />;; NOP<br />;;NOP <br /> CALL IfTxRDY1<br /> STM #0x0001, McBSP1_DXR1;request secondary communication<br /> NOP<br /> CALL IfTxRDY1 <br /> STM #0100h, McBSP1_DXR1;write 00h to register 1<br /><br /> CALL IfTxRDY1<br /> STM #0000h, McBSP1_DXR1 <br /> <br /> NOP<br /> NOP<br /> rpt #20h<br /> nop<br /> <br /> CALL IfTxRDY1<br /> STM #0x0001, McBSP1_DXR1;request secondary communication<br /> CALL IfTxRDY1 <br /> STM #0200h, McBSP1_DXR1;write 00h to register 2 <br /> <br /> CALL IfTxRDY1<br /> STM #0000h, McBSP1_DXR1 <br /> <br /> CALL IfTxRDY1<br /> STM #0x0001, McBSP1_DXR1;request secondary communication<br /> CALL IfTxRDY1 <br /> STM #0300h, McBSP1_DXR1;write 00h to register 3<br /><br /> CALL IfTxRDY1<br /> STM #0000h, McBSP1_DXR1 <br /><br /> CALL IfTxRDY1<br /> STM #0x0001, McBSP1_DXR1;request secondary communication<br /> CALL IfTxRDY1 <br /> STM #0490h, McBSP1_DXR1;write 00h to register 4<br /> ;bypass internal DPLL<br /> ;and select the Sample Frequency <br /><br /> CALL IfTxRDY1<br /> STM #0000h, McBSP1_DXR1 <br /> <br />; CALL IfTxRDY1<br />; STM #0x0001, McBSP1_DXR1<br />; CALL IfTxRDY1<br />; STM #0102h, McBSP1_DXR1 ;enable digital loopback <br /> <br />; CALL IfTxRDY1<br />; STM #0x0001, McBSP1_DXR1<br />; CALL IfTxRDY1<br />; STM #0208h, McBSP1_DXR1 ;enable analog loopback<br /><br /> RET<br /> NOP<br /> NOP<br /><br /> <br />*********************<br />_CloseMcBSP:<br /> STM SPCR1, McBSP1_SPSA ; disable McBSP0 RX<br /> LDM McBSP1_SPSD,A<br /> AND #0xFFFE, A<br /> STLM A, McBSP1_SPSD<br /> STM SPCR2, McBSP1_SPSA ; disable McBSP0 TX<br /> LDM McBSP1_SPSD,A<br /> AND #0xFFFE, A<br /> STLM A, McBSP1_SPSD<br /> RPT #5<br /> RET<br /> NOP<br /> NOP<br /><br /><br /><br />_READAD50:<br /> stm 0x00ff,ar3<br /> stm 0x3000,ar2<br /> <br />loopa:<br /> CALL IfRxRDY1<br /> ldm McBSP1_DRR1,b<br /> stl b,*ar2+<br /> banz loopa,*ar3- <br /> <br /> nop<br /> nop <br /> ret<br /> nop<br /> nop<br /> <br />_WRITEAD50:<br /> stm 0x00ff,ar3<br /> stm 0x3100,ar2<br />loopb:<br /> CALL IfTxRDY1 <br /> ldu *ar2+,B<br /> and #0fffeh,b ;mask the LSB<br /> stlm B, McBSP1_DXR1<br /> banz loopb,*ar3-<br /> nop<br /> nop<br /> ret<br /> nop<br /> nop <br /> <br />wait: <br /> stm 20h,ar3<br />loop1: <br /> stm 020h,ar4<br />loop2:<br /> banz loop2,*ar4-<br /> banz loop1,*ar3-<br /> ret <br /> nop<br /> nop<br /> nop<br /> nop<br /> <br /> .end<br />************************************************************************<br />** End of File –– InitC5402.asm<br />************************************************************************<br /><br /><br />而FIR程序是这样的:<br />STACK_ADDR .set 0x0500<br />SIZE .set 10<br /> .global input<br /> .bss Buffer_new, 16 ;(10 for circular buffer)<br /> .bss Buffer_old, 16 ;(10 for circular buffer)<br /> .bss Input, 1<br /> .bss Output, 1<br /><br /> .mmregs<br /> .global main<br /><br />;------------------------------------------------------------------------------<br /> .text<br />main:<br /> stm #STACK_ADDR, SP<br /> stm #0x00a8, PMST ;store IPTR<br /> stm #0x0000, SWWSR<br /><br /> ssbx FRCT<br /> ssbx OVM<br /> ssbx SXM<br /><br /> ;clear buffer<br /> stm #Buffer_new, AR2<br /> rptz A, #SIZE-1<br /> stl A, *AR2+<br /><br /> stm #Buffer_old, AR3<br /> rptz A, #SIZE-1<br /> stl A, *AR3+<br /><br /> ;add last half coefficients for FFT display<br /> stm #FIR_Coeff, AR4<br /> stm #FIR_Coeff+2*SIZE-1, AR2<br /> rpt #SIZE-1<br /> mvdd *AR4+, *AR2-<br /><br /> stm #Buffer_new, AR2<br /> stm #Buffer_old, AR3<br /> stm #SIZE, BK<br /> stm #-1, AR0<br />fir_loop:<br /> ;read input<br /> ld *(Input), A<br /> stl A, *AR2<br /><br /> ;filtering<br /> add *AR2+0%, *AR3+0%, A<br /> rptz B, #SIZE-1<br /> firs *AR2+0%, *AR3+0%, FIR_Coeff<br /> sth B, *(Output) ;store output<br /> mar *+AR2(2)%<br /> mar *AR3+%<br /> mvdd *AR2, *AR3+0% ;update buffer<br /> b fir_loop<br /><br />dead_loop:<br /> nop<br /> nop<br /> nop<br /> nop<br /> b dead_loop<br /><br />;------------------------------------------------------------------------------<br /> .sect "vectors"<br />int_RESET:<br /> b main<br /> nop<br /> nop<br /><br /> .space 124*16<br />;------------------------------------------------------------------------------<br /> .data<br />FIR_Coeff:<br /> .word 53, 190, -364, -277, 152<br /> .word -124, 3789, -2052, -8950, 7631<br />;------------------------------------------------------------------------------<br /><br />;end of lab6.s54 <br /><br />如何把这两个程序连接起来,实现实时的滤波功能?请大虾指教,最好帮助连接好,不胜感激!<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
|