|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:3 y6 W8 f+ a. O" z8 `5 y$ q
main文件:; W9 O; h; L) C1 A* {4 p7 v
interrupt void interrupt4(void) 0 l# r+ u. L' L
{& q5 G, v) g$ c
Uint32 sample;
) L @! n3 X( ?! Q/ D+ a" n
$ x3 I3 `4 @$ h6 f9 `: U- P( V, D sample = input_sample(); // read L + R samples from ADC: k, }0 \! z, w7 h1 s, [
output_sample(sample); // write L + R samples to DAC
" _* w# k3 B( x7 ^ return;+ T$ T% @" l- E+ B4 ~
}- i8 v. S7 e: X: F- E" g, V7 L. |/ O
$ ^# b8 ?* I4 O9 @$ H4 c; T1 Vint main( void )4 q R$ X$ s. y7 S7 ?6 s9 I% R
{
/ ^/ w, }, D0 X! u" N9 @( E; Y6 c9 r. r. b: d7 k3 o& e
/* Initialize BSL */: X5 q% ~5 Y; E' X" W6 s, ]& h* B0 k5 Y1 w
EVMC6747_init( );7 }8 M% j' m/ r; ~& T9 i7 V0 C- w
/* Call evmc6747_intr function */1 Z; _* l" ~1 T( j; [! g! T
aic3106_init( );" M! f) B* s; H4 g5 h. t9 p! o# {5 f: g
while(1);" e8 m7 E' Z R) L$ s
}
+ b, L! _. O, Y7 }* z2 t4 W3 P
e5 e* S& c+ U2 U4 E; j' ^+ Y2 D- K: @( S0 X1 {: c* `) p4 A
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
2 n4 V, R# p' H r0 ^/* Initialize MCASP1 */
' m2 ~% X4 ^7 `3 b mcasp = &MCASP_MODULE_1;
, q; K1 l% g1 Y. @; T; F mcasp->regs->GBLCTL = 0; // Reset; z/ C0 a# _: N# E: U
mcasp->regs->RGBLCTL = 0; // Reset RX7 y+ P0 G: `' E% f' D
mcasp->regs->XGBLCTL = 0; // Reset TX) J) |* v8 e1 u; v6 D0 G
mcasp->regs->PWRDEMU = 1; // Free-running
# S$ O w0 I! M: T' F5 g0 {- ^4 X // configure McASP0 receive registers
* l. }6 I' o$ m3 @6 E- I/ } mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
5 v( P: i" F' }9 _$ E mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 o, n: X: l: d; G" Z1 f1 a" p mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
! T/ a; a' L( P+ D: j mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
; v/ d. N* _6 N0 n0 m0 k mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)1 \. d( [, I4 W( n) k
mcasp->regs->RTDM = 0x00000003; // Slots 0,19 z4 p; o Y6 S! m# U5 L/ h* ^
mcasp->regs->RINTCTL = 0x00000000; // Not used& S" y4 q0 z0 e. N) G' `; @
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, _3 w; }9 V% r' ?: n! B b0 {* u) B2 ^3 S. G) _3 Y# @; X5 o1 i
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used& L) c; }* I6 I! ?$ R
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus- \+ f% c% `" z& i3 Q5 O+ p7 h
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word$ E, ^+ ^5 B i! [( D9 X
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16, S: r! i1 m j& e$ ~* E
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK/ ?9 Z7 [/ [7 _3 ?4 i
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
: J: C* F. w: f; Z4 b! }' e mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
3 k, ?: d% q( o: q. D3 s$ p mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 p& }+ @5 g2 f! |. n
4 k0 u* a* @% s& a2 v' V9 } mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN4 i) R m( T; u: @
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
4 [9 ]5 t& i& { mcasp->regs->PFUNC = 0; // All MCASPs5 O4 a N% _2 [
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1# H" j; x; \! l7 H) s" e7 f2 v+ Q9 y8 D
7 o7 b3 `: n, R
mcasp->regs->DITCTL = 0x00000000; // Not used
- I! G2 S# u7 g2 ]4 {5 t. M" N mcasp->regs->DLBCTL = 0x00000000; // Not used
* b e0 I4 ]7 c mcasp->regs->AMUTE = 0x00000000; // Not used7 L* X/ D' r0 b5 o
) g4 L' l& A- r" _0 r: j1 V
/* Starting sections of the McASP*/
% [' S$ i6 z4 _' Q4 b7 c mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
* ^% @( C+ g* { while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
. Z6 U8 F! f1 X mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ! ]" d P c& z7 s {
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
, ~* z1 u, ^) e8 { {$ u) Y' n$ y/ ?! O) t; `1 N: _0 A" w+ r
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
& n3 M' X+ N5 M! L! O& D while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
. y7 }9 F5 \3 w0 V4 I+ l mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
q$ B/ V1 U3 P, z9 V while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
; N9 t' l' f1 s0 k
( F O5 o8 {, U' m+ W mcasp->regs->XSTAT = 0x0000ffff;
, }3 X' i/ t" L/ j0 M1 i5 E mcasp->regs->RSTAT = 0x0000ffff; 1 ?- W/ ~1 K3 q: m9 F$ Z' D+ Q
( s1 B: m6 K7 j$ k* j1 ]2 o) Y mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;5 y/ P" z- t# d: i# Z* n* b, W- U
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );0 ?! L2 @1 ~. v6 S" Q
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
% V* \/ Q7 l7 {* O- _# W while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );! U$ M2 X* S6 I$ n% k v# h
+ t/ h; t# W* {2 c" C! r& z8 S+ x! ^
/* Write a 0, so that no underrun occurs after releasing the state machine */
8 `& K3 a5 |; E8 M! V0 Q mcasp->regs->XBUF5 = 0;- x# J& j+ ~" y, x. i: h
mcasp->regs->RBUF0 = 0;
9 y8 z2 S F9 M# @& H k9 i, _; v
8 g0 G) F4 {) n+ J4 Z mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
3 }9 B* B$ h. D while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );( e( O5 m( O7 Q( D* x/ X4 g$ u
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
: G3 O( \' \$ [1 R, f; G: v a8 i while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );, P8 d% e1 @& V
2 x/ u" \$ W" P4 @* w( l* l2 k1 q mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; % z0 @' f" W8 r, g2 y3 @% z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );# w5 L: S: a2 i) {7 z
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
+ n" h3 `. X4 t5 A0 n! c while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );5 C: t* v8 k u' I
* U" t7 M! } Y; J6 u) l2 ?3 R* |+ z CSR = 0x0000;
( c, V; {% L, [) p! ` INTC_INTMUX1 = 0x3d;- x2 E4 P+ L8 h! Y: p9 f
ISTP = (unsigned int)vectors;/ R* u7 o- v$ {2 E2 g1 d6 m3 G( V
ICR = 0xFFF0; 3 x" o( N" H3 A- |( v! ^* u1 ?7 g& R
IER |= 0x12;
' x# d/ L! L$ p CSR |= 0x01; - U" s0 I% M% R7 C
! B2 I) e/ w$ T* k6 z7 \* i, H
- q5 i4 H$ v, m) O5 }
+ h0 `) s7 E. d* s _$ S* ]1 f还有就是两个输入输出函数:% P+ P4 r( _/ U+ z4 q. T! w
void output_sample(Int32 out_data)
" o' T. B% K9 S6 S3 Z{
" i/ B& b1 p" K AIC31_data.uint = out_data; ' a; q U& [& N: q9 @
MCASP1_XBUF5_32BIT = AIC31_data.uint;
5 Y) m9 [% a2 w( X. R}
3 Z; z) H( m2 q& |7 `
1 j+ b: Q: X' w! ]Int32 input_sample(void)
- g2 q* W( o7 F- j{
# z2 E$ `0 ]& }; c8 [* V' Q AIC31_data.uint = MCASP1_RBUF0_32BIT;" m2 K) L, _& T8 i Z! D
return (AIC31_data.uint);! v$ E" X' X% q3 Z6 j6 F# F1 c
}
m7 i( L* n+ c+ e; N& w( \
' q3 g3 l0 b. [ |
|