|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
, V6 Z6 h0 T$ M: W8 \main文件:& ^' B$ m6 \! X+ N7 k* ?
interrupt void interrupt4(void) 7 w% \4 L$ d- l, s+ q- I
{, C9 c4 D, u: P/ g' r( ~
Uint32 sample;
' r" b9 W5 u2 a+ r, W' R
- ~' h2 V0 x' | q8 K0 H3 S j0 T- ^ sample = input_sample(); // read L + R samples from ADC- @& }# ~, `2 a: C' g/ S. `* r
output_sample(sample); // write L + R samples to DAC ; u/ }0 \% z; H. T* K1 n# M1 O3 x
return;) R5 M. `6 @! E( S
}
; ?' x0 _, ?9 q' T1 f. F+ l
, `& a# P2 y; w8 r0 mint main( void )+ z( N) k# `4 \# x0 j+ r" h1 H
{
\$ @8 Z9 [ x/ Z1 D! Y1 y% M# Q8 g% ?' ?
/* Initialize BSL */- d# _8 Z8 l& b0 G3 t) p
EVMC6747_init( );
* }) L: C: k3 Q+ |6 q% J5 ] /* Call evmc6747_intr function */3 X1 h6 ?( [$ i" j" L2 ^0 P
aic3106_init( );
2 o3 f4 z0 |, l! p while(1);& J b6 X% f3 I- ~. }% {3 `
}
! c0 ~# v9 \. l5 Y& f
: \7 l0 @! S7 E* V9 {9 H- V' V5 N9 b9 b
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题% ^3 V" a1 @. E& U+ j
/* Initialize MCASP1 */
; m# G+ j2 y" g# e B mcasp = &MCASP_MODULE_1;
) B( H% e* z1 n9 I8 G& H: C mcasp->regs->GBLCTL = 0; // Reset
% R2 ^7 R2 L2 v mcasp->regs->RGBLCTL = 0; // Reset RX
3 _' Z& Q: B0 i mcasp->regs->XGBLCTL = 0; // Reset TX
0 R7 H0 J" i" M2 x* W. n mcasp->regs->PWRDEMU = 1; // Free-running
0 D" H) t, D' @* S // configure McASP0 receive registers
/ r d# G! z1 V" G7 @4 ~9 b mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used/ m7 {% L3 R( z( w6 q) d9 [
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus: N" c; A) S: K2 u. t6 \- y7 F6 r
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word$ u. a( x. j' F
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
! v- g2 }2 |" Z, `( w mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side) O4 s% P- t8 l# {
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
: f: N1 O/ R0 v mcasp->regs->RINTCTL = 0x00000000; // Not used
& o) V9 N% o& z% N% f( u mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
% s3 [3 I# `, f0 U
- t; M$ |* v1 D& x mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
3 c( F$ |2 ^6 \4 y mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 s3 [& y( U; `9 A mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word s! W/ c# @* ~9 s' B; E. [
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
, j/ `/ `9 C: b7 h" ^: Q mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
5 R( U3 _) u9 K mcasp->regs->XTDM = 0x00000003; // Slots 0,1
1 p0 U( T; S7 n4 }6 C y mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
# c5 i, X* u8 r* u2 e9 B mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256# j/ T; [1 l1 V9 ^' `( t
5 X& y& r/ K U4 E, N& m5 h3 Y mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN" ]' a1 _ [5 S5 S: ]' H$ e
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT9 T0 j+ k0 S$ L- v, q. R
mcasp->regs->PFUNC = 0; // All MCASPs
9 Q( j8 O, V4 n. p& o2 h( W' B mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1 H3 i7 e2 k, J2 |8 p1 u. F
' G0 x: }' C: L' F# w! A mcasp->regs->DITCTL = 0x00000000; // Not used& W p1 ]6 }/ _! T
mcasp->regs->DLBCTL = 0x00000000; // Not used. g7 I: c# u: S& V& k
mcasp->regs->AMUTE = 0x00000000; // Not used
5 b. ^) C; q- }# D5 U _1 G0 f5 U4 ~' h
/* Starting sections of the McASP*/& A0 w+ g7 X, h& [9 G- E
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 4 E2 L5 j0 O) D- B5 N
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
. Q" z f" U. V+ V% @ mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; : C" w( T5 U" Q8 ^! }
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
( z- ], |& E2 r- y ?8 A* a* s
( x( Q. l& f. c4 z# U& R) r' w9 |9 Y$ P mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 2 I" l0 P! N" H# I# D6 S
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );* c4 u2 R# ^5 _' R, Y
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
' i/ v8 q9 q+ u: G( k! I" t3 C: z3 K while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );3 Y, y7 c8 m6 b/ j
- ?8 Q M% M4 {6 F1 K- u, R, f+ X mcasp->regs->XSTAT = 0x0000ffff; ) j. e7 }. Z5 n( c
mcasp->regs->RSTAT = 0x0000ffff; ; H0 ]' v$ v( G: O
( g1 H1 t: \5 e mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
( g6 O9 q8 C: C; m" o7 @2 W2 P while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );; N% y z7 Y% ]! a
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 9 f3 @ B( a u# b7 O1 m- O% Q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
+ X9 W" Z0 `; K) Z. F& ? U6 L1 J4 l9 E0 }: F- r# `0 c/ A( l2 X- O) B! d
/* Write a 0, so that no underrun occurs after releasing the state machine */
" s) O2 i: q' V. L mcasp->regs->XBUF5 = 0;4 }+ @' _/ h" L. l" H* b% b
mcasp->regs->RBUF0 = 0;3 A. z% B5 S) r' X
4 h: a, U7 o0 e mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; % ?' O) {+ F/ i; u8 {& P" U
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
s' R% @" d. w. u/ l mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
9 i |% U/ q; w+ j4 p& V while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
4 o6 R. }$ m+ h' T% ]# q' Y* H+ E0 y& E
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
8 r; K; O7 a" O while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
1 p( `" X4 V& K2 z1 d- n mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; , M- ^4 c* z/ a( R* X/ p h
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
6 L1 \/ _& b) P) m" w/ ?7 m
W) c3 n& S9 u* a& x CSR = 0x0000;' F: p, m `6 @0 g0 ^
INTC_INTMUX1 = 0x3d;
" p. J! g& M5 I8 H7 v7 Z* A ISTP = (unsigned int)vectors;. W' A% e- n' Q/ V3 t
ICR = 0xFFF0; # Q' B* i, g8 X' _
IER |= 0x12;
/ I1 N M/ l" g CSR |= 0x01; : ^' v( W+ O: K' v, t4 k0 A
6 ?% d7 i% u# v# g" s/ H
) L. i" q; r1 i- O$ f' M
9 h8 F' u3 n1 d. r9 b G/ i还有就是两个输入输出函数:5 m- Z+ ]) ?& m+ p" B# K/ K
void output_sample(Int32 out_data)
$ C3 R) @( U* Q{0 J( V$ l: G7 i% h
AIC31_data.uint = out_data; , b) x& T) O1 x9 ~
MCASP1_XBUF5_32BIT = AIC31_data.uint;
. W5 C9 b/ a5 E9 V. F}
0 H I( Z& [1 [, o7 Y! Y0 r7 d' c" t1 m
Int32 input_sample(void)
2 i& u3 X: X7 ]! Q+ ?1 E% A{
% U3 j% U2 @# [8 G1 y) ] AIC31_data.uint = MCASP1_RBUF0_32BIT;
& B1 U1 f/ N G return (AIC31_data.uint);
, c+ n6 Q) E9 w b}& r* Y* |1 c- d4 ~" q! t5 _" c
' T* E: Y* F* Z3 F
|
|