|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:4 N0 M; d" I1 ?! m6 l/ N7 Q2 h7 F
main文件:; a2 {8 h8 F* b; c9 Y j: z
interrupt void interrupt4(void)
* ~/ ^0 \8 y' ]$ ^+ |{
- @3 ]2 u6 D0 n6 f, U/ U& x' o Uint32 sample;
/ m4 p; e; C7 [$ ?& e* Z- ~6 D. ~9 O; ?+ ]5 D+ x
sample = input_sample(); // read L + R samples from ADC
$ }3 E U4 r0 K' I& x9 ?; n: f output_sample(sample); // write L + R samples to DAC * J( q6 H' I% L9 n( `9 w% x% q
return;
/ A1 N! H4 C& y7 y$ F" {. l}8 o& d/ X, y0 a H7 I( s
8 z1 V! A3 y0 A5 _: @int main( void )' S* G5 P- a8 {1 I5 U" z1 h
{1 L, p% x* a/ Y2 }: }
3 _7 F9 j& ~: l: { /* Initialize BSL */
5 W2 D1 m) |+ c% K EVMC6747_init( );
5 g: ~/ f6 N/ \, F3 I /* Call evmc6747_intr function */
- y8 p5 W& l9 J9 J- l! I aic3106_init( );
- \5 d: E3 x* e! i; d( }. j while(1);
/ h, j0 s9 m: U9 z, ` t' t' b}
3 J5 l7 ^8 m1 Y5 f* L9 ]+ ^# N7 P/ _
7 @) q; p1 I- j- G# A5 y0 I, x& w6 B" l
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
; h! @4 n$ C" [3 z/ w5 p/ Z/* Initialize MCASP1 */
/ i. m( O& X% u+ v6 N2 p mcasp = &MCASP_MODULE_1;
7 @3 F$ i) k5 R* g mcasp->regs->GBLCTL = 0; // Reset
, m( M c$ T+ u1 R+ b8 r mcasp->regs->RGBLCTL = 0; // Reset RX# P3 b0 }0 I8 }6 ]. P6 q( E" {
mcasp->regs->XGBLCTL = 0; // Reset TX7 o: N) l( I- ^% i* ?/ R
mcasp->regs->PWRDEMU = 1; // Free-running
3 e: p8 f- x9 h // configure McASP0 receive registers3 C# i# B9 x/ j$ H* d$ y
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used9 i4 `0 R& F5 M0 U& I' M) x
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus9 Z- ~7 O) h3 ~
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word q9 K* n' n% h5 n) T$ ~6 @% i3 \
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
/ ?8 G/ k: ^5 K# h0 ] mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)3 F1 P: _: Q5 A. J9 _. {: l E
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
8 Z. l- ^( p, @ mcasp->regs->RINTCTL = 0x00000000; // Not used. D2 k4 |+ c% o: [ N1 S
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 N2 @/ h" N2 P( y4 c/ B ~' U* D* ^: S' F! z9 `
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used: g2 N5 y% i* |: V
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus" f# ]* l$ [2 D& O% _
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word* y! |+ T0 o# i4 l
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16 [, _1 c* m* `, l
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
" q' @. g) i) a' T' X7 u5 o+ i8 [ mcasp->regs->XTDM = 0x00000003; // Slots 0,1 n* w8 l @' y/ J# A% K& r
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit% ]3 |' I7 C7 Z3 t; _/ O
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2568 L, q; H6 W5 S! s. ?
5 G: s% T$ _7 Q' p; W0 S mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
! \& R4 T' b) A8 Z1 ]8 A; I/ D2 U mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
; P% v: w# L/ V mcasp->regs->PFUNC = 0; // All MCASPs$ x0 x f$ Y' Y
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1, ?! }* f _3 j# d$ D6 E7 O
2 H& X2 H# [% z5 f/ c) F' S
mcasp->regs->DITCTL = 0x00000000; // Not used D5 o8 y0 D: ]* A. d# {2 n. c
mcasp->regs->DLBCTL = 0x00000000; // Not used
5 ]" N# S3 ^$ d" V3 |+ H9 h* W mcasp->regs->AMUTE = 0x00000000; // Not used( m0 x/ o0 W. h0 a/ g
4 Y$ |1 Y( z! C4 M
/* Starting sections of the McASP*/+ ?, [* M8 v7 d6 ~
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
3 J3 |9 Y! F; H% S6 \ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
8 b2 O* M: _2 e! ~0 f# K mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; & F% Z$ i$ @+ t! E/ e) q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );" V5 |7 w7 K/ [, {
7 u, ^7 I' o/ Q
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
8 t/ d6 a, A1 p6 s* X) p7 V9 g while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
/ q* M5 y. I. M mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ^6 f" ^- k. d! p% z6 ^
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );5 u/ L4 Q, u' u4 t6 v" S
+ U; x8 P( `# a1 E6 q0 r
mcasp->regs->XSTAT = 0x0000ffff;
( R4 Q( I2 @, V3 D3 \: f2 k0 L( @' Y. } mcasp->regs->RSTAT = 0x0000ffff;
! r' f9 V+ x6 j1 u- y9 j2 o4 f c. m! m: L* z
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;; u7 A' N# R7 J; T
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
6 Z4 r' t' E5 \ mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ]$ [$ M! Y# T( _( _( ]
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );' T* L3 C3 v0 u3 G5 o7 H
3 F* U: R6 L* K
/* Write a 0, so that no underrun occurs after releasing the state machine */8 N) a0 Z, O; x3 a0 ^
mcasp->regs->XBUF5 = 0;
* ^7 e3 I6 x2 I, E9 f8 } mcasp->regs->RBUF0 = 0;# W; E- x% U' ~0 k- s+ P. L; ^2 `
1 B! I. w+ J& k% y7 ^
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 0 {2 W7 S* s! b4 f9 c; _
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
# m& {4 P$ p% o, a* ?- E; Z2 T mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; " R6 ^; [; \2 t/ \" j& [
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
) {" B2 @0 D6 H0 C, l( k" n" L" J$ {
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ' m% q1 H# J2 X. l
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );+ z+ Q$ j* r& d2 _5 J+ z
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
# }: P5 L. b* L$ f* _/ V y) w/ A while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );& W( ~+ ^7 @% k4 z& ]
" s+ v3 p2 V. H T% I- t5 Q
CSR = 0x0000;
6 r! S- J# W- B" L9 [ INTC_INTMUX1 = 0x3d;$ H: y+ ^ o8 o" ?, P: K. }5 M
ISTP = (unsigned int)vectors;$ X1 x" q. v% W" v( @4 e
ICR = 0xFFF0;
3 f9 r$ K( h- X, @& b; C1 s% O. N IER |= 0x12;
1 X2 u9 F U6 x' H0 k. a/ l CSR |= 0x01; : V$ s" W* r. K3 x( F: y* D
8 t3 z: t! a+ f4 i, P
8 r6 N2 ^& \5 g4 T6 p5 ^5 s
: o& E2 |- W, \) q$ m# c还有就是两个输入输出函数:& q* r7 k( N3 @- ]; q7 \
void output_sample(Int32 out_data)' a# W. j( _# |, J% E
{9 D9 r8 O4 j* |) Q! j) b- y5 i# k
AIC31_data.uint = out_data; 0 u' |2 J4 _2 H
MCASP1_XBUF5_32BIT = AIC31_data.uint;( a# t. o2 F. r% |/ e- L. y
}
$ v, o/ a8 P- {1 ]& A! |% P$ u4 f, ]2 b5 d) `! @ p+ ?
Int32 input_sample(void)
$ j( M/ |3 J* g9 J; C+ A* E{ 9 K6 }) D/ P6 m' q% y
AIC31_data.uint = MCASP1_RBUF0_32BIT;4 ~$ k# C7 }; z, d; H
return (AIC31_data.uint);8 R) a1 @9 X+ d0 A" ~
}
9 h* a3 @: ^8 A1 M- N- y& `
/ N( }" p2 W+ c" q! {, H0 r; H6 m |
|