|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
/ L0 y8 q# k3 N& s* `/ p; Amain文件:
/ x; `3 O2 T" s, Q Uinterrupt void interrupt4(void) # S0 E( C @) k& i" b
{: a7 G3 L0 v8 f% E
Uint32 sample;5 U3 B) y5 v ^: |- E1 t0 M K, _: D; R0 y
- j' \( s, Y+ z/ r( W" }
sample = input_sample(); // read L + R samples from ADC
$ e7 d- a0 k; q: p7 ]/ d output_sample(sample); // write L + R samples to DAC
5 l1 p) T. H0 b, l- U: h return;
6 G8 `0 \3 e3 k) H f}
5 w- Z% G, T( W+ i: z, g6 k
( v, n B% D# F5 q; a% K" n$ M) _2 mint main( void )+ Z6 u( Y/ ?. Z: J0 A# m9 P2 g
{( H/ [1 ~; l' K- Q6 m
! K2 b" _/ \) ]: d1 b* h4 J /* Initialize BSL */! T" A. J2 B% |' V
EVMC6747_init( );- Q! c: P& }( h) G6 y
/* Call evmc6747_intr function */" ]& Z2 w5 {7 M+ D6 u$ J3 [9 ]% \
aic3106_init( );
* h: b1 p" S8 D& G# X* J while(1);& U" q; \. f; p. w
}; t2 k6 X$ Z3 V. i
; }/ G& m. P- L4 t7 v% E: Y( d, `& E, s$ b9 F/ E% d
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题( P( |# m' `' ~. j. y( i C8 l
/* Initialize MCASP1 */
; y% H4 H( r% r2 j mcasp = &MCASP_MODULE_1;
" {4 U+ b: j+ S+ Z: U$ l mcasp->regs->GBLCTL = 0; // Reset
" A/ M# p8 F! E/ Y5 W; ]6 u, M2 f: @ mcasp->regs->RGBLCTL = 0; // Reset RX6 t) ]" T0 c: c# [
mcasp->regs->XGBLCTL = 0; // Reset TX
v8 E- X; {. c. f' V9 r# W" I mcasp->regs->PWRDEMU = 1; // Free-running) j7 z5 l, _: X& ^# I9 n
// configure McASP0 receive registers( b Z; h8 w1 |- n- o$ `" `+ v/ p
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
% j# y4 |+ N n* g% w% ` J7 t mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus, S& B* r, F/ |& ^) z- p0 m
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word% s: ]/ `( N: W- U; |$ s j$ d
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side). T& U1 o: `6 i' F6 e( D% \& S, Q
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)) |3 C. h) M9 I
mcasp->regs->RTDM = 0x00000003; // Slots 0,1 j9 A, R1 E: v
mcasp->regs->RINTCTL = 0x00000000; // Not used3 t) v5 J y- L9 X
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* D+ ?$ [# z! D% ~0 D( J6 z( T6 i+ e& z7 c" a, b
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used3 _4 ^# p$ q6 _: s
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus; w4 x9 y& n6 ]2 w
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word' y$ D+ c# ^% c& O1 h
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
: Y4 ~0 W/ d: S! G# o mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
, i( H7 E' q& F6 \: q6 ` mcasp->regs->XTDM = 0x00000003; // Slots 0,1
! ~- p0 H; u% A' R mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit& [: i2 x+ B% _& {: A2 _4 k
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2566 w. w s2 d% u% x, w8 ~
( h# y+ X) m. ?6 o8 n0 @/ t
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN0 c! @. B, W( A: T+ K* C' q
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
M: \- h8 h; @* V mcasp->regs->PFUNC = 0; // All MCASPs* @/ e7 h4 n( a" {7 U7 ]+ V
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1: }% d1 b' v- \, V$ |& N" w1 t
1 z5 F1 ~$ t, |8 r4 v/ N0 S0 S
mcasp->regs->DITCTL = 0x00000000; // Not used o' s6 b/ v+ m
mcasp->regs->DLBCTL = 0x00000000; // Not used& W- e) \" ]5 G; K$ o* T' e
mcasp->regs->AMUTE = 0x00000000; // Not used7 v6 U& V$ u I8 v2 h% ?$ L
4 }$ g8 R; e+ Z4 V
/* Starting sections of the McASP*/# }% e/ i+ C* \8 s9 t; L+ k7 h
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; + C7 r* N& c; Q% L6 T4 K4 A
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 7 E# _! \0 }8 ?, L7 H$ g
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
$ @+ p/ S+ F( D8 T while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
& h- s+ q8 F v7 d1 {
" v' P! H9 \; V! |3 r( |( V2 V mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; $ j, C# ?4 o( z U' @3 p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
) e* T7 M* R) s! F3 r mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; - I# H5 D* b) t& b" G+ X! i
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
. J o! }$ V2 P% H7 t* N5 A6 S" m4 \( M- p4 R/ h) v1 e8 [6 S
mcasp->regs->XSTAT = 0x0000ffff;
" R7 S h- A: H# q* D9 b4 P mcasp->regs->RSTAT = 0x0000ffff; - I4 q3 j3 |7 d) `. }0 i3 W
6 h# F6 A- j9 [% w6 z% Q$ T mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;* M5 N1 J# O9 g! t2 x) R( r
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
. `& |$ L0 R3 e2 w8 _2 A# J# [ mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; , F1 X/ b9 q2 B( ^0 I% L
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
# k( o6 G* d; \2 d1 n6 C4 v5 C8 T% N% q; @" L& ]" a5 M
/* Write a 0, so that no underrun occurs after releasing the state machine */* l2 q" n& d. \; K" m7 \9 v# H
mcasp->regs->XBUF5 = 0;
4 Z8 ~; i+ R8 }( S6 _ mcasp->regs->RBUF0 = 0;6 }# r/ I7 [$ l) e, h
* k: ~! l* s' ^" P. F
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
8 e: q. }. f+ \+ a8 r5 d while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );& u1 E2 u8 c2 Q4 L/ d
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
2 s2 F9 ~* l/ j- ^/ N8 f5 @ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
4 A! V4 N% ~, |) x) K
: ~- `: _& R/ y! t mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
2 H8 ]0 `+ l! d* ?! R while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );1 t5 g6 X, w2 v6 i+ N& O
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ; [2 @7 |% j/ t1 l! y% U1 d
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );$ B# ?4 S3 }" Y# Q) H* h+ O: |& V
) w( u, y3 _' W6 J+ v0 p% M CSR = 0x0000;2 B4 g/ L6 z5 W8 T# g8 E Y: ~$ ^+ A
INTC_INTMUX1 = 0x3d;
e" Q* }1 ~5 i ISTP = (unsigned int)vectors;
$ b8 f. F. O0 l* ? ICR = 0xFFF0; 9 K& w8 h7 E8 |6 e8 u
IER |= 0x12; 9 X7 i+ t' ?8 t6 s* ^2 x0 J
CSR |= 0x01;
2 P X$ s4 M9 v F8 Y( g2 v/ l% Z( L) A t
0 R: a- |. O/ F9 Y
6 u1 z7 V+ N! Z2 ]
还有就是两个输入输出函数:
2 ^5 t3 o9 h' y1 uvoid output_sample(Int32 out_data)* |' Y( L* h; z( I9 K
{
+ z) E9 Y4 r3 d# _9 z5 } W$ A0 p AIC31_data.uint = out_data; 6 u3 H+ e v9 o8 d7 D. E
MCASP1_XBUF5_32BIT = AIC31_data.uint;
" F: N/ I _/ v& ~1 \; m; ]}9 ]$ p* E" I6 g1 t
% O# ~, {! K* o6 [: I3 b$ H9 G7 nInt32 input_sample(void)
% Z' e% d5 E- p, U: Q6 J{ 7 ]. h& R5 L7 M% r6 u8 _- U
AIC31_data.uint = MCASP1_RBUF0_32BIT;
# c$ T8 c$ \0 p* z return (AIC31_data.uint);: d2 k3 z9 O K& L
}2 t/ q% E) g4 {# A5 F1 l8 O5 l
( i/ Q" W" ]# d+ u7 J9 R |
|