DSP语音录放
************************************************
* FileName: ex12.asm *
* Description: 语音录放实验 *
* Copyright(C) SanZhi Electronic, Author Zpin *
************************************************
.title "ex12"
BSP .set 1 ;当前使用McBsp1
;McBsp 内存映射寄存器
SPSA0 .set 038h
SPSD0 .set 039h
DRR10 .set 021h
DRR20 .set 020h
DXR10 .set 023h
DXR20 .set 022h
SPSA1 .set 048h
SPSD1 .set 049h
DRR11 .set 041h
DRR21 .set 040h
DXR11 .set 043h
DXR21 .set 042h
;McBsp Subaddressed Registers
SPCR1 .set 00h
SPCR2 .set 01h
RCR1 .set 02h
RCR2 .set 03h
XCR1 .set 04h
XCR2 .set 05h
SRGR1 .set 06h
SRGR2 .set 07h
MCR1 .set 08h
MCR2 .set 09h
RCERA .set 0ah
RCERB .set 0bh
XCERA .set 0ch
XCERB .set 0dh
PCR .set 0eh
.if BSP = 0
SPSA .set SPSA0
SPSD .set SPSD0
RDRR .set DRR10
RDXR .set DXR10
.endif
.if BSP = 1
SPSA .set SPSA1
SPSD .set SPSD1
RDRR .set DRR11
RDXR .set DXR11
.endif
WR_SUB_REG .macro val,addr ;写McBsp控制寄存器
stm addr,SPSA
nop
stm val,SPSD
nop
.endm
RD_SUB_REG .macro addr,acc ;读McBsp控制寄存器
stm #:addr:,SPSA
nop
ldm SPSD,acc
nop
nop
nop
.endm
WAITTRX .macro ;等待串口中断
WAITR?
RD_SUB_REG SPCR1,A
and #1<<1, A
bc WAITR?, AEQ
.endm
PROGREG .macro progword ;与AD50二次通讯
stm #01h,RDXR
WAITTRX
stm #:progword:,RDXR
WAITTRX
.endm
wait .macro
STM #0008h, AR0
RPT *AR0
NOP
.endm
.mmregs
.global _c_int00
.sect ".vectors"
RESET bd _c_int00
stm #2000h,SP
.space 19*4*16
BRINT0 b recv
nop
nop
BXINT0 b trans
nop
nop
.space 4*4*16
BRINT1 b recv
nop
nop
BXINT1 b trans
nop
nop
.space 4*4*16
.text
_c_int00
ld #0h,DP
stm #2000h,SP
ssbx INTM
ssbx SXM
st #2491h,SWWSR
st #0ffe0h,PMST
st #0f007h,CLKMD
stm #4000h,AR1
stm #4000h,AR2
mcbsp_init ;初始化McBsp串口
rsbx CPL
nop ; cpl latency
nop ; cpl latency
nop ; cpl latency
ld #0, DP
ssbx INTM
ssbx SXM
WR_SUB_REG #0000H,SPCR1
WR_SUB_REG #0200H,SPCR2
WR_SUB_REG #000CH,PCR
WR_SUB_REG #0000H,SPCR1
WR_SUB_REG #0000H,SPCR2
WR_SUB_REG #0040H,RCR1 ;16 BITs
WR_SUB_REG #0004H,RCR2 ;Ignore FS after the first
WR_SUB_REG #0040H,XCR1 ;16 BITs
WR_SUB_REG #0004H,XCR2 ;Ignore FS after the first
ld 100,A
wait
andm #0ff3fh, 54h ;set interrupts to come from serial ports not DMA
;by clearing bits 6 and 7 in DMPREC
stm #0,RDXR
WR_SUB_REG #0001H,SPCR1 ;启动McBsp串口
WR_SUB_REG #0201H,SPCR2
ld 100,A
wait
aic_init
stm #0h,IMR
orm #0c00h,IMR
stm #0ffffh,IFR
PROGREG 0000001100000001b
;76543210
PROGREG 0000010000010000b
;76543210
;PROGREG 0104H ;二次通讯初始化AD50
;PROGREG 0280H
;PROGREG 0301h
;PROGREG 045Ah
ld RDRR,A
ld RDRR,A
stlm A,RDXR
stlm A,RDXR
rsbx INTM
nop
nop
nop
js nop
nop
nop
b js
recv ldm RDRR,A ;读取ADC采样数据
ld #0d000h,b
sub ar1,b
bc record,beq ;判断录音是否结束
;ld a,b
;ld #0,a
stl a,*ar1+ ;未结束->录音
;ld b,a
b play ;已结束->放音
record ld #0d000h,b
sub ar2,b
bc load,bneq ;录制数据放完,再从头放起
stm #4000h,ar2
load ld *ar2+,a ;加载录制数据
play and #0fffeh,a ;放音
stlm A,RDXR
rete
trans rsbx XF
rete
.end
bsp
BSP .set 0 ; 5409 DSK audio in/out codec uses McBSP0
SAMPLERATE .set 8
.mmregs
SPCR1_VAL .set 0000h
SPCR2_VAL .set 0200h
RCR1_VAL .set 040h
RCR2_VAL .set 004h
XCR1_VAL .set 040h
XCR2_VAL .set 004h
PCR_VAL .set 0Ch
MCBSP0_TO_CODEC0 .set 0xFE
MCBSP1_TO_CODEC1 .set 0xFD
CODEC1_FC_ON .set 0x8
CODEC0_FC_ON .set 0x4
CPLD_CTRL2 .set 0x4
* McBSP Memory Mapped Registers
SPSA0 .set 038h
SPSD0 .set 039h
DRR10 .set 021h
DXR10 .set 023h
SPSA1 .set 048h
SPSD1 .set 049h
DRR11 .set 041h
DXR11 .set 043h
* McBSP Subaddresed Registers
SPCR1 .set 00h
SPCR2 .set 01h
RCR1 .set 02h
RCR2 .set 03h
XCR1 .set 04h
XCR2 .set 05h
SRGR1 .set 06h
SRGR2 .set 07h
PCR .set 0Eh
;; Choose appropriate sub-address registers and DRR/DXR
.if BSP = 0
SPSA .set SPSA0
SPSD .set SPSD0
RDRR .set 21H ; McBSP0 data receive register 1
RDXR .set 23H ; McBSP0 data transmit register 1
MCBSP_TO_CODEC .set MCBSP0_TO_CODEC0
IMASK .set (1 << 4)
.endif
WR_MCBSP_SUB_REG .macro addr,val
stm addr,SPSA
nop
stm val,SPSD
nop
.endm
RD_MCBSP_SUB_REG .macro addr,acc
stm #:addr:,SPSA
nop
ldm SPSD,acc
nop
nop
nop
.endm
WAITTRX .macro ; Wait for serial port to Rx word
WAITR?
RD_MCBSP_SUB_REG SPCR1,A
and #1<<1, A
bc WAITR?, AEQ
.endm
PROGREG .macro progword
stm #01h,RDXR
WAITTRX
stm #:progword:,RDXR
WAITTRX
.endm
wait .macro
STM #0008h, AR0 ;AR0 points to ACCL
RPT *AR0 ;repeat the # of times specified in ACCL
NOP ;do nothing in the delay loop
.endm
.global RESET,AIC_INIT,WAIT_INT,_CPU_to_codec_ch1,READ_SAMPLES
.text
.mmregs
.def _main
p0_serialflag .set 060h
p0_serialint .set 061h
SYSTEM_STACK .set 04000h
.text
_main
ld #0, DP
ssbx INTM
ssbx SXM
st #0, p0_serialint
st #2491h, SWWSR ;2 wait except for on-chip data
st #0ffe0h, PMST ; MP/MC = 1, IPTR = 1ff
st #0f007h,clkmd
st #1, p0_serialflag
;*************************************************************************
;* audio_init:
;*************************************************************************
_DSS_init
rsbx CPL
nop ; cpl latency
nop ; cpl latency
nop ; cpl latency
ld #0, DP
ssbx INTM
ssbx SXM
WR_MCBSP_SUB_REG SPCR1, #SPCR1_VAL
WR_MCBSP_SUB_REG SPCR2, #SPCR2_VAL
WR_MCBSP_SUB_REG PCR, #PCR_VAL
WR_MCBSP_SUB_REG SPCR1, #0h ; reset McBSP0
WR_MCBSP_SUB_REG SPCR2, #0h
;; write McBSP registers
WR_MCBSP_SUB_REG RCR1, #RCR1_VAL
WR_MCBSP_SUB_REG RCR2, #RCR2_VAL
WR_MCBSP_SUB_REG XCR1, #XCR1_VAL
WR_MCBSP_SUB_REG XCR2, #XCR2_VAL
LD #100 ,A
WAIT
;; set interrupts to come from serial ports not DMA
;; by clearing bits 6 and 7 in DMPREC
andm #0ff3fh, 54h
;; clear xmit register -- why?
stm #0, RDXR
;; now enable McBSP transmit and receive
WR_MCBSP_SUB_REG SPCR1,#SPCR1_VAL | 1
WR_MCBSP_SUB_REG SPCR2,#SPCR2_VAL | 1
LD #100 ,A
WAIT
_AIC_INIT
STM #0, IMR
orm #IMASK, IMR ;only receive-int is served.
; orm #08h, IMR
stm #0ffffh, IFR
; PROGREG 0000010100001000b
PROGREG 0000001100000001b
; 876543210
PROGREG 0000010000010000b
; 876543210
ld RDRR, A
ld RDRR, A
stlm A,RDXR
stlm A,RDXR
rsbx INTM
nop ; cpl latency
nop ; cpl latency
nop ; cpl latency
_js
; idle 1
nop
nop
nop
nop
nop
b _js
_CPU_to_codec_ch1
st #1, p0_serialint ;controlling AIC init, not used later
LDM RDRR, a
STL A, RDXR
rete
.if __far_mode
fret
.else
ret
.endif
.end

浙公网安备 33010602011771号