|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
7 [( q5 |3 Y; V" q1 Smain文件:
, B- N6 ]0 a/ c) f0 p7 q* `interrupt void interrupt4(void)
1 V9 z- T! D4 f) s: j/ o& m{: d6 L1 O: L E& |
Uint32 sample; G# h- G$ K' B
& W- M9 o9 u& A! w x* y$ v" ^ sample = input_sample(); // read L + R samples from ADC
2 K' s4 T5 m7 ^/ N- D output_sample(sample); // write L + R samples to DAC . @/ C. T5 o$ }# Z5 X, }
return;
# K! j: M& n; e- a% f6 I. m( J6 M}$ o6 q2 c' m+ f* I* E- m7 F" u
7 W' t* P) P- M+ s, q$ {; Tint main( void )
8 Z. P" M P5 \3 N9 _{% q6 Y8 R; h N; l$ }( A- }
$ V8 H6 R. _! C: ?$ `5 a5 y /* Initialize BSL */5 E/ q' F! J/ I; p Z
EVMC6747_init( );
; `9 u9 P6 G7 m: W9 W /* Call evmc6747_intr function */
. n" B6 X6 {/ y6 o aic3106_init( );
/ z7 \! C, ?; s e$ ` while(1);4 J& x1 O6 t* s5 e+ y8 L- ^0 c, K
}7 o9 g6 }; B1 W2 T( ]. M& p
$ k: @+ d8 i9 x6 \$ d0 E! |
% l3 W+ r7 X3 }# ~aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
1 X G6 M9 b* a8 _8 A# I# ^2 Q) x/* Initialize MCASP1 */
+ e. }2 R+ ]2 c: m/ Z; b mcasp = &MCASP_MODULE_1;
% r) T( D# d7 ?7 A2 B' h. A R mcasp->regs->GBLCTL = 0; // Reset
: m; a- x+ N$ ^6 m" A mcasp->regs->RGBLCTL = 0; // Reset RX8 Z( ^; o1 c8 P, i) d: _, \& `
mcasp->regs->XGBLCTL = 0; // Reset TX
2 a7 R) u1 q; M2 G3 G O& R mcasp->regs->PWRDEMU = 1; // Free-running( [3 b: [1 |8 x" a7 P3 L, B
// configure McASP0 receive registers3 v x2 z3 n0 `3 ? ~" S% z
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used" U9 T3 K3 h y2 \6 E
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus% O: q8 O% c0 y/ \7 ~
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word4 q7 d. M2 y" j* u8 W2 ^/ H5 Y
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)9 Z1 P7 z2 ]4 r) a- u* F$ j: c# m p
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side); ~: m: p% o0 A! ^
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
* E- m, _: ~6 P: `# i mcasp->regs->RINTCTL = 0x00000000; // Not used
" h" N3 t/ z2 D+ a mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256/ L$ O$ s6 C: f& F
$ Z& }: m# i, D& y- p
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
0 z. p: O- Y; x+ i0 S( B9 M mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ n, E3 U6 X/ Z: E mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word" K( E6 a- `4 [" T% E9 v
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16# n, Y/ C& G" d8 u
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK2 ?& C: C o6 E# q& h9 M+ N
mcasp->regs->XTDM = 0x00000003; // Slots 0,1$ _ G* ~' e9 P0 d- ^$ y! U Z
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit! p0 G( e D L
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
n" m, n5 T' ^3 b# v9 V1 J. N+ A6 b
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN: o& n! r5 p6 g& v8 b# R
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
6 K" c' N+ K: B/ C. Y2 d mcasp->regs->PFUNC = 0; // All MCASPs
* O6 i" c: N: o4 m; }% [ F3 f1 x mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1* O3 e1 ~" ~& x
$ m" }4 J4 M9 ?- o mcasp->regs->DITCTL = 0x00000000; // Not used
$ t1 y3 T# k7 d- p) O9 _0 l( ? mcasp->regs->DLBCTL = 0x00000000; // Not used
% [$ T/ x" A# F1 {! C d mcasp->regs->AMUTE = 0x00000000; // Not used8 y' w5 o% q0 L* W. h
C* B3 B; b$ K# U6 J/ r
/* Starting sections of the McASP*/4 P. y# p9 e! }, B1 ~4 O- E
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 0 O& ^/ l* i+ ^5 n) j( v1 M
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); ' Z8 m& I+ `1 G* E0 u: W3 W2 z0 T$ J
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; : A/ N* g6 w5 g7 G! B' }9 {8 i0 b
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );0 e7 M- \) s' l
' u9 d4 ?9 d2 w) W
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; / z/ v# x' ?/ L8 f( j8 ^$ J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
! G1 B' C, ~ @ mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 6 J* d+ S1 ]. v% v, y& D, r8 j/ l* ^
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
' {& n& n- s8 E1 N6 c7 v- b
. a& L2 e! O9 k* y o mcasp->regs->XSTAT = 0x0000ffff; # Y0 L3 n5 Y& l+ w) ^1 b; K4 o
mcasp->regs->RSTAT = 0x0000ffff; 8 s1 \' C) r( G% e
6 M6 N$ p* w: v5 K: E; S
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;: B7 @0 N# o! m5 u( P: l
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );$ ^: V, Z. y( a: W" c' [
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; . J; R( D4 N( }% d
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );+ _- S" u0 J# Q( \
6 n1 L1 Z* m5 m% M9 v8 B
/* Write a 0, so that no underrun occurs after releasing the state machine */& W& h, V' n% P4 R) w
mcasp->regs->XBUF5 = 0;# [: V8 i4 \- n& I) w+ ^
mcasp->regs->RBUF0 = 0;
6 ?5 E! ?* `! X6 w2 K% p* {9 g/ S! _
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
# f! w# e; A1 R" v while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
6 s) E( r" N- A6 ?7 \ mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
1 D% _$ D+ @% L+ Z+ E$ ~ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
! j8 O9 g- S& n0 r% R
9 r3 T- l6 {) W0 o8 E mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ! t. Q$ b2 b4 Q' }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
( R" I1 z3 n U" f5 \ mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; + a+ Z+ R1 n, v
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
) `/ D3 y7 q' u" Y" K
8 |! P9 u# b( e& i3 V& r% X: M+ q CSR = 0x0000;
$ @6 D" h4 K5 z8 v$ n INTC_INTMUX1 = 0x3d;$ x3 E8 g- Y/ x; j. t2 j
ISTP = (unsigned int)vectors;8 y. }1 T- K. F" a
ICR = 0xFFF0;
% v2 I. O0 d. B: B' M' b IER |= 0x12; 7 T# j; @* E0 _% E! O2 T
CSR |= 0x01; " s: M, I; i' l1 C, C# C
. @: t& u7 @ i1 ^0 i8 K1 T
P) f+ \/ D5 H8 K3 W7 Y
- ~* H; R7 q2 G还有就是两个输入输出函数:, Q) y1 p( g" E* X
void output_sample(Int32 out_data)
: P5 A+ t, Z6 X( M+ U, i6 P{
4 b2 h: {5 ]: e+ O0 w AIC31_data.uint = out_data; ( G5 j) K* y6 @
MCASP1_XBUF5_32BIT = AIC31_data.uint;
7 ~' i% h& X, C}6 \+ H: q3 Y& r+ h/ `$ v
( O7 E( a, K$ Q" a sInt32 input_sample(void)
0 N% B6 H( k) x{ , ] q& \/ Z! I' ^, N6 e! i
AIC31_data.uint = MCASP1_RBUF0_32BIT;
) k: z8 _1 S7 e+ C( k/ O return (AIC31_data.uint);+ M* ~3 n4 i( }% \ }2 u
}
4 C5 y. J5 g! ]; h; i w$ O' E* i
|
|