|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:; J9 G4 p* y4 @+ E( W
main文件:! Y! w5 o% e5 k) g% A" R3 h2 O V
interrupt void interrupt4(void) 9 u+ @5 U" X7 C- L# v1 w, q
{
: [2 b0 |3 Q# Q! ?% X8 E1 W0 \ Uint32 sample; F1 ^4 Q2 x$ x& o9 f
3 t% e# Q. s) M( Q$ m7 h5 @/ } sample = input_sample(); // read L + R samples from ADC
& D: V$ f' E+ K- m output_sample(sample); // write L + R samples to DAC m& @7 m: p; z" D8 p- H6 h) @
return;
1 T9 p2 x! ]& y: L}
5 w7 c$ K' _% @ ?1 X+ I. J9 K3 L7 `
3 |% j% _! u8 \int main( void )
$ C& a6 \ a/ [7 ^{' f" ]3 p2 c, |$ z
: x; i( o0 V; s6 z9 } /* Initialize BSL */ }' q& v- [- g, c2 I6 p/ h/ g7 h
EVMC6747_init( );
$ v1 x* T9 a9 h /* Call evmc6747_intr function */
; a |$ U' d4 h: t: ~ aic3106_init( );
" P" X* u6 t$ z9 v/ b' f3 E while(1);2 H7 L0 C6 A( P$ \# S' T) j
}
3 a1 y1 ^ U7 A2 u! ~5 E4 W! e/ x* @" Q8 @$ ?; }" y$ @' m* R
y! J, _' c6 x0 F% U! ?3 b, D
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题9 L! [/ p0 ]/ T0 _! E, o$ T
/* Initialize MCASP1 */
2 g% D. Z+ Y* P3 l mcasp = &MCASP_MODULE_1;
9 _4 i, ^. m, K/ o' `6 d. W9 q mcasp->regs->GBLCTL = 0; // Reset2 m# A( e) l9 r. F
mcasp->regs->RGBLCTL = 0; // Reset RX% F" d* E0 _0 K6 k& q9 o$ K7 Q! L
mcasp->regs->XGBLCTL = 0; // Reset TX
- |" ~. V+ x, ?; }) Y' l5 ~ mcasp->regs->PWRDEMU = 1; // Free-running) M, d& [* `/ \, j
// configure McASP0 receive registers
5 p* J. r0 M% N0 e2 e# e; x; X) _: L mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
( w- D' l' z/ _. f& ^ mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: V. U8 T- Q& e" a: U1 G mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
: [, x( t! T; }0 u( @ mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
! ~6 r1 N! y! q mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)+ v6 g3 \% d+ M6 H( r; N
mcasp->regs->RTDM = 0x00000003; // Slots 0,1$ ~+ P+ }; T4 r0 w2 l, c" L
mcasp->regs->RINTCTL = 0x00000000; // Not used( @, l8 |! }6 o0 Y F' `
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
0 }6 F0 ^: ^5 {: ~6 T0 L/ Q& l" ~( C0 Y6 P" T0 W
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
& F* Q& X( c! {* Q8 a0 D mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus% e; C+ m; p! j% }
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word' k, l) d! D* T
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16$ [4 R& G" _4 T
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
& {9 X2 |( `0 p( O. i! a mcasp->regs->XTDM = 0x00000003; // Slots 0,1
/ |2 n+ B- C: D8 g* p mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
0 r$ a0 _$ a1 M' }1 |. K mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2563 w, c# I* x B+ j
! {9 F( W% n @* G3 h mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
: p# k8 p2 F# c( }* D' D mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
7 A( x/ d8 E; A& i8 ^5 h mcasp->regs->PFUNC = 0; // All MCASPs
0 F$ ~5 }4 K s6 T% n$ A- { mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
3 M; v0 Z. a# x) Q9 S* ]
- j, d! C' s, q% A | mcasp->regs->DITCTL = 0x00000000; // Not used
0 @' s& y% F5 B* G0 R: t mcasp->regs->DLBCTL = 0x00000000; // Not used
! h7 J# h' X9 o4 @ mcasp->regs->AMUTE = 0x00000000; // Not used' b# x( t- _3 V3 a1 X- c4 {
! p N @5 F- c' J/ M6 O* o3 B7 M
/* Starting sections of the McASP*/) \* c) W. t$ }3 u( C' ]
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; - V) E& `3 Q5 r6 }! {
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
3 D1 N j( y* J; | X mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; " o) U1 C7 j, Z; D
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );$ N: s' K: j8 |
) s- o' `5 t, t$ d
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
1 w' \$ P7 N5 m8 ?8 z5 ?: [ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON ); h$ `$ ?+ O. N" o6 L, a) _4 E' z
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 6 n5 X" P$ a7 b J% X0 K( q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );) e$ B* J7 T+ p1 l
1 s d5 l; A4 Q; r; o mcasp->regs->XSTAT = 0x0000ffff;
0 [( G( N* ^" d+ l5 [; d& z4 ~) ^5 C mcasp->regs->RSTAT = 0x0000ffff; . m2 k$ P8 Y+ \" a. O
+ V( L* s, ~2 e0 s. O mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
9 K0 _5 V9 I2 _% ^$ b: c6 f while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );/ [- P9 [* K* i. u1 b. t* D
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; # C, D+ g8 D8 l4 @, P2 a4 j: O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
! _2 `4 u5 @" s! A, t4 J4 y- n% Z3 x3 I1 q" ~, }: L! h
/* Write a 0, so that no underrun occurs after releasing the state machine */" v) {, U+ p& j' r5 W1 R1 ~; y
mcasp->regs->XBUF5 = 0;
$ j. X4 q( B7 \) Z% K1 u+ I2 d mcasp->regs->RBUF0 = 0;' ^- I# H& l* r" \
' B5 D( x9 h. ~; f$ t9 K4 ~5 o
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 5 s: e" D' t- k5 a0 @5 Y. H8 t# ]8 {
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );! @6 O7 h! w* }; Q. g! J' J
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
; R/ |1 ?, k" ?( x [# `: j2 j while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );" U; h( P5 G) H8 P5 M! ^" [: {
8 c9 {9 t$ ]9 a) D
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
! d) }0 ]! m1 [2 p: ]7 A9 q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
Y* i! q) q# h4 B, e mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
) u& l s$ H$ l5 D2 W- w1 m2 z while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );: Q0 C* ~' `7 h% N
. `4 t1 e. m& y5 N3 ]' T' k* } CSR = 0x0000;- D; q. r0 i" r0 Z1 c
INTC_INTMUX1 = 0x3d;$ c4 ]: B! k- ^
ISTP = (unsigned int)vectors;
2 ~" f! {/ l" t( w8 M ICR = 0xFFF0; - K$ e1 P% ~, I
IER |= 0x12; 3 L* ?6 E0 N! l; }5 S( W
CSR |= 0x01; 8 n: p7 i4 O; ]; v( Z
3 ]3 }7 {9 |! ?2 E6 |
/ }0 x) U3 F& h8 z
2 P2 k0 x9 _, z还有就是两个输入输出函数:
+ L" s9 _) A$ W* Vvoid output_sample(Int32 out_data)
- e3 s! j2 R P& ~$ k7 u5 {& z: i7 K: i{
" u* T* Z$ H6 I AIC31_data.uint = out_data; 4 R5 k9 T7 _, K6 n e9 P7 R' s
MCASP1_XBUF5_32BIT = AIC31_data.uint;
4 O# d5 u9 N' b% j3 ^& v6 Q}# _! C+ I3 s9 y9 i+ P
: O: J( m0 a; F( l! ^2 }
Int32 input_sample(void)
8 N5 X; g# S1 _# \/ ~' n C{ & ^( ?& {. U$ l ?1 F6 X$ t
AIC31_data.uint = MCASP1_RBUF0_32BIT;
4 ~" }$ _8 l4 r$ R# M return (AIC31_data.uint);. \( R6 ]% M1 B, w& L6 M
}
" J7 n9 E: a' p5 Y O) e, \* D0 X+ t1 ~0 M" l: K( N) W
|
|