|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
/ l7 c4 X8 x: {; X0 J J; emain文件:
0 L: v- F9 n- pinterrupt void interrupt4(void)
; I2 Z4 l8 C/ I. W# K" Z, Z% N{
9 H* l- n0 t; N9 j- z: O% k/ |9 E8 j Uint32 sample;
& @+ P- A" ?/ R
( i7 d) d* B! f( d, g sample = input_sample(); // read L + R samples from ADC
. U6 j" ^5 Z5 f' R output_sample(sample); // write L + R samples to DAC
: k% X0 ~/ E) _; G6 H/ }( u return;6 w! g) }! |3 W9 u& {% b
} Y; N3 d L8 p: e& r8 S8 {4 a( B
G7 {2 `. ?, e! t& s/ d
int main( void )/ V0 Y7 B$ i+ F4 ?; n
{7 t' |' ?( g2 y" @) D2 ^
5 @! _1 {; N7 M4 Z/ h3 c2 { /* Initialize BSL */
6 c2 e7 {5 Y+ H p; Y EVMC6747_init( );0 S W1 F* K0 _9 ?$ m$ @6 R; U
/* Call evmc6747_intr function */0 K4 ~6 d4 j9 `, {9 Z% r0 e
aic3106_init( );" D/ _2 s: F2 i
while(1);
s% ~9 f1 A# `3 y$ q}
3 I4 h1 b& _- J0 V R& D; h) [9 T& z @* O$ m
6 O ^( I$ P% H+ `aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
( p3 U" Q0 B! V! J1 W9 r/* Initialize MCASP1 */
3 Y: I# b5 X% X# e8 j6 p mcasp = &MCASP_MODULE_1;
1 t4 E6 c. n, Z mcasp->regs->GBLCTL = 0; // Reset' W5 b9 j# w3 r, F( C
mcasp->regs->RGBLCTL = 0; // Reset RX
" w8 n7 A2 r6 y8 N, O mcasp->regs->XGBLCTL = 0; // Reset TX
3 U! s& `0 S) I; } mcasp->regs->PWRDEMU = 1; // Free-running
# b& f% k3 g' W // configure McASP0 receive registers
7 F: r- Z0 d8 y, l. J% m& v mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
]1 W* L+ P0 l( S' T0 r0 X5 D: G mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus8 b; D; e" }+ C/ c5 G& h
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
( N' ]. d- ]- @/ a0 o/ e2 _# b mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
* R( p, S4 C ~% w1 ~ mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)' ], \$ t J5 p" l( T6 m8 F9 T. `
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
; ]$ F/ b- Y* ~' H* N' z3 E0 K [ mcasp->regs->RINTCTL = 0x00000000; // Not used4 ^( J' Y7 e1 ~2 p+ [3 a2 |
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256, ^$ @. o/ p" ]9 n3 q. Z, A4 h
& L9 }! ?$ j @( M5 `8 _4 _. k mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
7 c; f2 l+ Y+ A8 |2 Q5 x) f mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ n8 k, J& k2 k1 X mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
8 g( C6 }* _; R+ {/ ? M4 U. ~ mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
) W4 W- N" p6 c) Q) q/ I6 j mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK2 `" X3 L/ f1 ~
mcasp->regs->XTDM = 0x00000003; // Slots 0,1* I6 S0 [+ ?. s0 E2 d. I8 j3 }" C! y
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit( H+ M( Y( a9 k3 ]; ]" S
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2565 m# ?& w% L6 b2 E3 S
. } P0 ^- J) i( L, R' i mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN/ j0 O- j u8 a- }' v) E Z
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
1 d& z$ b" j" L8 R3 ?+ [ mcasp->regs->PFUNC = 0; // All MCASPs7 A) ^$ W) Q* v0 I
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1/ B( v4 H; \: s C1 e# \
" ?- x T& B: @$ j& B& W" ^" C I mcasp->regs->DITCTL = 0x00000000; // Not used L# G' K/ W, R5 f; p) s
mcasp->regs->DLBCTL = 0x00000000; // Not used
% J- l# z4 ?) O" k# K; g. k4 K mcasp->regs->AMUTE = 0x00000000; // Not used, I2 P5 f# ~2 I1 a% C, y7 ~
& V5 ]* \0 Q( ]# \' |' z8 I/* Starting sections of the McASP*/# j8 S8 f' e! s8 J" W9 m' f
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
1 h0 w0 R. Z6 a. l$ ~1 c while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
! ]3 m0 x. c' r! S0 R9 s mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; & ^6 B( V; d$ u- Q$ W. l
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
% |4 A! s9 n K) _9 S
y' i: Y% t; {( d mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 6 \' N0 ^% t4 _, L1 T$ D
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
* Y# T! n z7 g9 H mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
v* x$ i9 g* n/ y$ Y1 o while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );' P4 V, W+ I. p1 ]; x$ K# }+ U
# q4 J! F6 o* u$ X6 S+ u mcasp->regs->XSTAT = 0x0000ffff; : f7 i- p4 y* C8 K# x' z5 _
mcasp->regs->RSTAT = 0x0000ffff; ' s! G. _8 f& W- T. M, K2 ]
( C" [5 S6 Z) W, f( x5 h# S* } mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;: P/ `! l- g. z. z/ j
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
7 r0 |& I7 z( k& {) q1 ]& l mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
) t" [6 g0 a5 G Q$ W! a8 C4 B( h while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );6 h3 C4 ^. Y/ S' m
9 B6 E: I$ U* D$ o. G& e* ]! o
/* Write a 0, so that no underrun occurs after releasing the state machine */4 ]5 f) j8 ^' M, |0 ~
mcasp->regs->XBUF5 = 0;
3 A; z) \ i% X3 R mcasp->regs->RBUF0 = 0;- I* B9 C! b ^/ i$ T4 p3 d' K/ [
; x; y, B% t* x; a5 u4 D
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
R. {# B4 r1 M while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
' w4 X2 u, S/ G" R2 Y, a2 z* M/ G mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
1 ~4 [( `# _' v, h+ z while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );, v- Q, g3 p! z' t, M" r3 C8 z
! i% ]9 _+ _- t1 ]+ M6 @5 T' O
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; & U# M- Y U$ M5 ]) {4 f' `
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );- ]$ o" B+ Z# x, A
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
2 l5 K) c5 q( q$ V6 Y while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
( J1 P, Q& b( c% q# v: L" k7 ?# b% {" n) x! Z/ l
CSR = 0x0000;7 l- N l' [' v5 A2 I! u
INTC_INTMUX1 = 0x3d;
( B( L% ]7 o* Q4 o/ c- ` ISTP = (unsigned int)vectors;
1 S! {7 q, V0 y' U h- b0 O ICR = 0xFFF0;
% \3 r( s" V1 y v5 [9 I7 v9 G IER |= 0x12;
7 J6 C) L/ w. U* _3 s CSR |= 0x01;
" }& G. |. K4 Q2 D/ T+ \- {( f0 v1 d% [4 o- P- W
x* y- m8 v' Z4 Y; S1 h( D4 F& X: W1 t4 `" ]" w5 a' \& q# Z. c4 J( P
还有就是两个输入输出函数:
& V& ]2 j. A0 M+ m0 D0 W" O% Fvoid output_sample(Int32 out_data)' J7 _( n! Y( @9 D% m" E4 }8 G; \
{
* i4 n& k% d! U* n. R AIC31_data.uint = out_data;
$ U3 B& q& R9 q* u8 H MCASP1_XBUF5_32BIT = AIC31_data.uint;" `( t0 ?- Y4 R- {7 i! c
}9 O. V7 L1 |; s4 ~3 y
& G; o" P: A' f: Q* |8 J6 t
Int32 input_sample(void)
8 i# l. R5 e2 _- a; h* E K) W! q{ ) k' M( N; I1 O, T) D- H7 n- C3 j
AIC31_data.uint = MCASP1_RBUF0_32BIT;" j4 o, g5 ~. |- t& b
return (AIC31_data.uint);: K* S/ j" P, T+ I: M
}! h! }0 i; c# I# a$ v1 Y
3 p9 J7 I7 u |" ~6 Q/ f) r |
|