|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:+ c' |/ t0 A+ Q& [8 W( F
main文件:
; {3 t1 V( l. F+ ?: v9 ^interrupt void interrupt4(void)
2 t) v5 j4 U5 d{1 S; }7 G8 Y9 N) C# p% n* F9 u& ]
Uint32 sample;# B6 E# c- C! ~- E; n, E' `
* n! e0 l1 Q1 ~4 v0 b: r
sample = input_sample(); // read L + R samples from ADC
, g% z7 ~& o* ?0 A. P" j0 N6 }. F% c5 a output_sample(sample); // write L + R samples to DAC
}) p# c5 M. F) _+ q return;0 P3 M5 y, p; z: t! \$ d# e1 b
}
+ L s7 Y* U) [- d8 q
) p% b( \4 v1 m, x% D `0 q$ s* t8 Gint main( void )
8 ^- e. Y5 H N# y: |9 |{+ f7 h$ q, r1 v: G) T J3 ~
, p% x- [7 W$ w | /* Initialize BSL */
' r; g, |; r" R, L8 L, n/ [ EVMC6747_init( );" D/ f8 r# H4 f! U U
/* Call evmc6747_intr function */( M# Q( f- w! W- B
aic3106_init( );
5 d |$ j& t# ^! m3 e while(1);
8 v$ W" f( z G# T}" ^& N5 R, {" T3 Y0 T1 Z3 Z
, k5 L$ T$ O+ Z4 f: J
( g5 G0 a5 u) L( H" \aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
5 `7 W2 q. X- X6 D! R/* Initialize MCASP1 */
$ ~9 n- X. b4 {2 M3 z. F2 M mcasp = &MCASP_MODULE_1;6 r1 M# A& P0 C4 u
mcasp->regs->GBLCTL = 0; // Reset
K/ ~2 G6 k' X/ b mcasp->regs->RGBLCTL = 0; // Reset RX5 p4 @8 A7 Q3 ]! ?
mcasp->regs->XGBLCTL = 0; // Reset TX
# N$ ?! t8 g3 N9 U mcasp->regs->PWRDEMU = 1; // Free-running4 \$ r0 _5 y" C6 |) b
// configure McASP0 receive registers
/ A. I! |2 v0 G: v; W mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used% B( E$ G, R! B* F$ v
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" O; R$ P) f: e7 R5 k mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
/ ]# k2 g% I$ `( R% v4 Z mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
# i. d! `! @) @# u/ t) t6 ? mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
6 V& i0 l6 s6 x/ A2 ? mcasp->regs->RTDM = 0x00000003; // Slots 0,1
+ ]: s1 P E/ ` j' x. s: s- n8 y mcasp->regs->RINTCTL = 0x00000000; // Not used
7 R( y& V; D5 q/ j4 M. k mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2562 @) r' p9 H" h/ }8 S/ O2 S6 w. t+ G
* F2 |( Z( o5 p( ^! \
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used; E& s) Z5 b' N
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
! ?& o/ L2 B9 u2 J+ | mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
3 P1 n3 D4 {- M mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16, [! A- z) P% Q+ U+ d5 |
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK4 W% S% P( R( L1 w
mcasp->regs->XTDM = 0x00000003; // Slots 0,1) l0 o" f+ w, Q- t2 P3 r# m+ b
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
1 B, K' d5 k% z1 L d4 j% i0 B9 u4 d mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. t* N/ z5 u( e {4 [
! k ^% E+ P6 D+ u0 S mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
5 x3 I* n2 R* U/ ? mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
* C0 W4 ~* H6 l I mcasp->regs->PFUNC = 0; // All MCASPs1 |/ d2 x" R) G c. ~) E
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
. Q: \: Q8 f+ s3 A0 P& T4 J) f7 e) [& V* R' P
mcasp->regs->DITCTL = 0x00000000; // Not used+ m+ s; a( ?) I3 Q
mcasp->regs->DLBCTL = 0x00000000; // Not used
" E# Y! q/ Z5 z1 m- E mcasp->regs->AMUTE = 0x00000000; // Not used
4 F) n; [/ i, s& S7 ?8 Z& R- U: p4 E
/* Starting sections of the McASP*/
3 f3 g+ h& V: a) v: K mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 1 r1 D" s0 J. D
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
* u( I/ V5 P1 I& A: }& Q mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
H1 B! E) m( A while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
9 j+ q0 L& y2 A$ T' x$ }8 F7 v
) L" R w4 ?, F3 l2 `5 C+ O mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
! J5 ?; V( _) i% }: {7 ?/ ]% O while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );, i' f' d3 r- n7 l' _+ x! r* k
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
+ M& W8 J) O9 c; t. q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
) h. J! |/ r; H: b+ N
5 d1 \7 c0 U/ G0 e/ Z mcasp->regs->XSTAT = 0x0000ffff;
3 N0 a) h3 o8 y7 Q2 A- H9 @2 O mcasp->regs->RSTAT = 0x0000ffff; 7 Z2 B! Z1 E* O: q8 F& u( y
" A3 Q4 ] X( m7 X% b9 v# W% v mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;9 Q* F+ n4 q$ C
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );8 U1 o. P) [) i' M& O8 Z4 w
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
4 o2 I( a2 @# \8 T3 R while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
# v6 A9 [5 Y! F) h" R4 W; N5 _" |4 m5 D9 Q' b
/* Write a 0, so that no underrun occurs after releasing the state machine */
: r9 Z: }) ]/ E mcasp->regs->XBUF5 = 0;
, W$ b9 K5 g+ {) |0 o- j7 W( O5 E* Z/ H mcasp->regs->RBUF0 = 0;
4 g! d- E+ u! N% _ q2 u. d( p5 ]8 j4 O) Z
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
2 k, ~4 F- i& K( F/ L+ m while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );+ m2 t6 K* m+ e, f$ I8 T8 N
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
7 q$ p9 T4 s4 [- q" S/ n8 w9 X: s while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );2 @7 `* D7 |5 L5 B& a
0 G4 |, f/ S; F( m% C/ c mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
) V. f0 O3 F3 {, f9 R, g while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );' u" K( d+ b- f" ]( N
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
) l# h! x: y" {% d- X7 ]9 m while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
6 |# Y& i! l/ P: [0 C, b4 O5 R# b8 f) D: E. |) G
CSR = 0x0000;
/ `& b' T) N% B6 H0 w$ u' U INTC_INTMUX1 = 0x3d;
3 i: h- O2 F1 ^1 o { ISTP = (unsigned int)vectors;
- [0 D2 n6 C6 i& ^( F8 X" U# I/ p ICR = 0xFFF0;
1 k5 i$ q8 v8 z# m7 [% M, I IER |= 0x12; 2 _3 h' q0 {& S" v
CSR |= 0x01; # B: a2 {/ L b/ D1 h
; k0 J$ \% k1 O
" a: M l, H: O1 }4 m* ]( Z3 N/ s
2 f; d! I& }' }% y* v3 A4 Y9 q& a还有就是两个输入输出函数:
1 |0 F# P* {! n; R; p1 `$ {void output_sample(Int32 out_data)
* t0 m5 |1 y* P/ ]. n{% z& X( y; ? y5 I! ^
AIC31_data.uint = out_data; 3 q( U' E- U' X( H
MCASP1_XBUF5_32BIT = AIC31_data.uint;
4 L+ x: _( ]/ Y}* x* f3 T# k! |. b( W# W& Q; ]+ t
0 b" _+ z' V) p( X, P' i& Q7 L
Int32 input_sample(void)
+ o7 O/ V/ O2 p9 [0 f* C" Z& m" W- a* F{ $ B' F7 P( A, P( g# m; |
AIC31_data.uint = MCASP1_RBUF0_32BIT;0 w( D$ k7 J; q1 c8 m
return (AIC31_data.uint);6 [1 Q; r3 B# t( p! O/ ~6 k4 l- {
}
! \9 e( G, i6 G7 k: ]
3 t6 k$ W" {3 u2 a$ g2 r |
|