|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
X. G' J' w$ A% u4 ^& d( e/ J) Smain文件:
7 `/ i% S3 {4 ?: R% Cinterrupt void interrupt4(void) / y! @! b4 V4 K- A8 \0 L/ G; y
{6 J7 l$ n g: {7 p) i Z3 ^
Uint32 sample;
1 k+ q6 q; ~/ K! A- L) @5 Q: ?4 U
; F0 ~" \/ ~7 b, x, l |" y1 ? sample = input_sample(); // read L + R samples from ADC
1 S2 d: G: t2 d4 w: x0 _: U1 s output_sample(sample); // write L + R samples to DAC ; L/ I* T1 N& u: F# T! `
return;1 H; R j. w2 s2 r
}
) D1 Q! D/ L- {! L
B1 Y9 z% i+ z- u) Nint main( void )
6 A X$ ^2 f' f{
/ Q8 d8 X2 ]; F/ q( F$ G) |& _0 s' J7 @! f5 F
/* Initialize BSL */
; Z6 m$ z1 [) P EVMC6747_init( );
& h8 ~1 q) f: H# q* I /* Call evmc6747_intr function */
: J0 j, `( Z& X1 A, y aic3106_init( );
8 g/ `; r* ~- _5 `1 V while(1); A @5 X- Y9 P, ], F
}
* }3 C7 C! _% @; m- n* X
( q) O, Z; J e# s% T8 z* H. G. N3 f1 Q5 y' x. ~
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
0 R8 i1 N* [* S0 a" T- b( T/* Initialize MCASP1 */
. _' W( a6 |( b; g/ M8 z mcasp = &MCASP_MODULE_1;' r9 W: M& I# |' Q1 T0 e: i
mcasp->regs->GBLCTL = 0; // Reset
5 V/ D& L. X% R2 h5 K% a4 B mcasp->regs->RGBLCTL = 0; // Reset RX
7 d6 ]8 O# g' g: Z$ M! d mcasp->regs->XGBLCTL = 0; // Reset TX
. K& [( v+ E* ]* V mcasp->regs->PWRDEMU = 1; // Free-running' f6 R! c+ ?$ g3 O
// configure McASP0 receive registers
; W9 }3 D% [% o1 ~9 o0 ]3 ^5 \ mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used9 D8 b" I! A- W
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
$ S- d5 X, s, U% u- e mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word& H) ]2 } ^ i0 M
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
* Z! @0 w# \# c. ]/ [ mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
% p8 V* `! p8 W! j mcasp->regs->RTDM = 0x00000003; // Slots 0,1: S5 \" c/ P8 e6 `2 M+ y
mcasp->regs->RINTCTL = 0x00000000; // Not used7 x ?& c: L* i8 h# y
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ q3 [' N6 ^% M. y {$ I
) I& L# i/ F& V0 P$ v mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used7 x$ V, B! B3 a/ c, Z9 z6 Q
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% k4 b* v( _2 n8 g% ^6 l4 A mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word; |" ]+ R6 e6 u1 ?* M1 ~3 l
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
, A$ `" k, z0 T% \8 X+ m mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK0 E r4 X0 Z! m5 r2 y
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
( l1 \1 w! n+ n: v- R6 X mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit* @5 x T1 ?( Q% a
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 y, X0 V% A, S- s: }1 _
8 j( K& u7 ]" ~; i9 p ]5 v mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
- }! G9 t% E7 l mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT" d& T- y% b- Y5 B* V" J
mcasp->regs->PFUNC = 0; // All MCASPs
/ _& W2 `) d2 o mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
% u& J5 W8 u0 V8 ?& L+ T9 v
( Y4 g% F W$ A" M% E j mcasp->regs->DITCTL = 0x00000000; // Not used% \- T9 ^5 q$ f
mcasp->regs->DLBCTL = 0x00000000; // Not used# _1 N8 j) R: K
mcasp->regs->AMUTE = 0x00000000; // Not used
: y+ a" {, m7 ?' ]; L
% w7 o8 F0 }+ w' @' j/* Starting sections of the McASP*/, s% [, z+ Q3 u$ b& ]
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
# T( n2 x+ y2 O& [ \ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); % J$ [1 ~1 s& O0 U) B
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
$ c# g6 b$ Q! P& C4 y) ?" q# q& m while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
7 R0 N: W' A% E( g' S2 B" l2 ?1 u; Z4 z/ N5 Z' \, e( n2 p
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
1 a' W" U: l& D, p3 M while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
* y# X; t+ S; b0 o* k mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
' U4 K# I* e# B# M while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
U& c6 u+ U5 p2 q5 K# L3 H- [8 ]& J9 C" B
mcasp->regs->XSTAT = 0x0000ffff;
4 B$ g9 v0 _5 M8 Z: I mcasp->regs->RSTAT = 0x0000ffff;
) ^3 S/ |$ z) i) h& H$ W0 j. \3 v# H+ p7 {' l
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
6 v8 l- X$ [6 F" c1 V while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
7 D# K! E% f, n; E5 E mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
9 P- q) k( J% y9 O. { while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
, ^! s u' I/ d7 h/ x, |. n
) W I* j1 W9 V /* Write a 0, so that no underrun occurs after releasing the state machine */) j) ]$ N' n' s' q; ?# C. n. `7 H
mcasp->regs->XBUF5 = 0;
: {! t, ^- N# Y* _4 m9 r mcasp->regs->RBUF0 = 0;
/ k- i. g) ], V! ~ Z( E& A9 @$ [1 x3 z- P' o" T
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ; o, s+ L' C! }3 k
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );: r& T; R/ j2 n( G# C
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 7 s/ L+ S6 @ w) L; u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
4 R1 o0 a* R9 B- \6 I) p; {+ k' f+ @+ y0 G% B' w
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
: T1 v2 P! r1 ~" }8 B: l6 P9 }3 P. O# U while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );0 ]4 ^: B9 C9 c! t, G
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
& m4 O* k. G" g2 U4 J( k while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
; @" q$ K% z7 P+ \ d; I7 h, e9 E. Z: @: ^8 O6 K
CSR = 0x0000;
1 M6 ?% B: i7 K- y. O3 }# t INTC_INTMUX1 = 0x3d;% Y* J) t) e0 }( [) m/ \
ISTP = (unsigned int)vectors;
" F7 C8 {. F* O: u ICR = 0xFFF0; 9 T" R4 F2 G" j$ e7 L* d% S" ]: I
IER |= 0x12;
2 c$ c/ y, G5 H! v, m. N CSR |= 0x01;
! Y. ^# N. ?# _" k. d7 L. L5 l7 k$ a* }' I/ r; B
- e# g# G* ] Z" M% B/ u( Y8 b& W) H
" z5 n& S6 Z) X* q4 X" H' _
还有就是两个输入输出函数:
2 _1 a$ g9 n) @3 l0 p4 Cvoid output_sample(Int32 out_data)
! ` {9 a4 P# l, m{
3 Q$ Q; G8 Y3 W, Q+ @+ [ AIC31_data.uint = out_data; 4 R! _. r/ |! l
MCASP1_XBUF5_32BIT = AIC31_data.uint;
% ]: H$ T- W) e. c3 H/ U0 }}
+ u; r6 D9 x( D4 n! _9 ` |5 B/ ~ ` j3 y" @6 G; C
Int32 input_sample(void)
+ z9 t7 g/ O1 O0 z, }' E _{ " W1 x# G. ^3 c0 k
AIC31_data.uint = MCASP1_RBUF0_32BIT;
/ O! D5 s, O6 X2 Z4 X4 j' m return (AIC31_data.uint);
& @! j4 k7 [; Y4 h8 j2 S- u ?$ _}
- |5 Z2 B0 m3 ?! {% |) F6 X& W
# R4 P$ v: J7 U; t8 g* k |
|