yuxingming 发表于 2009-2-18 11:20

AD转换程序如何与FIR程序接口实现DSP的实时滤波?

现在的教科书上的DSP的数字滤波器例子程序都只给出了FIR算法实现的程序,输入波形数据要在电脑中做成数据文件注入,这不符合实际。本人编写了一个通过TLC320AD50C采样后输入FIR程序进行滤波的汇编语言程序,但可能是AD转换程序与FIR程序的接口部分程序没有写好,滤波器没有成功。我把程序写在这里,请大虾指教!<br />;***********************&nbsp;On&nbsp;Line&nbsp;FIR&nbsp;Filter&nbsp;**************************&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />STACK_ADDR&nbsp;&nbsp;&nbsp;&nbsp;.set&nbsp;&nbsp;&nbsp;&nbsp;0x0500<br />SIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.set&nbsp;&nbsp;&nbsp;&nbsp;10<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;.bss&nbsp;&nbsp;&nbsp;&nbsp;Buffer_new,&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;(10&nbsp;for&nbsp;circular&nbsp;buffer)<br />&nbsp;&nbsp;&nbsp;&nbsp;.bss&nbsp;&nbsp;&nbsp;&nbsp;Buffer_old,&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;(10&nbsp;for&nbsp;circular&nbsp;buffer)<br />&nbsp;&nbsp;&nbsp;&nbsp;.bss&nbsp;&nbsp;&nbsp;&nbsp;Input,&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;.bss&nbsp;&nbsp;&nbsp;&nbsp;Output,&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;.include&nbsp;MMRegs.h<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;.global&nbsp;&nbsp;&nbsp;&nbsp;main<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;.text<br /><br />main:<br />;******************InitC5402***************************************<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;LD&nbsp;#0,&nbsp;DP&nbsp;;&nbsp;reset&nbsp;data–page&nbsp;pointer<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;#0,&nbsp;CLKMD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;software&nbsp;setting&nbsp;of&nbsp;DSP&nbsp;clock<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;#0,&nbsp;CLKMD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;(to&nbsp;divider&nbsp;mode&nbsp;before&nbsp;setting)<br />TstStatu1:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDM&nbsp;CLKMD,&nbsp;A<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AND&nbsp;#01b,&nbsp;A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;poll&nbsp;STATUS&nbsp;bit<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BC&nbsp;TstStatu1,&nbsp;ANEQ&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;#0xF7FF,&nbsp;CLKMD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;set&nbsp;C5402&nbsp;DSP&nbsp;clock&nbsp;to&nbsp;10MHzv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />*******&nbsp;Configure&nbsp;C5402&nbsp;System&nbsp;Registers&nbsp;*******<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;#0x7fff,&nbsp;SWWSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;2&nbsp;wait&nbsp;cycle&nbsp;for&nbsp;IO&nbsp;space&nbsp;&&nbsp;0&nbsp;wait&nbsp;cycle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;for&nbsp;data&prog&nbsp;spaces<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;#0x0000,BSCR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;set&nbsp;wait&nbsp;states&nbsp;for&nbsp;bank&nbsp;switch:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;64k&nbsp;mem&nbsp;bank,&nbsp;extra&nbsp;0&nbsp;cycle&nbsp;between<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;consecutive&nbsp;prog/data&nbsp;read<br />&nbsp;&nbsp;&nbsp;&nbsp;stm&nbsp;&nbsp;&nbsp;&nbsp;#STACK_ADDR,&nbsp;SP<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />*******&nbsp;Set&nbsp;up&nbsp;Timer&nbsp;Control&nbsp;Registers&nbsp;*******<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;#0x0010,&nbsp;TCR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;stop&nbsp;on–chip&nbsp;timer0<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;#0x0010,&nbsp;TCR1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;stop&nbsp;on–chip&nbsp;timer1<br />;&nbsp;Timer0&nbsp;is&nbsp;used&nbsp;as&nbsp;main&nbsp;loop&nbsp;timer<br />;&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;#2499,&nbsp;PRD&nbsp;;&nbsp;timer0&nbsp;rate=CPUCLK/1/(PRD+1)<br />;&nbsp;=40M/2500=16KHz<br />*&nbsp;STM&nbsp;#6249,&nbsp;PRD&nbsp;;&nbsp;if&nbsp;CPU&nbsp;at&nbsp;100M/6250=16KHz&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />*******&nbsp;Initialize&nbsp;McBSP1&nbsp;Registers&nbsp;*******<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;SPCR1,&nbsp;McBSP1_SPSA&nbsp;;&nbsp;register&nbsp;subaddr&nbsp;of&nbsp;SPCR1<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;#0000h,&nbsp;McBSP1_SPSD&nbsp;;&nbsp;McBSP1&nbsp;recv&nbsp;=&nbsp;left–justify<br />;&nbsp;RINT&nbsp;generated&nbsp;by&nbsp;frame&nbsp;sync<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;SPCR2,&nbsp;McBSP1_SPSA&nbsp;;&nbsp;register&nbsp;subaddr&nbsp;for&nbsp;SPCR2<br />;&nbsp;XINT&nbsp;generated&nbsp;by&nbsp;frame&nbsp;sync<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;#0000h,&nbsp;McBSP1_SPSD&nbsp;;&nbsp;McBSP1&nbsp;Tx&nbsp;=&nbsp;FREE(clock&nbsp;stops<br />;&nbsp;to&nbsp;run&nbsp;after&nbsp;SW&nbsp;breakpoint<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;RCR1,&nbsp;McBSP1_SPSA&nbsp;;&nbsp;register&nbsp;subaddr&nbsp;of&nbsp;RCR1<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;#0040h,&nbsp;McBSP1_SPSD&nbsp;;&nbsp;recv&nbsp;frame1&nbsp;Dlength&nbsp;=&nbsp;16&nbsp;bits<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;RCR2,&nbsp;McBSP1_SPSA&nbsp;;&nbsp;register&nbsp;subaddr&nbsp;of&nbsp;RCR2&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;#0040h,&nbsp;McBSP1_SPSD&nbsp;;&nbsp;recv&nbsp;Phase&nbsp;=&nbsp;1<br />;&nbsp;ret&nbsp;frame2&nbsp;Dlength&nbsp;=&nbsp;16bits<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;XCR1,&nbsp;McBSP1_SPSA&nbsp;;&nbsp;register&nbsp;subaddr&nbsp;of&nbsp;XCR1<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;#0040h,&nbsp;McBSP1_SPSD&nbsp;;&nbsp;set&nbsp;the&nbsp;same&nbsp;as&nbsp;recv<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;XCR2,&nbsp;McBSP1_SPSA&nbsp;;&nbsp;register&nbsp;subaddr&nbsp;of&nbsp;XCR2<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;#0040h,&nbsp;McBSP1_SPSD&nbsp;;&nbsp;set&nbsp;the&nbsp;same&nbsp;as&nbsp;recv<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;PCR,&nbsp;McBSP1_SPSA&nbsp;;&nbsp;register&nbsp;subaddress&nbsp;of&nbsp;PCR<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;#000eh,&nbsp;McBSP1_SPSD&nbsp;;&nbsp;clk&nbsp;and&nbsp;frame&nbsp;from&nbsp;external&nbsp;(slave)<br />;&nbsp;FS&nbsp;at&nbsp;pulse–mode(00)<br />*******&nbsp;Finish&nbsp;DSP&nbsp;Initialization&nbsp;*******<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;#0x0000,&nbsp;IMR&nbsp;;&nbsp;disable&nbsp;peripheral&nbsp;interrupts<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;#0xFFFF,&nbsp;IFR&nbsp;;&nbsp;clear&nbsp;the&nbsp;intrupts’&nbsp;flags<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />******************************************<br />******************************************<br />_OpenMcBSP:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;stm&nbsp;&nbsp;&nbsp;&nbsp;1000h,ar0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00,*ar0<br />&nbsp;&nbsp;&nbsp;&nbsp;portw&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*ar0,8001h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;reset&nbsp;AD50&nbsp;&nbsp;XF=0<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPCR1,&nbsp;McBSP1_SPSA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;enable&nbsp;McBSP1&nbsp;RX&nbsp;for&nbsp;ADC&nbsp;data&nbsp;in<br />&nbsp;&nbsp;&nbsp;&nbsp;LDM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;McBSP1_SPSD,A<br />&nbsp;&nbsp;&nbsp;&nbsp;OR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#0x0001,&nbsp;A<br />&nbsp;&nbsp;&nbsp;&nbsp;STLM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A,&nbsp;McBSP1_SPSD<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPCR2,&nbsp;McBSP1_SPSA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;enable&nbsp;McBSP1&nbsp;TX&nbsp;for&nbsp;DTMF&nbsp;out<br />&nbsp;&nbsp;&nbsp;&nbsp;LDM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;McBSP1_SPSD,A<br />&nbsp;&nbsp;&nbsp;&nbsp;OR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#0x0001,&nbsp;A<br />&nbsp;&nbsp;&nbsp;&nbsp;STLM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A,&nbsp;McBSP1_SPSD<br />&nbsp;&nbsp;&nbsp;&nbsp;LD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#0h,&nbsp;DP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;load&nbsp;data&nbsp;page&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;RPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#23<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1000h,&nbsp;AR0<br />&nbsp;&nbsp;&nbsp;&nbsp;ST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xff,&nbsp;*AR0<br />&nbsp;&nbsp;&nbsp;&nbsp;PORTW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*AR0,8001h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;out&nbsp;reset&nbsp;aD50&nbsp;XF=1<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;CALL&nbsp;IfTxRDY1<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;#0x0001,&nbsp;McBSP1_DXR1&nbsp;&nbsp;&nbsp;&nbsp;;request&nbsp;secondary&nbsp;communication<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;CALL&nbsp;IfTxRDY1&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;#0100h,&nbsp;McBSP1_DXR1&nbsp;&nbsp;&nbsp;&nbsp;;write&nbsp;00h&nbsp;to&nbsp;register&nbsp;1<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;CALL&nbsp;IfTxRDY1<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;#0000h,&nbsp;McBSP1_DXR1&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;RPT&nbsp;&nbsp;&nbsp;&nbsp;#20h<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;CALL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IfTxRDY1<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#0x0001,&nbsp;McBSP1_DXR1&nbsp;&nbsp;&nbsp;&nbsp;;request&nbsp;secondary&nbsp;communication<br />&nbsp;&nbsp;&nbsp;&nbsp;CALL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IfTxRDY1&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#0200h,&nbsp;McBSP1_DXR1&nbsp;&nbsp;&nbsp;&nbsp;;write&nbsp;00h&nbsp;to&nbsp;register&nbsp;2&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;CALL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IfTxRDY1<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#0000h,&nbsp;McBSP1_DXR1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CALL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IfTxRDY1<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#0x0001,&nbsp;McBSP1_DXR1&nbsp;&nbsp;&nbsp;&nbsp;;request&nbsp;secondary&nbsp;communication<br />&nbsp;&nbsp;&nbsp;&nbsp;CALL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IfTxRDY1&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#0300h,&nbsp;McBSP1_DXR1&nbsp;&nbsp;&nbsp;&nbsp;;write&nbsp;00h&nbsp;to&nbsp;register&nbsp;3<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;CALL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IfTxRDY1<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#0000h,&nbsp;McBSP1_DXR1&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;CALL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IfTxRDY1<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#0x0001,&nbsp;McBSP1_DXR1&nbsp;&nbsp;&nbsp;&nbsp;;request&nbsp;secondary&nbsp;communication<br />&nbsp;&nbsp;&nbsp;&nbsp;CALL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IfTxRDY1&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#0490h,&nbsp;McBSP1_DXR1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;write&nbsp;00h&nbsp;to&nbsp;register&nbsp;4<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;bypass&nbsp;internal&nbsp;DPLL<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;and&nbsp;select&nbsp;the&nbsp;Sample&nbsp;Frequency&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;CALL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IfTxRDY1<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#0000h,&nbsp;McBSP1_DXR1&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />;&nbsp;&nbsp;&nbsp;&nbsp;CALL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IfTxRDY1<br />;&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#0x0001,&nbsp;McBSP1_DXR1<br />;&nbsp;&nbsp;&nbsp;&nbsp;CALL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IfTxRDY1<br />;&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#0102h,&nbsp;McBSP1_DXR1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;enable&nbsp;digital&nbsp;loopback&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />;&nbsp;&nbsp;&nbsp;&nbsp;CALL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IfTxRDY1<br />;&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#0x0001,&nbsp;McBSP1_DXR1<br />;&nbsp;&nbsp;&nbsp;&nbsp;CALL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IfTxRDY1<br />;&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#0208h,&nbsp;McBSP1_DXR1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;enable&nbsp;analog&nbsp;loopback<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br /><br /><br />_READAD50:<br />&nbsp;&nbsp;&nbsp;&nbsp;CALL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IfRxRDY1<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;ldm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;McBSP1_DRR1,b<br />&nbsp;&nbsp;&nbsp;&nbsp;stl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b,&nbsp;*(Input)<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;nop<br />&nbsp;&nbsp;&nbsp;&nbsp;nop&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />;------------------------------------------------------------------------------<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;;clear&nbsp;buffer<br />&nbsp;&nbsp;&nbsp;&nbsp;stm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#Buffer_new,&nbsp;AR2<br />&nbsp;&nbsp;&nbsp;&nbsp;rptz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A,&nbsp;#SIZE-1<br />&nbsp;&nbsp;&nbsp;&nbsp;stl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A,&nbsp;*AR2+<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;stm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#Buffer_old,&nbsp;AR3<br />&nbsp;&nbsp;&nbsp;&nbsp;rptz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A,&nbsp;#SIZE-1<br />&nbsp;&nbsp;&nbsp;&nbsp;stl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A,&nbsp;*AR3+<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;;add&nbsp;last&nbsp;half&nbsp;coefficients&nbsp;for&nbsp;FFT&nbsp;display<br />&nbsp;&nbsp;&nbsp;&nbsp;stm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#FIR_Coeff,&nbsp;AR4<br />&nbsp;&nbsp;&nbsp;&nbsp;stm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#FIR_Coeff+2*SIZE-1,&nbsp;AR2<br />&nbsp;&nbsp;&nbsp;&nbsp;rpt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#SIZE-1<br />&nbsp;&nbsp;&nbsp;&nbsp;mvdd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*AR4+,&nbsp;*AR2-<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;stm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#Buffer_new,&nbsp;AR2<br />&nbsp;&nbsp;&nbsp;&nbsp;stm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#Buffer_old,&nbsp;AR3<br />&nbsp;&nbsp;&nbsp;&nbsp;stm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#SIZE,&nbsp;BK<br />&nbsp;&nbsp;&nbsp;&nbsp;stm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#-1,&nbsp;AR0<br />fir_loop:<br />&nbsp;&nbsp;&nbsp;&nbsp;;read&nbsp;input<br />&nbsp;&nbsp;&nbsp;&nbsp;ld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*(Input),&nbsp;A<br />&nbsp;&nbsp;&nbsp;&nbsp;stl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A,&nbsp;*AR2<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;;filtering<br />&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*AR2+0%,&nbsp;*AR3+0%,&nbsp;A<br />&nbsp;&nbsp;&nbsp;&nbsp;rptz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B,&nbsp;#SIZE-1<br />&nbsp;&nbsp;&nbsp;&nbsp;firs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*AR2+0%,&nbsp;*AR3+0%,&nbsp;FIR_Coeff<br />&nbsp;&nbsp;&nbsp;&nbsp;sth&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B,&nbsp;*(Output)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;store&nbsp;output<br />&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IfTxRDY1&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldu&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*(Output),&nbsp;B<br />&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#0fffeh,&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;mask&nbsp;the&nbsp;LSB<br />&nbsp;&nbsp;&nbsp;&nbsp;stlm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B,&nbsp;McBSP1_DXR1<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;mar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*+AR2(2)%<br />&nbsp;&nbsp;&nbsp;&nbsp;mar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*AR3+%<br />&nbsp;&nbsp;&nbsp;&nbsp;mvdd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*AR2,&nbsp;*AR3+0%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;update&nbsp;buffer<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fir_loop<br />&nbsp;&nbsp;&nbsp;&nbsp;nop<br />&nbsp;&nbsp;&nbsp;&nbsp;nop<br /><br /><br />;------------------------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;.data<br />FIR_Coeff:<br />&nbsp;&nbsp;&nbsp;&nbsp;.word&nbsp;&nbsp;&nbsp;&nbsp;53,&nbsp;190,&nbsp;-364,&nbsp;-277,&nbsp;152<br />&nbsp;&nbsp;&nbsp;&nbsp;.word&nbsp;&nbsp;&nbsp;&nbsp;-124,&nbsp;3789,&nbsp;-2052,&nbsp;-8950,&nbsp;7631<br />;------------------------------------------------------------------------------<br /><br /><br />;*******&nbsp;Waiting&nbsp;for&nbsp;McBSP0&nbsp;RX&nbsp;Finished&nbsp;*******<br />IfRxRDY1:<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPCR1,&nbsp;McBSP1_SPSA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;enable&nbsp;McBSP1&nbsp;Rx<br />&nbsp;&nbsp;&nbsp;&nbsp;LDM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;McBSP1_SPSD,&nbsp;A<br />&nbsp;&nbsp;&nbsp;&nbsp;AND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#0002h,&nbsp;A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;mask&nbsp;RRDY&nbsp;bit<br />&nbsp;&nbsp;&nbsp;&nbsp;BC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IfRxRDY1,&nbsp;AEQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;keep&nbsp;checking<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;RET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;return<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br /><br />*******&nbsp;Waiting&nbsp;for&nbsp;McBSP0&nbsp;TX&nbsp;Finished&nbsp;*******<br />IfTxRDY1:<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;STM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPCR2,&nbsp;McBSP1_SPSA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;enable&nbsp;McBSP1&nbsp;Tx<br />&nbsp;&nbsp;&nbsp;&nbsp;LDM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;McBSP1_SPSD,&nbsp;A<br />&nbsp;&nbsp;&nbsp;&nbsp;AND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#0002h,&nbsp;A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;mask&nbsp;TRDY&nbsp;bit<br />&nbsp;&nbsp;&nbsp;&nbsp;BC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IfTxRDY1,&nbsp;AEQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;keep&nbsp;checking&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;RET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;return<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br /><br />;-------------------------------------------------------------------------------------------<br />dead_loop:<br />&nbsp;&nbsp;&nbsp;&nbsp;nop<br />&nbsp;&nbsp;&nbsp;&nbsp;nop<br />&nbsp;&nbsp;&nbsp;&nbsp;nop<br />&nbsp;&nbsp;&nbsp;&nbsp;nop<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dead_loop<br /><br />;------------------------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;.sect&nbsp;&nbsp;&nbsp;&nbsp;&quot;vectors&quot;<br />int_RESET:<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main<br />&nbsp;&nbsp;&nbsp;&nbsp;nop<br />&nbsp;&nbsp;&nbsp;&nbsp;nop<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;.space&nbsp;&nbsp;&nbsp;&nbsp;124*16<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;.end<br />*********************************************************************<br />**&nbsp;End&nbsp;of&nbsp;File&nbsp;––&nbsp;InitC5402.asm<br />*********************************************************************<br /><br /><br />

yuxingming 发表于 2009-2-18 11:31

AD转换程序如何与FIR程序接口实现DSP的实时滤波?

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

yuxingming 发表于 2009-2-20 20:43

AD转换程序如何与FIR程序接口实现DSP的实时滤波?

怎么一个帮忙的都没有!好失望.........<br />老狼,老狼呢?

老狼 发表于 2009-2-21 00:59

晕!

1:开一个定时器,在定时器里面进行AD转化,同时设定FIR_START_LBL=0;这是为了保证每个采样点间的等间隔。采样数据存储到一个数组里面,每采集一次,counter加一,,counter=0,这个数组最好大于你的基波采样点的10倍,这样方便调程序。<br />2:FIR放到主程序,当数组的数据达到你的FIR参数长度时,FIR_START_LBL=1;开始启动一次FIR程序(只进行一次FIR,就是去掉你FIR程序外面的那个大循环),输出第一个滤波数据,AD采集一次,启动一次FIR.<br />3:当counter到数组尾的时候,停止程序,看输出波形。如果你能调到这一步,就基本上能看到实时滤波的效果了。<br />4:修改上述程序,达到真正的实时滤波。主要是AD采样数组循环存贮!这部分你动一下脑子!<br /><br />算法可以用汇编写,主程序就用C吧!看着麻烦!修改起来也不方便!<br />

老狼 发表于 2009-2-21 01:27

最近发现自己的语言表达能力真的很差!

unsigned&nbsp;char&nbsp;FIR_START_LBL=0;//FIR启动标志,当数组的数据达到你的FIR参数长度时,FIR_START_LBL=1<br />unsigned&nbsp;short&nbsp;int&nbsp;counter;//AD每采集一次,counter加一<br />unsigned&nbsp;ADInput;//假设每个波采集32点<br />unsigned&nbsp;char&nbsp;AD_NewData_Lbl;<br />Timer()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ADInput=AD_Start()//采集一次,采样数据存储到一个数组里面,<br />&nbsp;&nbsp;&nbsp;counter++<br />&nbsp;&nbsp;&nbsp;AD_NewData_Lbl=1;//有新的数据进来<br />&nbsp;&nbsp;&nbsp;if(counter&gt=320)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;counter=0;&nbsp;&nbsp;//断点设在这里,前3步在这里调试完,第4步,需要修改这里。怎么修改?自己想!<br />&nbsp;&nbsp;&nbsp;}<br />}<br /><br />main()<br />{<br />......<br />&nbsp;&nbsp;&nbsp;FIR_START_LBL=0;<br />&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;......<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(counter&gtFIRCOF)//FIRCOF&nbsp;FIR参数长度<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FIR_START_LBL=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(1==FIR_START_LBL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(1==AD_NewData_Lbl)//采集一个点,启动一次FIR程序<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AD_NewData_Lbl=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FirOut=&nbsp;FIR_OnlyOne();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FirOutCounter++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}<br /><br />}<br /><br />//基本上,就是这个逻辑了!<br /><br />

computer00 发表于 2009-2-21 09:56

通常实时滤波不是这么干的吧...

俺用的是像卷积那样的,每输入一个数据,然后移位,做乘加运算,输出一个结果。

老狼 发表于 2009-2-21 12:26

computer00

‘像卷积那样的,每输入一个数据,然后移位,做乘加运算,输出一个结果’<br />--------这部分在函数FIR_OnlyOne()中实现的。<br /><br />对于FIR,实际上,输入的缓冲区大小,对于N级的FIR滤波器,在数据存储器中开辟一个称之为滑窗的N个单元的缓冲区,滑窗中存放最新的N个输入样本。每次输入新的样本时,一新样本改写滑窗中的最老的数据,而滑窗中的其他数据不需要移动。这些在第4部进行修改,也可以不这样修改,加大输入输出缓冲区,是为了可以在Graph中,方便看到滤波的效果。而且,很多时候,需要保存原始数据和滤波后的数据。<br /><br />这里还加了一个输入缓冲区的控制FIR_START_LBL,必须先有N个数据,才能做一次FIR_OnlyOne(),输出一个数据,结果保存在FirOut[]中。也可以方便的用<br />Graph看到。

yuxingming 发表于 2009-2-22 21:51

AD转换程序如何与FIR程序接口实现DSP的实时滤波?

谢谢老狼,谢谢大家!<br />我再试试.

小研究 发表于 2009-2-25 09:10

滤波通常是采样一点滤波一点

滤波完事之后再扔到存储区里。

zhu_chunyan86 发表于 2015-1-8 10:06

页: [1]
查看完整版本: AD转换程序如何与FIR程序接口实现DSP的实时滤波?