?? codec.s54
字號:
;******************************************************************************
; SJTU DSP Tech. Center
; Copyright (c) 2002 SJTU DSP Tech. Center. All Rights Reserved.
; History:
; Date Authors Changes
; 2003/08/30 Fu Xuan Created.
;******************************************************************************
.mmregs
;functions
.global _c_int00
.global _leds_on
.global _leds_off
.global _init_mcbsp
.global _init_codec
.global _init_dma
.global _enable_codec
.global _processing
;variables
.global _input_pingpong_flag
.global _output_pingpong_flag
.global _dmac0_int_flag
.global _dmac4_int_flag
.global _in_data_ping
.global _in_data_pong
.global _out_data_ping
.global _out_data_pong
data_size .set 1024
frame_size_1 .set 2
arg_2 .set frame_size_1+1
arg_3 .set arg_2+1
arg_4 .set arg_3+1
frame_size_2 .set 0
arg_out .set frame_size_2+1
arg_N .set arg_out+1
FC_SET .set 0x0008
FC_CLR .set 0x0000
.include "dsp_cnst.h54"
.text
;=================================================================
_leds_on:
portr CNTL1, *(AL)
or #0x0007, A ;USERLED0=USERLED1=USERLED2=1
portw *(AL), CNTL1 ;LED0、LED1 and LED2 shine
ret
;=================================================================
_leds_off:
portr CNTL1, *(AL)
and #0xFFF8, A ;USERLED0=USERLED1=USERLED2=0
portw *(AL), CNTL1 ;LED1、LED2 and LED3 shut
ret
;=================================================================
_init_mcbsp: ;所有寄存器都可自由使用
stm #MCBSP1_CNST, AR2
stm #SPSA1, AR3
stm #(15-1), BRC
rptb MCBSP1_loop-1
ld *AR2+, A
stl A, *AR3+
ld *AR2+, A
stl A, *AR3-
MCBSP1_loop:
ret
;=================================================================
_init_codec:
pshm ST0
pshm ST1
;select codec as McBSP1 signal resource
stm #0, AR2
portw *(AR2), CNTL2 ;CNTL2=0x0000
ssbx INTM ;disable interrupts
stm #FC_SET, AR2
stm #FC_CLR, AR3
stm #SPCR2, SPSA1 ;SPCR21
stm #0x0101, SPSD1 ;XRST=1, enable McBSP1 transmit, soft mode
;*************************************************************************
; Data Format in Secondary Communication
; D15 D14 D13 |D12 D11 D10 D9 D8| D7 D6 D5 D4 D3 D2 D1 D0
; | | register | register
; R/W | address | data
;*************************************************************************
ld #0, B
call wait_rdy ;wait until McBSP1 transmit complete
stlm B, DXR11 ;write zero
nop
portw *(AR2), CNTL2 ;set FC=1, 2nd communication request
nop
;reset codec
call wait_rdy
stm #0x0181, DXR11 ; REG1, Reset codec (D7), 16 bits DA
call wait_rdy
stlm B, DXR11 ;write nop register
nop
portw *(AR3), CNTL2 ;clear FC to 0
stm #4000, AR5
wait_reset: ;wait for codec to reset, clear out initial data
nop
banz wait_reset, *AR5-
call wait_rdy
stlm B, DXR11 ;write nop register
nop
portw *(AR2), CNTL2
nop
;set control register 1
call wait_rdy
stlm A, DXR11 ;arg_1在A中
;set control register 2
call wait_rdy
mvdk *SP(arg_2), AL
stlm A, DXR11
;set control register 3
call wait_rdy
mvdk *SP(arg_3), AL
stlm A, DXR11
;set control register 4
call wait_rdy
mvdk *SP(arg_4), AL
stlm A, DXR11
call wait_rdy
stlm B, DXR11 ;write nop register
nop
portw *(AR3), CNTL2 ;clear FC to 0
nop
nop
nop
stm #SPSA1, AR4 ;McBSP1子地址寄存器
st #1, *AR4+ ;選中控制寄存器SPCR21
andm #0xfffe, *AR4- ;/XRST=0發送部分復位
popm ST1
popm ST0
ret
;******************************************************************************
;** Function: wait_rdy
;** Description: wait for codec send int and clear FC
;******************************************************************************
wait_rdy:
stm #SPCR2, SPSA1
bitf *(SPSD1), #0x0002
bc wait_rdy, NTC
ret
;=================================================================
_init_dma:
;set DMA0, DMA4 high priority, 中斷復用INTOSEL=10b(DMA1,2,3), close all other DMA
stm #0x1180, DMPREC
stm #DMA_CNST, AR3
stm #0, DMSA
stm #DMSDI, AR2 ;帶地址自動增加得子區訪問寄存器
; rpt #40-1
; mvdd *AR3+, *AR2
stm #20-1, BRC
rptb END_INIT_DMA-1
mvdd *AR3+, *AR2
mvdd *AR3+, *AR2
END_INIT_DMA:
ret
;=================================================================
_enable_codec:
;LED0 shines to show that all initializations have finished
portr CNTL1, *(AL)
or #0x0001, A ;USERLED0=1
portw *(AL), CNTL1
;ready for data receive
stm #0x1040, IMR ;set IMR to enable DMA0, DMA4 Interrupt
stm #0xffff, IFR ;set IFR to clear pending interrupt
;enable interrupts
stm #0x00E0, PMST ;IPTR=#0x0080
rsbx INTM
;enable channel 0 and 4 of DMA
ldm DMPREC, A ;set DE[0]=1, DE[4]=1 to enable channel 0, 4
or #0x0011, A
stlm A, DMPREC
;enable McBSP1 (set RRST=XRST=1)
stm #SPSA1, AR2 ;McBSP1子地址寄存器
st #0, *AR2+ ;選中控制寄存器SPCR11
orm #0x0001, *AR2- ;/RRST=1接收部分使能
st #1, *AR2+ ;選中控制寄存器SPCR21
orm #0x0001, *AR2- ;/XRST=1發送部分使能
ret
;******************************************************************************
;** Function: _processing
;** Description:
;** Processing the data received from AD and send the result to DA
;******************************************************************************
_processing:
;put your information processing program here
;at this time, we just send the raw data back to DA without any processing
stlm A, AR2 ;arg_in->AR2
mvdk *SP(arg_out), AR3
stm #512-1, BRC
rptb END_PROCESSING-1
mvdd *AR2+, *AR3+
mvdd *AR2+, *AR3+
END_PROCESSING:
ret
;******************************************************************************
.sect "Init_table"
MCBSP1_CNST: ;應用和設計P133
.word 0 ;sub address==SPCR11
.word 0x4000 ;SPCR11
;DLB=0, RJUST=10, CLKSTP=00, DXENA=0, ABIS=0, RINTM=00(RINT由RRDY驅動)
;RSYNCERR=0, /RRST=0
.word 1 ;sub address==SPCR21
.word 0x0100 ;SPCR21
;FREE=0, SOFT=1, /FRST=0, /GRST=0, XINTM=00, XSYNCERR=0
;/XRST=0
.word 2 ;sub address==RCR11
.word 0x0040 ;RCR11
;RFRLEN1=000 0000 (1 word per frame), RWDLEN1=010 (16 bits per word)
.word 3 ;sub address==RCR21
.word 0x0000 ;RCR21
;RPHASE=0, RCOMPAND=00, RFIG=0, RDATDLY=00
.word 4 ;sub address==XCR11
.word 0x0040 ;XCR11
;XFRLEN1=000 0000 (1 word per frame), XWDLEN1=010 (16 bits per word)
.word 5 ;sub address==XCR21
.word 0x0000 ;XCR21
;XPHASE=0, XCOMPAND=00, XFIG=0, XDATDLY=00
.word 6 ;sub address==SRGR11
.word 0x0000 ;SRGR11
.word 7 ;sub address==SRGR21
.word 0x0000 ;SRGR21
.word 8 ;sub address==MCR10
.word 0 ;MCR11
;RMCM=0
.word 9 ;sub address==MCR21
.word 0 ;MCR21
;XMCM=00
.word 10 ;sub address==RCERA1
.word 0 ;RCERA1
.word 11 ;sub address==RCERB1
.word 0 ;RCERB1
.word 12 ;sub address==XCERA1
.word 0 ;XCERA1
.word 13 ;sub address==XCERB1
.word 0 ;XCERB1
.word 14 ;sub address==PCR1
.word 0x000C ;XIOEN=RIOEN=0(串行口引腳工作), FSXM=FSRM=0(輸入腳,外部驅動), CLKXM=CLKRM=0(輸入腳,外部驅動)
;FSXP=FSRP=1(脈沖低有效), CLKXP=CLKRP=0(上升沿采樣)
DMA_CNST: ;應用和設計P151
;DMA0 For McBSP1 receive
.word DRR11 ;DMSRC0 通道0源地址McBSP1 Receiver Register
.word _in_data_ping ;DMDST0 通道0目的地址
.word data_size-1 ;DMCTR0 元素數目-1
.word 0x5000 ;DMSFC0
;DSYN=0101(同步事件為McBSP1接收事件), DBLW=0(單字模式), Frame Count=1-1
.word 0xE045 ;DMMCR0
;AUTOINIT=1(自動初始化), DINM=1, IMOD=1(幀結束中斷),
;CTMOD=0(多幀模式), SIND=000(不修改源地址), DMS=01(數據空間),
;DIND=001(目的地址加1), DMD=01(數據空間)
.word 0 ;DMSRC1
.word 0 ;DMDST1
.word 0 ;DMCTR1
.word 0 ;DMSFC1
.word 0 ;DMMCR1
.word 0 ;DMSRC2
.word 0 ;DMDST2
.word 0 ;DMCTR2
.word 0 ;DMSFC2
.word 0 ;DMMCR2
.word 0 ;DMSRC3
.word 0 ;DMDST3
.word 0 ;DMCTR3
.word 0 ;DMSFC3
.word 0 ;DMMCR3
.word _out_data_ping ;DMSRC4 通道1源地址OUTPUT_PINGPONG_0
.word DXR11 ;DMDST4 通道1目的地址McBSP1的發送寄存器
.word data_size-1 ;DMCTR4 元素數目-1
.word 0x6000 ;DMSFC4
;DSYN=0110(同步事件為McBSP1發送事件), DBLW=0(單字模式), Frame Count=1-1
.word 0x5141 ;DMMCR4
;AUTOINIT=0(不自動初始化), DINM=1, IMOD=0(緩沖區滿中斷),
;CTMOD=1(ABU模式), SIND=001(源地址+1), DMS=01(數據空間),
;DIND=000(不修改目的地址), DMD=01(數據空間)
.word 0 ;DMSRC5
.word 0 ;DMDST5
.word 0 ;DMCTR5
.word 0 ;DMSFC5
.word 0 ;DMMCR5
.word 0 ;DMSRCP, no extended addressing
.word 0 ;DMDSTP, no extended addressing
.word 0 ;DMIDX0
.word 0 ;DMIDX1
.word 0 ;DMFRI0
.word 0 ;DMFRI1
.word DRR11 ;DMGSA(重載源地址)
.word _in_data_ping ;DMGDA(重載目的地址)
.word data_size-1 ;DMGCR(重載元素數目-1)
.word 0 ;DMGFR(重載幀數目-1)
;**************************vectors*********************************************
.sect "vectors"
int_reset:
b _c_int00
nop
nop
.space 84*16
int_damc0:
bd DMAC0_ISR ;read data from DRR11 to INPUT_PINGPONG0/1
pshm ST0
pshm ST1
.space 20*16
int_dmac4:
bd DMAC4_ISR ;send data from OUTPUT_PINGPONG0/1 to DXR11
pshm ST0
pshm ST1
.space 12*16
;*********************** Interrupt Service Routine ****************************
.text
;******************************************************************************
;** Function: DMAC0_ISR
;** Description:
;** DMAC0 ISR for McBSP1 receive
;******************************************************************************
DMAC0_ISR:
bitf *(_input_pingpong_flag), #1
stm #DMGDA, DMSA ;選中目的地址重載寄存器DMGDA
bc IN_PINGPONG1_SET, TC
;if input_pingpong_flag is 0, stroe #INPUT_PINGPONG_0 in DMSDN(不帶地址自動增加得子區訪問寄存器)
bd IN_PROCESS_EXIT
stm #_in_data_ping, DMSDN ;修改目的地址寄存器DMGDA到INPUT_PINGPONG_0
;if input_pingpong_flag is 1, stroe #INPUT_PINGPONG_1 in DMSDN(不帶地址自動增加得子區訪問寄存器)
IN_PINGPONG1_SET:
stm #_in_data_pong, DMSDN ;修改目的地址寄存器DMGDA到INPUT_PINGPONG_1
IN_PROCESS_EXIT:
xorm #1, *(_input_pingpong_flag) ;alter input_pingpong_flag when each interrupt come
st #1, *(_dmac0_int_flag) ;set dmac0_int_flag when each interrupt come
popm ST1
popm ST0
rete
;******************************************************************************
;** Function: DMAC4_ISR
;** Description:
;** DMAC4 ISR for McBSP1 send
;******************************************************************************
DMAC4_ISR:
pshm AL
pshm AH
pshm AG
bitf *(_output_pingpong_flag), #1
stm #DMSRC4, DMSA ;選中DMA4源地址寄存器DMSRC4
bc OUT_PINGPONG1_SET, TC
;if output_pingpong_flag is 0, store #OUTPUT_PINGPONG_0 in DMSDN(不帶地址自動增加得子區訪問寄存器)
bd OUT_PROCESS_EXIT
stm #_out_data_ping, DMSDN ;DMSDN->DMSRC4
;if output_pingpong_flag is 1, store #OUTPUT_PINGPONG_1 in DMSDN(不帶地址自動增加得子區訪問寄存器)
OUT_PINGPONG1_SET:
stm #_out_data_pong, DMSDN ;DMSDN->DMSRC4
OUT_PROCESS_EXIT:
xorm #1, *(_output_pingpong_flag) ;alter output_pingpong_flag when each interrupt come
st #1, *(_dmac4_int_flag) ;set dmac4_int_flag when each interrupt come
ldm DMPREC, A ;enable DMA4
or #0x0010, A
stlm A, DMPREC
popm AG
popm AH
popm AL
popm ST1
popm ST0
rete
.end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -