|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:4 j" \ a. z) m6 s
main文件:
. H: r( E" I* A8 { x. V Kinterrupt void interrupt4(void) 0 c5 o( i6 e4 }
{' F# U) D' w p$ H) g
Uint32 sample; g, ^ V6 D2 t
( u7 p6 ]* ?) O |& m: }7 r sample = input_sample(); // read L + R samples from ADC
: \& F. j7 G4 U4 _ output_sample(sample); // write L + R samples to DAC 5 e$ o y5 w& C% @$ y8 c2 F( ^5 ^
return;
; P% y1 X+ Q; E# V9 p8 n}
/ k( Y9 L1 b$ E6 z. \
' |( |( G; e: q) N4 e( V) hint main( void )
0 |7 @0 K8 b! o$ J$ l{7 Q ?. X, F) s4 f+ Z) i
6 n# {' B+ a0 A' w5 j8 ^ /* Initialize BSL */( R! J6 v1 i2 O+ G0 }) ~% ?
EVMC6747_init( );3 R" ?: }5 Z6 i0 Y
/* Call evmc6747_intr function */
5 D& d' ?: o5 @: M! g# ?. Y" U" J aic3106_init( );2 u7 v& J1 F' e9 R7 w& |- O
while(1);
" q$ n- J$ i8 C8 F- J) Q+ C& H}
5 M- a% \$ \; T( s! T' W& B! C
1 f' P/ m2 m, ]+ u& D4 g7 ?4 }
2 o0 y1 D7 N: i' n" Xaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
; b4 F5 p3 b: B. Q; G# O) \/* Initialize MCASP1 */
+ U! W' J2 p. ], l7 q mcasp = &MCASP_MODULE_1;
; ]$ H. M* v( K3 `- \! p5 r mcasp->regs->GBLCTL = 0; // Reset
! C4 {! j8 j5 {; k4 h5 Z mcasp->regs->RGBLCTL = 0; // Reset RX6 ~+ p# i+ _! i- S1 \
mcasp->regs->XGBLCTL = 0; // Reset TX1 q: J6 x' J3 `( ~4 ~- T4 i5 K6 k* V
mcasp->regs->PWRDEMU = 1; // Free-running
5 @+ y: b) r. G h3 G // configure McASP0 receive registers
6 I# q3 q- H+ W1 A: d mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used& d: y4 k: d8 g/ Q) r
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus* Z4 g6 o, m1 M7 J9 }$ T* d7 `' V
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word" I* ?; Q, y3 D- S9 m
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)0 a) @7 v" P3 l4 K6 I; ?
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)* x' c6 `4 j# T8 r% I
mcasp->regs->RTDM = 0x00000003; // Slots 0,1, _. G, i) f- N, f# l5 [
mcasp->regs->RINTCTL = 0x00000000; // Not used
& s+ |) _9 x* W; n3 q mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256/ V: d/ r" G3 q* D- x" F
8 S. [# l& T* g( m! R, f( n
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
- _8 d# s, C$ n0 c& p mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
+ ~- c8 K5 v# X1 W3 O mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word2 t+ A. m D8 z6 m
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
- ^; A1 B' T4 m1 } mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
) E; h/ y8 J1 g. E/ d+ z$ s mcasp->regs->XTDM = 0x00000003; // Slots 0,15 w+ g3 f: S" n+ L' r
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
' M8 S8 \* o- p u: W% [+ h mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256) z) N. a8 }# r! }
# r3 j9 ~+ ~. u) c( t$ F' Z) a mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
- K7 `* t: N( {' i+ G mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT8 J( P8 P1 z# M9 {
mcasp->regs->PFUNC = 0; // All MCASPs7 ?" d q6 P& w; h6 A
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
7 f) u1 x/ ]7 Z6 H* O$ D# k7 G6 \% y- F7 }9 [
mcasp->regs->DITCTL = 0x00000000; // Not used& l( }* I7 H$ e ?2 M/ M
mcasp->regs->DLBCTL = 0x00000000; // Not used( b- W: ?( }8 F; |" p! A6 e; o
mcasp->regs->AMUTE = 0x00000000; // Not used
8 K, _3 S* b4 h/ C0 Z2 s
/ s" S4 t6 G5 _) k! k/* Starting sections of the McASP*/
- G! C" l% m4 ]/ P mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
/ T! J( Q! ~; }$ p) h while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
. J/ |" L3 O' [- n mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; # _( q. t9 d/ G, `
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
6 r0 b) {, W2 b9 [7 n3 D# W- g
8 `3 c7 f0 [7 k$ M, Q& T( k5 ] mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ' f# X+ ~9 f9 Q. p0 \% x: a
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );! k' o2 \* m+ ?0 X
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 5 G4 b$ K6 F9 U" ^5 e7 u- ~: X; j
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
# U+ ^- B0 }: W7 J3 I1 j' Y- J! j
* \7 h, ?& D# }& N3 \4 m3 ~( D mcasp->regs->XSTAT = 0x0000ffff; 9 S. i9 ~' n9 V- _- A) u2 E
mcasp->regs->RSTAT = 0x0000ffff;
) G: m* C: a$ u; m' z6 ^
# r+ ]# Y- X0 m& E' X mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
8 P# J: B& b# o( e( X8 n" W while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );% L$ y* X8 `8 W( J8 H
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
; g1 ~. K2 O) y while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
/ H! W* Z8 l, _& z1 H; D; B! I. _$ [. n
/* Write a 0, so that no underrun occurs after releasing the state machine */
* r" ]! g! t* U4 F7 ? mcasp->regs->XBUF5 = 0;3 V- A8 k9 s6 q5 H0 l5 M
mcasp->regs->RBUF0 = 0;$ Z4 l+ A3 y p* z$ R1 e5 V9 e7 Q% ~
* z: u; R: t+ J3 u: C mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
* I& [6 g+ E. N$ S9 Y9 E while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );1 q3 _$ k: ~# M
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 8 s* |2 ^! ^# a2 U$ `4 o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
$ O. I9 _- [* v- E% u1 i( F6 B# F: c8 `0 ]# Q$ L4 n
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; $ x/ B8 e; a7 K! @. Q8 q) t
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
2 V% P1 m# n5 ^! A0 ^2 c mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; + g8 s6 z/ d/ F+ P& ~; P5 o( G: y. |
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );. v8 F6 j- N' w% y2 ]" ]
9 X0 T0 t+ l, m8 ^* C3 K
CSR = 0x0000;, Y1 P8 f; S ]$ ^" N a
INTC_INTMUX1 = 0x3d;" r* I' D% {% ^
ISTP = (unsigned int)vectors;
8 L: y+ M: I' u ICR = 0xFFF0;
% D- l$ E" i3 l9 H: d IER |= 0x12;
, O4 h3 y7 E3 s9 z+ I9 I4 ~( u CSR |= 0x01;
, W+ e1 ?( ^$ I9 V' F7 V8 L3 z S' R! o5 {
! i7 j& r+ D/ S9 X+ o% X! y! i" ^
( k! t q* a0 o+ l
还有就是两个输入输出函数:
" C8 \1 V+ g5 B) h F- w" ~5 Qvoid output_sample(Int32 out_data)
9 P. p* @: y# N! S% S0 o6 A{7 m! }% e* w; }1 X
AIC31_data.uint = out_data;
/ n. c% |' g) H& l/ H MCASP1_XBUF5_32BIT = AIC31_data.uint; t% M3 J4 y$ K6 U# C3 W
}8 d, d% g- t7 N# Y
8 H( ?% e) W6 L" l; G8 o7 Z) W
Int32 input_sample(void)
; w0 l. o6 _4 \4 h, S8 a" }{ 6 w7 z+ q T7 }0 C# O7 G
AIC31_data.uint = MCASP1_RBUF0_32BIT;
6 ^6 p, R* X1 ?/ `, Z4 d$ f* Z E/ d6 B return (AIC31_data.uint);
2 {4 C" G0 Q% g. j/ ~5 \# B, j% [}( t. m$ Z6 d+ R8 G! ?
5 ~5 O @, W5 F |
|