|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:" Z2 M/ j5 i. }' T6 y
main文件:
9 Q0 c! N1 f. c& J1 }interrupt void interrupt4(void)
4 N1 m+ Y- s) m( O3 e. f$ Q* K{' Z3 Q& i6 r# \* Y6 P
Uint32 sample;3 K8 n0 e; ^- Q% o+ U4 \+ u0 p
! K0 A/ ^+ q& k9 ~ sample = input_sample(); // read L + R samples from ADC
2 E- \: b; b/ K) s output_sample(sample); // write L + R samples to DAC
+ |7 z G$ Y& ^) d: Z$ N& } return;- L8 K V; r, i0 q
}) s1 a: n6 L& I% }
" d) a+ n$ r' `( J6 i8 gint main( void )
9 V7 a% p5 {) ]# n- w Z{) I' c' P$ P9 c7 g
v5 i# S$ ]' c" \* l* H /* Initialize BSL */& m! ?& }+ m) G1 p# J
EVMC6747_init( );* m+ u% l3 B8 p! B
/* Call evmc6747_intr function */) q# d0 r7 ~/ h2 D7 Y
aic3106_init( );
9 r! g3 t) i0 o4 F! D while(1);5 G8 [) @, N8 |9 [" p) R- y
}
@# `. K' a: v; l+ v! U, ^5 R4 Z3 D7 l1 n; P
7 M ?4 }, _% S t% g( s$ K+ ]" h: \aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题( m) S* q5 e; P) H. B4 Q: ^8 T. D* z" n
/* Initialize MCASP1 */9 F% [( I/ K# W: B% e) s$ M
mcasp = &MCASP_MODULE_1;
( {# k, a6 l# e! z& ^: U mcasp->regs->GBLCTL = 0; // Reset; T0 z3 M' `; n. W0 ~, H1 T: O! k
mcasp->regs->RGBLCTL = 0; // Reset RX
: r* k8 \, a2 y, n$ ]4 x mcasp->regs->XGBLCTL = 0; // Reset TX+ a; d0 S4 f. V0 [ U
mcasp->regs->PWRDEMU = 1; // Free-running
8 q0 m: R* F& h5 q5 n1 _' x- C // configure McASP0 receive registers7 C$ t2 Y1 s) W. Q6 v
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used9 L6 |% R" k: ~5 h. T
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* o2 W; L# p6 b) ]& x mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
( i: p( M* t4 o" H. o/ M mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)0 ?3 H- F9 u+ m7 O) J) o
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)" D( D* c3 F4 t; o/ N
mcasp->regs->RTDM = 0x00000003; // Slots 0,11 ? W% ]! g) I# z1 A
mcasp->regs->RINTCTL = 0x00000000; // Not used; q9 ?( x* U: v S: E
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 k+ D7 t5 \8 s/ P0 D7 k% s) m& G. a5 S( ?& k
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used" V6 S. ~* m) z& l2 ~
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
) t5 b7 i1 b% S mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
( I! |+ Y8 O* r2 Q mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-162 J5 h" t) e F7 r
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK6 l6 T, J0 E% j& K3 A
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
- ?- n& P' a) K; d mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
8 Y2 B) R3 M2 D6 k8 ~/ S4 \' V+ I7 { mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# _( N ]1 ^: f$ k+ ?8 w( C4 B: C% c
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN+ e+ J! S( `* w- O
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT3 j0 r- s$ V( P, b1 r- \3 p
mcasp->regs->PFUNC = 0; // All MCASPs- o. m7 m! t1 R
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1; u5 U6 O$ n' ?' z7 r. o0 Q- z0 L
( Y& g' @* R- _- d
mcasp->regs->DITCTL = 0x00000000; // Not used
+ y+ l2 y- W' a) g% G mcasp->regs->DLBCTL = 0x00000000; // Not used
, K3 M1 B/ p$ T) D6 l& d- n- | mcasp->regs->AMUTE = 0x00000000; // Not used
1 q! T, ^" \' Y8 Z7 S: r; Y3 O: a, ?6 x2 C
/* Starting sections of the McASP*/
* @" K8 u% m6 b mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; $ x3 E( i4 S" m
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); ' j. D H# t% k1 d' m5 K$ s7 J
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
6 \8 E- G1 W; h6 C6 L! U& R while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
/ D5 \1 q' G% d6 s7 ?4 B9 m I6 u; A+ A$ i% f0 R" z
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ( Y) a* P: Z, x9 {" d
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
5 z7 q9 R" F" d8 X mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; - z2 p2 I; U% G# M2 \: |
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
" a$ L8 D9 p& \# d; y- V" X J X+ q5 \1 `8 V. g+ ]
mcasp->regs->XSTAT = 0x0000ffff;
- A. i2 b7 \+ H* |+ R3 T5 A0 V mcasp->regs->RSTAT = 0x0000ffff;
1 h8 y0 W$ u0 i4 y! ^' R* r) Q# G- R! b M
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;6 l. K: d' N6 f" I/ S4 B
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
) M% b! S4 H1 w. h9 @8 z mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
0 M' F" i* N) u- L V: o while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );0 u% n. w8 G9 K4 F4 w! F$ I. S
$ F% A+ U, G& O1 c' a5 p /* Write a 0, so that no underrun occurs after releasing the state machine */
+ l' U( Z3 W' \8 |4 \ mcasp->regs->XBUF5 = 0;
+ I% k& ^( d0 W mcasp->regs->RBUF0 = 0;
* c1 N' p" t8 k( |& e! ~$ m6 R1 |' S7 M2 x* A, |4 z5 b2 S
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ) n" Z" ^ ^# w; C7 ?
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );8 |% C. @) j: b/ k% R0 @& V; y" Q. p
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
, W y) W$ }. B U( t; P while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
9 X- x6 A; I* h* r3 v5 X
c6 E$ s0 M) x1 R/ H5 \- `6 ~# X1 ? mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 3 u# C) e0 V; `: ]
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );% m) [% z1 D7 L4 G. x/ G! u7 r
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 6 {* M1 L$ H( H( V# E7 ^2 u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );1 z$ U" W! O) Q' v# c% D R
8 @. m& b9 R5 K# I& X CSR = 0x0000; u' }7 }# u3 u* V2 z1 @: ~) E. e
INTC_INTMUX1 = 0x3d;
% R- P7 y0 U1 T8 G3 l ISTP = (unsigned int)vectors;9 b, T1 E* [3 g7 S& @; T
ICR = 0xFFF0;
, [% v/ I% T9 U+ _8 B2 U. D' s IER |= 0x12; ) b/ r) \5 p" s, P: j
CSR |= 0x01; 2 G2 X! h8 G; ~ b$ `
8 A3 A" e- z5 V: }
2 }0 E) K; I" E5 \) x& @
1 s* V+ J; ~* p( ?还有就是两个输入输出函数:1 t/ ?# | K9 \" k$ `
void output_sample(Int32 out_data)
$ s3 @9 O8 @! G) ~{
/ G9 D9 Y. _, E+ q AIC31_data.uint = out_data;
6 _* p3 Q1 K3 {$ c. g2 n MCASP1_XBUF5_32BIT = AIC31_data.uint;
N# c: w; K' M0 X2 |9 t9 f7 D- n" t}# H9 S3 E5 I# }2 z7 o
/ a; v, H$ [' X- }) a
Int32 input_sample(void)
/ ^1 I; X" V$ t" V! D{
+ m8 V* Z- d4 r9 W AIC31_data.uint = MCASP1_RBUF0_32BIT;
5 h! `/ D2 R7 p) a5 \4 Y8 d return (AIC31_data.uint);. k3 M. @, A1 K; K
}
3 V8 ?! l: F0 F+ K& m5 f$ R+ w8 y
/ s! w0 H3 S, J9 d |
|