|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:7 d1 j/ K) \3 W' y
main文件:
! x" n; Z3 g, K/ T5 O7 g8 |interrupt void interrupt4(void)
8 D: l" O1 ^1 t& C6 V% _" b1 N{3 z* E9 f' I6 [* |$ R4 V) E* w7 |
Uint32 sample;
8 E5 Z! c" Z: z/ b
5 l& X8 X2 T1 E8 t sample = input_sample(); // read L + R samples from ADC4 w& o) S4 s: n% k
output_sample(sample); // write L + R samples to DAC 6 c9 U& D- B- z/ p' K
return;$ ~# J/ m3 l, U+ f
}" {+ ~* o4 N, F o
: B# q/ h+ M+ `" b- Y6 `4 {3 aint main( void )
0 W8 h- @" F/ `8 K, C5 k( z3 V{& u b, H) n) T! [3 U1 m
2 t- k' s) d3 ]& C3 X) x /* Initialize BSL */' z" M; ] }6 ^, l
EVMC6747_init( );2 d/ ^- E9 L/ f& a
/* Call evmc6747_intr function */
2 H) O9 l% L! l. Q2 l- W3 [1 U& A aic3106_init( );2 J" Q! ^9 K, X. E" a' E6 [) V& G! V: u* B
while(1);
: E6 t$ b4 ~" ]4 H; ~: N+ g' N}
5 d, ~ N) c2 o# d( r A2 o" Z$ y. N* ]" R7 K: Q
4 r9 @2 f$ v, F0 o! ~6 u! ~aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题* O! t6 }1 S- i. D4 C3 u& p6 u
/* Initialize MCASP1 */- `( f* i8 b. y
mcasp = &MCASP_MODULE_1;
) Y0 s, G* n+ J% r3 j" Q& |- k, f( P mcasp->regs->GBLCTL = 0; // Reset
' y2 R( { k: t5 Y+ } mcasp->regs->RGBLCTL = 0; // Reset RX. @# h2 F- g- B7 |; A
mcasp->regs->XGBLCTL = 0; // Reset TX
; R7 y( w) i% t4 |/ f( i mcasp->regs->PWRDEMU = 1; // Free-running1 [1 ]% Z6 r5 e1 X9 c
// configure McASP0 receive registers
' K0 |, ]3 A3 I" C mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used- f1 [( y: `, V3 T' R7 E: z
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 H" @$ f6 m8 `/ o5 t. l( I0 T9 c mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word' y4 a4 x* m9 M$ v7 M
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)7 x6 s7 i- w3 n6 `0 e: ~
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
( _1 v, M! P \+ p mcasp->regs->RTDM = 0x00000003; // Slots 0,1/ `; V: d/ k- p2 _
mcasp->regs->RINTCTL = 0x00000000; // Not used
3 K+ p, G( X# h: N mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2560 T7 ~4 ?6 R# w6 h3 E* \; u5 N
0 r7 Y- |7 b- W7 F; e mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
. l; f, |7 j3 T" h' q( y mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
, J( Q, Z9 X+ R5 I& H" B mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word) Q4 h B! q; r+ w" n
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16& M1 B3 I- C+ b: q7 q, f
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
+ a5 _7 o2 k6 [7 Z9 u' L mcasp->regs->XTDM = 0x00000003; // Slots 0,1
( ]9 B: } x4 O N2 R. Z mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
1 x2 N6 ~& L3 z6 b( y) \& U6 e" r8 @ mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# ]3 g8 F8 R- C% Z1 @! i+ R) E" ^4 H8 i8 x& [* T2 U
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN( X) {! W& }4 ~7 Z: G5 A" L; N
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT% N. p8 O( T! Q5 v9 l
mcasp->regs->PFUNC = 0; // All MCASPs" ~5 V, M# ~. U5 g9 c
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX11 |. ^, U+ W- J; t2 M2 O4 ]
! w6 U. ~2 ^5 ]4 S) a8 ^' ? T
mcasp->regs->DITCTL = 0x00000000; // Not used8 [, _# l' z3 S7 C
mcasp->regs->DLBCTL = 0x00000000; // Not used( G3 R/ I4 p" G1 `( v
mcasp->regs->AMUTE = 0x00000000; // Not used
4 J! V) P: D8 ^* O6 x
, @; n( R; p$ Y5 m0 X) I' W/* Starting sections of the McASP*/
( E; \* Y& \; O mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 6 k# w0 J+ m7 I
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); + x L; `& I. F% G8 Q- T. M4 ]
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ' t& y9 U; s9 P1 m% E
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );4 b' a; U# @. U m
/ E9 s& c" R6 W) H* E( z
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; , t- t, U _+ b# I& y1 S$ ^- x3 V
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );$ Q$ F$ G+ s* [9 Y) T% M9 q: ~
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
+ O7 o% b* b# v4 b# U while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
0 }" `9 q: u S. d) Q, @" T0 W9 c; K
" {3 @" O1 [, i& B* x0 g! i mcasp->regs->XSTAT = 0x0000ffff; ! D# Q; p6 n1 ^. A
mcasp->regs->RSTAT = 0x0000ffff; 3 w0 @$ F3 b: @: r8 N! {
: R( y) u: f4 z$ O2 i/ W) a+ _$ V! \ mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
, j6 n! N Q* N/ { Q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
) p7 K# V* O8 {4 ^ mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 5 x8 @7 d9 H& t4 p( u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );+ E* I7 N M: z+ m3 W
) F5 Y' o! k2 e; I0 H/ V4 N! r
/* Write a 0, so that no underrun occurs after releasing the state machine */5 ^& Y) ?: G9 O2 U
mcasp->regs->XBUF5 = 0;% ?6 r" p( T' H) T R
mcasp->regs->RBUF0 = 0;
; y! U+ T L! a
1 n' I" E- p& h7 X+ h mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
9 L( Z) U2 i. I O" N3 h! B while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
8 `% _5 E0 h! h; T mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; , O2 K* s' I1 [ p8 H0 N) U1 I
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
4 n- K* R p7 ?0 E t# s4 l$ B0 D( j: T4 j3 l4 ~: B8 O8 v
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 2 m6 f( R# y$ g1 ^6 _* y5 a; X- a& k
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
5 b9 T& C2 n) A( _7 X q+ t% ] mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ) q7 P' V' O! A5 c6 I
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );. Z1 y1 Z* W* ?" V9 P$ C
9 v* C4 t' Q$ X' ^4 l1 ? CSR = 0x0000;0 x4 K. M, p- q: g4 m$ ?# A
INTC_INTMUX1 = 0x3d;: N- q* M h& R, x$ @0 j
ISTP = (unsigned int)vectors;
, ~9 B, N, S, c4 z$ E ICR = 0xFFF0;
. Q. M, T' S/ F0 } \- Z4 X IER |= 0x12; 6 n( o1 G$ x& m* R2 `5 D
CSR |= 0x01;
8 S2 Q r" ]% G5 ?# k+ C4 C \- c; [0 T6 l; v! P* h1 j
6 t) P- E* j' _! W; A4 x# p Y$ u. S _- ?
还有就是两个输入输出函数:
& B1 h: f) }* f b4 mvoid output_sample(Int32 out_data): d B( X2 L* U% d* ~) ^9 {
{
" R( |& n4 x! p. y2 G( k" \* N2 h3 y AIC31_data.uint = out_data;
u* `# A; ?% {+ l. O MCASP1_XBUF5_32BIT = AIC31_data.uint;
" q. G+ B4 C* I}% d$ \, \4 N! F* w5 x
& W6 o+ E5 l/ x* {; L7 a8 B3 N0 iInt32 input_sample(void)
' I' \ X! |7 ~0 ^) o{ % {- F6 E7 v1 q* V+ q9 A
AIC31_data.uint = MCASP1_RBUF0_32BIT;
. s$ S% {0 \+ W return (AIC31_data.uint);
8 e% B( n/ S3 m2 T" p7 s9 U( W}
; z' p' {3 B2 |! Y$ I @$ e# N6 e" r$ F1 |- v. m5 U# i
|
|