|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:/ q5 C$ L6 s5 c
main文件:
" M+ f+ l/ w" }0 [7 M4 l& C* a8 ninterrupt void interrupt4(void)
C' i) ~; U/ I* N/ Y8 c: Y{
. u$ S, ^/ m2 [3 @" S) X- W$ ~ Uint32 sample;
5 Z: \: R( @. X+ p9 w& d) W' I0 U+ I7 `& h/ J+ E4 c
sample = input_sample(); // read L + R samples from ADC
* @ W! j( e( ]* v2 L [& K. J output_sample(sample); // write L + R samples to DAC ( N. g4 ^1 q% B
return;# p" J5 U3 ? x' U# n; H: x5 X
}
$ l2 I3 B5 o: L1 V. p7 v7 C0 x h B, h' d
int main( void ), I& f( _! J g. D, E! R( m
{
* m8 G6 e6 [ G& n5 b5 m
+ L+ l, b$ J( f /* Initialize BSL */
% s8 m8 v, ?6 |" A3 o EVMC6747_init( );$ \% l4 a. d+ {
/* Call evmc6747_intr function */
9 {4 b) B9 W- v- P/ K aic3106_init( );
" A1 S9 r/ V# D: e/ D3 Y' {4 u while(1);& B$ T; k" D& m& }
}
1 O! e8 U) b2 h l- n& u
2 @) D8 m- p5 R0 |2 I# S, t1 p0 o$ U& r+ D
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
9 {& y v. k9 Y( l8 N/* Initialize MCASP1 */
5 p( }- S# z" ]$ {; X+ P# z mcasp = &MCASP_MODULE_1;
4 D" ]% Y) ^ b2 V% W$ ~: | mcasp->regs->GBLCTL = 0; // Reset
! ^0 [8 I' D' {) A! \ \3 E1 A3 l$ a mcasp->regs->RGBLCTL = 0; // Reset RX
* S, ^6 a7 A) `( f) B mcasp->regs->XGBLCTL = 0; // Reset TX8 Z: H1 o4 b6 n1 r. D
mcasp->regs->PWRDEMU = 1; // Free-running7 A2 r$ h4 ~: h% T
// configure McASP0 receive registers+ m; Q" K$ d8 R% v; J4 h
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used) K+ [" i2 b. v; K! x
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus8 a0 p5 j U1 B7 Z7 f- I) _
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word, i8 b- W& r" s3 b
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)$ X5 {6 w+ h8 y4 N8 h
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)/ q& R& x0 L0 h9 D& \, L
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
: G, w- ^% f0 G4 }3 _ mcasp->regs->RINTCTL = 0x00000000; // Not used
' E: S I' `' ]- G- A/ ~+ D! F mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# |0 j/ z) t- \+ w7 \; J! y7 W* I& x% u6 ~1 X
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used$ B6 M3 O' k& d' [4 o6 R0 u
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
) r/ ^( w: G* A7 f) r1 E mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word" v" C1 {, l Q0 G
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
_( c- q( |9 Q5 h mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK# F( K4 Y0 X# ~- L0 S( @% G; B6 G
mcasp->regs->XTDM = 0x00000003; // Slots 0,1& S2 P2 E% }. z$ [7 _; u$ ~
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit9 W) v) K" q: u1 d
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2566 r$ e$ @% ^) P1 \ n* }
& h S1 g+ G h/ r mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
3 d7 G) j3 u) x, L4 L mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
2 w- k+ W; Z" O9 z. g& K mcasp->regs->PFUNC = 0; // All MCASPs v% v0 ~1 J6 p; D0 t# t
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1! ^. x' c+ b5 K( }& ^: c
& P7 O4 Y$ { n mcasp->regs->DITCTL = 0x00000000; // Not used
8 ?: `/ x( s9 O mcasp->regs->DLBCTL = 0x00000000; // Not used
& X3 @" e, N: Y, A" S, h mcasp->regs->AMUTE = 0x00000000; // Not used: I* p) D) ^) m5 O! ?8 U+ s" ^6 d
+ m- o# r& v9 [) X9 v9 \3 H* {/* Starting sections of the McASP*/
) N2 Z) }. V3 e ~: U mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; / ~; ]" G4 F4 j: v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
+ x* w& g) j" x8 x6 A mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; % g1 y1 R( B# n, ~; v
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );1 U6 a! C. x- G$ o1 i# w. m/ i7 [
7 Q& ?5 ?' o8 B mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
/ B- X4 A' J+ \& y) m$ T: n, B- Y while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
8 _+ Y* p, Y/ Y3 {: G A, e mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
0 K# C' q6 g% o$ e/ ^/ s while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );9 T; M3 @8 |/ V& g1 i) B
+ J; [# ~/ e E6 U; n1 M# A mcasp->regs->XSTAT = 0x0000ffff; ; l, U" H8 c3 u/ s/ a c
mcasp->regs->RSTAT = 0x0000ffff; $ w# ^) r9 x$ m
9 M8 |( q$ A3 d6 | mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
M2 ~# h( r# Z+ z2 D7 \ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );+ I+ l. T7 J) J z
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 8 g" q6 q4 p8 h. i
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );* a8 G/ r1 Z9 G% U! r( i
' s9 Q) s' L. k1 t /* Write a 0, so that no underrun occurs after releasing the state machine */5 ]: x" |4 n: J
mcasp->regs->XBUF5 = 0;! |4 F' W8 z) n# V( `
mcasp->regs->RBUF0 = 0;, O( e g. h' M) M
4 u3 {) d+ U# d' K: A6 L mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; - L2 Q" H0 O" F! |* J* y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );+ ]; _( W: D$ c; `- G2 s: q" H$ z
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; $ ] g8 _" s, i7 x" L3 i% O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );0 S6 y+ G, {6 g, O- t3 `
+ D; I2 E) x# J% B* ]! d9 T2 f# h
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
6 i3 l/ O# f: M) L while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
8 t) j- L2 J* q9 N$ l1 q$ p mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
) W% k/ p# e9 N+ T V/ _ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
! B2 k# j: `1 v) p" z/ z( q5 O' a+ @
+ y" B% k0 t4 N7 P1 f0 O CSR = 0x0000;8 r( C/ O3 d }5 ?+ _
INTC_INTMUX1 = 0x3d;: U0 h5 Y J! R3 J
ISTP = (unsigned int)vectors; I3 K, C: M# k8 F! @2 b
ICR = 0xFFF0; 7 ^. Y1 s W" s3 r) Q2 e
IER |= 0x12;
( d8 F: T( F s G4 P% L CSR |= 0x01;
7 o0 `0 B/ i0 G4 `/ y$ ]. S0 s- P' }* G E2 L! z( G8 t5 R! [
$ o& W4 R+ Y% }# C9 W
8 r7 s( a. }3 N+ w. @1 a
还有就是两个输入输出函数:: r- X% L2 w8 A, S ~) Y- R" k5 P
void output_sample(Int32 out_data)
+ u: K+ A9 w- _, K- Y b{
7 K* }4 a+ |: S* ?& g AIC31_data.uint = out_data;
& M5 Y5 u' D. p MCASP1_XBUF5_32BIT = AIC31_data.uint;
2 E/ l2 g& m a$ P h, j' I; D}* }6 a9 m& U3 v# F7 m7 S
7 N8 a; q4 e+ {" E [- }2 XInt32 input_sample(void)! ~# j9 V D! [8 m" B
{ 1 s8 ?. I e# V" J* y T9 B/ a( d
AIC31_data.uint = MCASP1_RBUF0_32BIT;. ^3 Y& F# P$ o# x) O
return (AIC31_data.uint);: l' y# e0 J- x0 d: [# P' ?
}, O6 P" D" S! r+ j
( @ l; L# ]8 u. w |
|