⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 实时回放5410.c

📁 DSP5410用于语音实时回放的主程序
💻 C
字号:
		.title "bigt8n"

		.include "init54x.inc"
		.include "initbsp.inc"
		.include "cpu_reg.inc"
		.include "K_def.inc"

		.mmregs
RBLENG		.set   7FFFH		;循环buffer的长度

;FOLLOWING IS MACRO DEFINE FOR AD 以下是为AD定义的宏
;**********************************************************************
;设置写MCBSP加法寄存器,将addr和val分别送入地址和数据中
WR_MCBSP_SUB_REG        .macro  addr,val
                        stm     addr,SPSA0	;addr -> SPSA0
                        nop
                        stm     val,SPSD0   ;val->SPSD0
                        nop
                        .endm
;设置读MCBSP减法寄存器存器,
RD_MCBSP_SUB_REG        .macro  addr,acc
                        stm     #:addr:,SPSA0
                        nop
                        ldm     SPSD0,acc	;SPSD0 -> acc;送入acc累加器
                        nop
                        nop
                        nop
                          .endm

WAITTRX   .macro             ; Wait for serial port to Rx word
WAITR?
        RD_MCBSP_SUB_REG        SPCR20,A
        and #1<<1, A
        bc   WAITR?, AEQ
          .endm

PROGREG   .macro    progword
        WAITTRX
	stm  #01h,DXR10       
        WAITTRX
        stm     :progword:,DXR10
          .endm               

wait   .macro	val
	RPT val 		;repeat the #val of times 
	NOP 			;do nothing in the loop
	.endm 			

;*********************************************************************

	.def	MAIN_START 


		.data             ;汇编进初始化的数据段.data
RES_SPACE:
		.space	07E0h		;reserve 127 words and clear 0
							;保留07E0h比特的空间(即127个字的空间),并清零.
		.word   8000h		
		.word   0000H


        .sect    ".DISPLAY" 	;汇编进命名的(初始化)段,后面引号是段名.
		.label   DISPLAY_SRC	;指示当前段内的装入时间地址.
		.word	08AAH		;INDICATE 8BITS PARALLEL BOOT MODE
		.word	7fffH		;VALUE FOR SWWSR
		.word	0F000H		;VALUE FOR BSCR
		.word	0000h		;xpc for entry point ;  xpc是程序计数器扩展寄存器
		.word   0100h       ;pc for entry point
		.word	02f0h		;size of first section; 第一部分大小
		.word	0000h		;xpc for first section
		.word	0100h		;pc for first section
		.copy   "vector.asm" ;转向读取该文件的源代码,然后转回.
MAIN_START:                 ;主程序起始点
DISPLAY:
		LD	#00H,DP         ;将立即数加载到DP中
		STM     #K_SP,SP    ;将K_SP的值写入SP中,一下类同.
		STM     #K_ST0,ST0	;DP=0,ARP=0
		STM     #K_ST1,ST1	;INTM=1,SXM=0,CMPT=0,XF=0
		RSBX    XF		    ;置XF=0
	    STM     #K_PMST,PMST    ;IPTR=02,MP/MC=1,OVLY=1,AVIS=0,drom=1, clkoff=1,
		STM     #K_SWWSR,SWWSR	;I/O is ONE cycle wait 
		STM     #K_SWCR,SWCR
		STM     #K_BSCR,BSCR
		STM     #SPCR12,SPSA2	;POINT TO SPCR12
		STM     #0000H,SPSD2	;CONFIG SPCR1 TO 0000H
		STM     #SPCR22,SPSA2	;POINT TO SPCR22
		STM     #0000H,SPSD2    ;CONFIG SPCR2 TO 0000H
		STM     #PCR2,SPSA2	    ;POINT TO PCR2
		STM     #3F6FH,SPSD2	;0011111101101111b,SET BDX2=1
		ST      #0FFF7H,PORT2_BUF
		PORTW   PORT2_BUF,0002H	;将PORT2_BUF内数写入0002H地址	

		STM	#0b,CLKMD
T_STATU0X:                      ;该模块检查CLKMD是否清零
		LDM	CLKMD,A             ;将CLKMD加载到累加器A
		AND     #01b,A          
		BC	T_STATU0X,ANEQ      ;累加器A!=0,则跳到T_STATU0X
		STM	#0b,CLKMD

;*************************************************************************
;*   audio_init:
;*************************************************************************
_DSS_init                  

     WR_MCBSP_SUB_REG   SPCR10,	#SPCR10_VAL	; reset McBSP0;左边地址右边数值
     WR_MCBSP_SUB_REG   SPCR20,	#SPCR20_VAL ;将SPCR20_VAL的值送入SPCR20指示的地址中  

     WAIT	#1000H  ;等待1000H个周期

     WR_MCBSP_SUB_REG   PCR0,	#PCR0_VAL
     WR_MCBSP_SUB_REG   RCR10,	#RCR10_VAL
     WR_MCBSP_SUB_REG   RCR20,	#RCR20_VAL
     WR_MCBSP_SUB_REG   XCR10,	#XCR10_VAL
     WR_MCBSP_SUB_REG   XCR20,	#XCR20_VAL
        
     WAIT	#1000H

; set interrupts to come from serial ports not DMA
; by clearing bits 6 and 7 in DMPREC;将DMPREC第6,7位清零
     andm       #0ff3fh, 54h   ;结果存入54H地址

;AFTER ENABLE mcbsp0, SEND 0 TO EXTERNAL TO SET UP DATA ACQUISTION AS REQUIRED 
     stm 	#0, DXR10

; now enable McBSP transmit and receive;使MCSBP可以进行传输和接收工作
     WR_MCBSP_SUB_REG   SPCR10,#SPCR10_VAL | 1
     WR_MCBSP_SUB_REG   SPCR20,#SPCR20_VAL | 1 

 	WAIT	#1000H
	
	CALL	DELAY      
	CALL 	DELAY
;*************************************************************************
;*   AIC_INIT:
;*   Initialization of TLC320AD50.           
;*************************************************************************
_AIC_INIT    
	WAIT	#1000H	
	PROGREG #AD50REG3_VAL  ;将立即数送入DXR10
	WAIT	#1000H
	PROGREG #AD50REG4_VAL  
	nop
	nop
	nop
	CALL	DELAY    
	CALL	DELAY    
	CALL	DELAY    

	ld      DRR10, A    ;将DRR10加载到A中
	ld      DRR10, A
	STM	#0000H,DXR10
	STM	#0000H,DXR10


BOOT_DISPLAY
		STM	#0001H,AR5  ;循环两次
LOOPF:          ANDM    #NOTEPT,PORT2_BUF
		portw   PORT2_BUF,0002h      
		CALL	DELAY
		ORM     #EPTLED,PORT2_BUF   ;两者相或存到PORT2_BUF
                portw   PORT2_BUF,0002h
		CALL	DELAY
		BANZ	LOOPF,*AR5-     ;AR5不为零就转到LOOPF

INIT                            ;初始化
		STM     #K_IMR,IMR		;ENABLE INT1 AND BRINT0
		STM     #8000H,AR5
		STM     #8000H,AR6
		STM     #RBLENG,BK      ;前面设定
   		ST      #00FFH,TEMP		;EMPTY STATUS 设置TEMP                       
		ST      #0FFF7H,PORT2_BUF
		ST      #00FFH,INT1FLAG		;HAVE INTERRUPT
		ORM     #EPTLED,PORT2_BUF   ;两者相或存到PORT2_BUF
		PORTW   PORT2_BUF,0002H		;DISPLAY EMPTY STATUS
		RSBX    INTM			;ENABLE INTERRUPT

		STM     #K_CLKMD,CLKMD	;set clock to 100Mhz
		WAIT	#1000H

MAIN_LOOP
		RSBX    XF		;SET XF LOW FOR READ EF1.通用输出引脚置0(复位);
		BITF    TEMP,#0FF00H; 获取指定位域;
		BC      READ,TC		;FULL,JUMP TO READ DATA; 满(TC=1)就跳到READ
		RPT     #08H
		NOP
		BC	READ,BIO	;满足BIO(BIO=0)条件就跳转到READ
		PORTR   0000H,LENTEMP	;READ PACK LENGTH 
		LD      LENTEMP,-1,A	;LENGTH=LENGTH/2 FOR WRITE AND READ
		AND     #003FH,A
		BC      READ,AEQ
		SUB     #0001H,A,A
		STL     A,*AR5+%	;STORE (LENGTH/2-1)	
		STLM    A,AR3
WAITS		BC      WAITS,BIO
		PORTR   0000H,HIGHBYTE
		LD      HIGHBYTE,8,A
WAITT		BC      WAITT,BIO
		PORTR   0000H,LOWBYTE
		ANDM    #00FFH,LOWBYTE
		OR      LOWBYTE,A
		STL     A,*AR5+%
		BANZ    WAITS,*AR3-
		MVMM    AR5,AR0
		MVMD    AR5,WRITEP		
		LDM     AR6,A
		CMPR    2,AR6
		BC      SETFULL,TC
		ADD     #RBLENG,A
SETFULL		SUB     WRITEP,A
		SUB     #0060H,A
		BC      NOTFULL,AGEQ
		ST      #0FF00H,TEMP		;FULL FLAG		
		ANDM    #NOTEPT,PORT2_BUF
		PORTW   PORT2_BUF,0002H		;DISPLAY 
		B       READ
NOTFULL		ST      #0000H,TEMP		
		ANDM	#NOTEPT,PORT2_BUF
		PORTW	PORT2_BUF,0002H

READ		SSBX    XF		;SET XF HIGH FOR READ HF2
		BITF    TEMP,#00FFH
		BC      MAIN_LOOP,TC	;EMPTY ,JUMP TO ANOTHER LOOP

		BITF    INT1FLAG,#00FFH
		BC	MAIN_LOOP,NTC
		RPT     #08H
		NOP
		BC      MAIN_LOOP,BIO	;MORE THAN HALF FULL 
		LD      *AR6+%,A
		STLM    A,AR3		;PACK LENGTH COUNTER TO AR3
		ADD     #0001,A
		STL     A,1,LENTEMP
		PORTW   LENTEMP,0000H	;WRITE PACK LENGTH TO FIFO2
RPTWR		LD      *AR6,-8,A
		STL     A,HIGHBYTE
		PORTW   HIGHBYTE,0000H	;WRITE HIGH BYTE TO FIFO2
		PORTW   *AR6+%,0000H	;WRITE LOW BYTE TO FIFO2 
		BANZ    RPTWR,*AR3-	
		ST      #0000H,INT1FLAG
		ORM     #SETINTHIGH,PORT2_BUF
		PORTW   PORT2_BUF,0002H		
		RPT     #10		;SET INT OUT HIGH
		NOP
		MVMM    AR5,AR0
		CMPR    0,AR6
		BC      SETEMPTY,TC
		ST      #0000H,TEMP
		ANDM    #NOTEPT,PORT2_BUF
		ANDM    #SETINTLOW,PORT2_BUF
		PORTW   PORT2_BUF,0002H
		B       MAIN_LOOP
SETEMPTY	ST      #00FFH,TEMP
		ORM     #EPTLED,PORT2_BUF
		ANDM    #SETINTLOW,PORT2_BUF
		PORTW   PORT2_BUF,0002H
		B       MAIN_LOOP

INT1		ST	#00FFH,INT1FLAG
		POPM    ST1
		POPM    ST0
		RETE

;*************************************************************************
;*   ANALOG_IFC:
;*
;*   Serial port receive interrupt service routine
;************************************************************************

_CPU_to_codec_ch1
 	PSHM   AL
	PSHM   AH
	PSHM   AG
	LDM    DRR10,	a  ;将DRR10加载到寄存器A中
       and     #0fffeh, A          ;masking out LSB
	STL 	A,DXR10
	POPM	AG
	POPM    AH
	POPM    AL
	POPM    ST1
	POPM    ST0

	rete
     
DELAY: 
	PSHM    AR6
	STM     #0020H,AR6
DELAY_LOOP:
        RPT     #(0fff0h)
		NOP
	BANZ    DELAY_LOOP,*AR6-
	POPM    AR6
		RET



		.space	2000h
		.label	DISPLAY_END

		.text
	LD	#00H,DP
	STM	#K_SP,SP
        STM     #0FFA0H,PMST    ;OVLY=1&MP/MC=0,drom=0,clkoff=0
	STM     #07FFFH,SWWSR
	STM     #0FFFFH,SWCR
	STM     #SPCR12,SPSA2	;POINT TO SPCR12
	STM     #0000H,SPSD2	;CONFIG SPCR1 TO 0000H
	STM     #SPCR22,SPSA2	;POINT TO SPCR22
	STM     #0000H,SPSD2     ;CONFIG SPCR2 TO 0000H
	STM     #PCR2,SPSA2	;POINT TO PCR2
	STM     #3F4FH,SPSD2	;0011111101001111b
    SSBX    INTM            ;disable all interrupt
	ST      #0FFFFH,PORT2_BUF
	ORM     #EPTLED,PORT2_BUF
	ANDM    #CLR_CWR,PORT2_BUF	;SET CWR LOW
	PORTW   PORT2_BUF,0002H	;SHUT LED
	STM     #8000H,AR3
	STM     DISPLAY_SRC,AR5

	STM     #0BH,AR4	;WRITE FIRST BLOCK OF BOOT ABLE 
WRI_RPT				;768 WORDS TOTAL
	STM     #63,AR1		;WRITE 128 BYTES
WRI_LOP:
	LD      *AR5,-8,A
	STL     A,*AR3+	
	NOP
	NOP
	NOP
	LD      *AR5+,A
	STL     A,*AR3+
	nop
	BANZ    WRI_LOP,*AR1-
	CALL    DELAYY
	BANZ    WRI_RPT,*AR4-

	STM     #RES_SPACE,AR1	;WRITE THE SOURCE ADDRESS
	STM     #0FF80H,AR5
	STM     #127,AR3
WRI_LOOP:
	LD    *AR1+,-8,A
	STL    A,*AR5+			
	nop
	BANZ    WRI_LOOP,*AR3-

LOAD_LOOP:
	ANDM     #NOTEPT,PORT2_BUF
	ORM      #SET_CWR,PORT2_BUF
        PORTW    PORT2_BUF,0002H	;LIT LED
	B       $

DELAYY: 
	PSHM    AR2
	STM     #0020H,AR2
DELAYY_LOOP:
        RPT     #0fff0h
		NOP
	BANZ    DELAYY_LOOP,*AR2-
	POPM    AR2
		RET

		.END



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -