|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:/ l' X2 O/ r# z! B, v
main文件:
l$ {/ N& q$ b' ?interrupt void interrupt4(void)
2 l$ J8 I( o" i' ~/ W" p{( h6 c" ^8 f, M* W ~$ T
Uint32 sample;$ ~8 O# ~7 H/ q" t
+ D5 h' i4 N! n) t0 W( U sample = input_sample(); // read L + R samples from ADC
- j1 w2 P4 J- m+ z, Y: w$ c* _ output_sample(sample); // write L + R samples to DAC
$ U$ o) A1 p1 B# C2 G, V return;
: U3 ~2 Z. o6 p}
5 @1 t$ C1 k# {1 G
$ I1 c! A" J2 v; y* T, W) vint main( void )
( V" r0 R. [, E4 R; E! i$ ?{1 {. O- [, D1 m2 i+ G5 e' ^
8 U7 O1 K5 I+ G /* Initialize BSL */- ?: h% z# v6 G. e( O$ S2 U- v
EVMC6747_init( );2 _/ P" x. V; D% ^
/* Call evmc6747_intr function */
: e1 x& E5 `1 O, j2 o' j5 g aic3106_init( );3 \( C2 G }* O$ f* b1 z* e
while(1);* T- P% y' | Z# R3 C' d3 ]" C
}% O7 Y, S' H. z
) _5 [* d+ u0 M
+ w$ Y: j; O% gaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题' _' q% C2 F" ]2 s; e
/* Initialize MCASP1 */* o% \ a4 W: X$ C
mcasp = &MCASP_MODULE_1;, ?$ J9 |: y2 _& E: f, o3 d! C
mcasp->regs->GBLCTL = 0; // Reset. I6 ~3 E1 f7 ]& V V% u; k
mcasp->regs->RGBLCTL = 0; // Reset RX6 @+ q6 |9 }) w/ h$ e
mcasp->regs->XGBLCTL = 0; // Reset TX
, O: B0 G% }7 [7 x _, G" B$ E mcasp->regs->PWRDEMU = 1; // Free-running
( _7 D9 J; T' X/ u, L9 k // configure McASP0 receive registers
; y: R- N8 _; L9 t* f mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
! ]: M2 H8 |: x: ?7 i4 V mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus8 |" v& F8 H9 S- \# y" \6 _
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word( L% X( ~/ D* S5 {: C: w! m7 M9 w8 }9 a
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
/ M- N! U* }" p3 I; E/ J4 _ mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
: z' Z+ }2 ?: O; T; f) B# o mcasp->regs->RTDM = 0x00000003; // Slots 0,1; s3 R+ y) r7 {# ]
mcasp->regs->RINTCTL = 0x00000000; // Not used/ n7 C, b0 y2 I, z! [# A1 n$ B2 B
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
3 O6 W: T# W4 t1 d
% m( G v( `1 S0 K( K2 H" \7 q mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
) O& x6 d1 }. W. q5 h2 u) o mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
+ S; _ m v; q. Q5 C mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
, o* t) D; u: j' F mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
$ d! C* Z5 i' y mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
6 e9 C; v; b2 C0 ]* D w- a mcasp->regs->XTDM = 0x00000003; // Slots 0,1" H& ~1 u+ M" L
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit4 y. k/ P% C' b+ n1 F5 y& h7 A
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256) o2 Q1 q& R8 z% u
5 |( i9 i G2 M! b$ ?, ]6 j: }: o
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN/ |, A) ^) G% z: g; ^, ^3 Y L
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
/ C+ ^$ U0 S X; L. [# s7 T; ~ mcasp->regs->PFUNC = 0; // All MCASPs
& P9 z3 y4 f# }4 C9 C i6 l: r mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX14 j; b B; {8 p, L8 r" y+ L+ ?! L9 P
; z( D$ u8 C' r6 C( ^4 j4 z1 z
mcasp->regs->DITCTL = 0x00000000; // Not used* z/ n: F( T. U6 k
mcasp->regs->DLBCTL = 0x00000000; // Not used) E2 n% S+ `: p/ z
mcasp->regs->AMUTE = 0x00000000; // Not used4 Z' M. n6 s) C/ g9 v- _. N$ d
0 \; } s/ p8 D1 ]: f3 N/ M/* Starting sections of the McASP*/
0 y0 a( T) U, {9 R mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
2 R; a, K* E1 a$ {; d while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
( |3 `+ x$ K" D9 Z' j& m' u mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
! x7 I) Q1 b) F8 M3 Q$ W% Z while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );4 u5 r( {$ |7 O2 ?, }8 Q
6 s% T% G0 X' ?6 Z; ? mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
$ Q! H& {3 Q! M while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
8 b7 b; x8 ~3 B9 O: F mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; # a/ J0 ]3 o8 ^. H& C. J
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
" b0 Z5 ?: W V* A7 k" t$ A s5 V
+ B0 F! b3 N& G1 D, w8 y, D6 ~5 s mcasp->regs->XSTAT = 0x0000ffff; % [' k$ D p b' ^ i0 w2 N7 ^
mcasp->regs->RSTAT = 0x0000ffff; . c1 P* I* a; p! S
+ ^) R* s; V x3 i l& h
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;& y, w# _* S' _) W" P6 g$ B' a$ c; x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
% S& G7 C2 j0 K$ F. m mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ; X# X* S, H6 Q9 Q, C5 j
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
% u4 f' h& I8 S" p! A% M; N
8 o$ J8 ~1 ^, m2 x; a /* Write a 0, so that no underrun occurs after releasing the state machine */
7 w, {4 o6 D" Z* F# e6 E: K. G1 j mcasp->regs->XBUF5 = 0;
' q+ o7 }$ _* q- G9 G6 f6 o mcasp->regs->RBUF0 = 0;& |9 N! z) q* @# ~0 e- P
5 }4 g* {8 Z2 i6 w
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
1 P) I7 V0 f; p8 R3 t while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
+ K4 n$ G; I$ P5 z0 _. l, ~4 n, r- l mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; % E) r% V! Q+ s @3 ^$ |3 B
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
3 z# z5 l- X+ g' u) K5 d+ _( Y0 u% I9 G8 o9 x, y4 q
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 8 k! [; ^, A% O1 @9 k3 V
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );1 V& q$ [) v* {. K! ^* t% W
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; " E0 k/ {' N" }" I. |
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
2 i" ]: L4 @2 j. P$ _/ @- q5 M% |$ s, Q9 Y: C, u2 X$ L
CSR = 0x0000;
" @* o- ^1 S. O: I/ }: b INTC_INTMUX1 = 0x3d;
0 t% w6 o! S% o: J- g% J0 a+ r ISTP = (unsigned int)vectors;
9 x3 v' |. g8 o9 k: L8 q. j* ~3 ?% U ICR = 0xFFF0; ) W" R* S# C$ h# [) N
IER |= 0x12; . V9 F. ]1 ~* e0 d% W
CSR |= 0x01; 8 `4 R i0 _% I4 n. W
6 U8 Y& t4 H) u* y9 x
6 \1 c) u, Q2 N. D8 ^5 I* e$ z; w' t1 e+ {; b: r
还有就是两个输入输出函数:
# R2 Z5 W: c9 z1 n' ]void output_sample(Int32 out_data)- m" S) E+ E+ o1 n6 L) ~4 @
{/ L; I7 c/ v7 T5 z
AIC31_data.uint = out_data; ' ^( H" f! R1 y4 p2 @2 }
MCASP1_XBUF5_32BIT = AIC31_data.uint;, e' ?9 }. r, ?8 K
}$ u8 `1 a7 G7 _' q
v& ` m4 h& Y s" }0 CInt32 input_sample(void)# e8 O" z* P( v S G* S
{ $ l4 y, ~7 r' i! x7 s
AIC31_data.uint = MCASP1_RBUF0_32BIT;
( H0 H- z2 v$ {/ E return (AIC31_data.uint);, I1 X, B9 `* }3 O( `
}
9 z; K9 `; A% K: ]; \
( u! N8 p, |% i7 K. I |
|