|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:* ]/ I% m0 S' `/ I
main文件:2 K! e2 O3 B& |
interrupt void interrupt4(void) ) X$ x1 R$ K- U; D" t
{8 G+ s$ s4 R! _$ }
Uint32 sample;
# B2 w" o5 U2 c' r, e& b" \7 R Z7 f. Z8 A
sample = input_sample(); // read L + R samples from ADC# d8 Y3 c5 E6 ?6 ?/ Y: G% ?- k& ^
output_sample(sample); // write L + R samples to DAC
0 K' v: i5 ^" q1 r; d return;7 m) I$ [5 |$ z! } a
}
0 R6 o8 |5 k2 W! O9 G7 @1 p2 L& \. M: ?, m+ B
int main( void )
# a J/ J! S1 k& V/ o4 W/ q{0 A% ?: u0 U' e- y9 K( j& ?
& o1 n+ i6 Y& z' V" m, ? /* Initialize BSL */$ {- R3 C5 ~. U0 C' D
EVMC6747_init( );
! C" C2 D0 `: P! x h( [ /* Call evmc6747_intr function */
% n3 x# l2 s) f6 T) d* k, j$ M J7 U aic3106_init( );4 ^7 D- U, `+ p5 L7 J) {- Q1 F! u
while(1);* z( }$ p; Q( U$ h
}
" M: J6 V# {* a7 U$ L8 b, a9 Z5 g$ z
% B. r" r( }5 W9 E& g
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
$ ]" u8 f8 B T8 M6 f/* Initialize MCASP1 */
# J% ]& ?. [* z8 D+ X mcasp = &MCASP_MODULE_1;+ x9 H7 F% R( M9 c8 U! p& p' W! _5 }
mcasp->regs->GBLCTL = 0; // Reset, K2 B" T9 `( U) ?5 J
mcasp->regs->RGBLCTL = 0; // Reset RX1 L. ?, v/ S' ^: j' H
mcasp->regs->XGBLCTL = 0; // Reset TX
9 c* g6 y' B! @. ] mcasp->regs->PWRDEMU = 1; // Free-running
5 g/ Q" b7 _$ w2 H m# |2 x( v) ? // configure McASP0 receive registers
& B T6 m: C( [* r* c( u- D4 G mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used2 r2 R* k9 h S/ p8 _
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
D. ^1 F* \# l, V6 u- v6 {- [* l( C mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word& H: w/ D5 @6 W# |7 ^1 V
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
- X) K0 Q) {3 x, @1 `- _" q' I mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)0 [6 H- g' f$ E6 d2 K, }
mcasp->regs->RTDM = 0x00000003; // Slots 0,1. p; Y# k6 x* c3 }) A ]/ y
mcasp->regs->RINTCTL = 0x00000000; // Not used
) H% a3 [- V% E, b7 d$ f mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2561 @. `- a5 O/ W: {* m4 b
: s/ X: w3 s& x2 G) I) g" E% | mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
# h, A9 _3 h1 I; x. w. | mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus8 m9 n! ~! i3 Z* K
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
2 m4 E& O" x/ r2 { mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
& C4 Y) f8 t- v* k, x/ H3 Y/ H3 s mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
& H3 |. a: ]4 u1 X7 x mcasp->regs->XTDM = 0x00000003; // Slots 0,17 Z; i# K9 o2 ^) F4 @
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit/ t; C) k# R* F0 g; O! a5 {. Z) S/ T
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256$ c+ S1 N- C o5 j
9 H' k. D! f" }
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN% ?# k; E! z R
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT, g9 M$ a0 ]' E# ?6 Q- L, j# X
mcasp->regs->PFUNC = 0; // All MCASPs
) }$ q7 \' M3 r2 J4 R, U+ q, {& a mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX13 K" L4 ~& C3 Z1 [
5 W3 U1 W# @0 [+ y; z4 u* ` mcasp->regs->DITCTL = 0x00000000; // Not used
1 e7 ?, N: \5 [' E' \4 e6 [3 a& f mcasp->regs->DLBCTL = 0x00000000; // Not used `& E% ^: W. m/ S7 Z, M+ H
mcasp->regs->AMUTE = 0x00000000; // Not used- Y& L2 F, O. R* m O
' j3 ~+ R0 W1 M# ]: g- B9 C/* Starting sections of the McASP*/ T$ K, p' W9 Q$ ]( h
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
6 Q" u$ _1 E" e: K7 q, _4 R while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); . Z6 L2 x% V V& n
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ( a8 J Z$ R5 i& A+ A- c8 N
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
1 y- z0 a5 r: z H+ S) H
! Y9 K: s. P9 A1 k9 R1 V& {$ G) q" d( j mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ) g: R- Q$ l8 A* M+ n0 o- \! D
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );% k) I7 k# S& u
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
& ~% O; ?& _$ v% A9 \% q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );& i# [9 e; }2 E4 D# e9 }! W5 `
& m. r% h9 {5 F" @4 s# K" B mcasp->regs->XSTAT = 0x0000ffff;
$ v' ~4 h8 N- | mcasp->regs->RSTAT = 0x0000ffff;
7 m" X" z* l. U6 O' q, \
& B- k/ Y( S& U; `" G: ?3 e8 Q* { mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
" n* y0 {% @& ]5 D. M7 | while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );" A% Z. \# D: J8 d! e( ^
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
: W% W. J/ T6 x- O7 c while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
! u5 G* K m S$ ]+ Y+ q" q
# ]; }+ s$ |* N- l& @5 x) S /* Write a 0, so that no underrun occurs after releasing the state machine */
+ X \& G/ g% a5 y7 s( h& \( H mcasp->regs->XBUF5 = 0;
; e* X1 i; U0 a( d* U mcasp->regs->RBUF0 = 0;
! d" v, D9 S( ?3 o$ J( x5 B* ]! }
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; # w. {! c( Y5 R, q9 I6 B) ~
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );" q0 ^# C6 J9 B
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
7 y* i/ t2 Y! I5 u while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
2 w' S6 w8 q; z* B" K( @8 a4 h' O2 q' |) L+ j) `& z
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
. o3 v% S2 {1 W4 h6 F$ k while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );' S4 B$ P9 q+ z- y5 y( k4 F
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ! C& ]7 k$ B) O: V9 V4 O1 J
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
" [( k, ^5 r! s3 c; f0 p0 _: K1 H) p+ \, X; b9 o7 i, b
CSR = 0x0000;
3 O) z' n: f2 x3 W6 G/ G* g INTC_INTMUX1 = 0x3d;
9 I% F& q) O, v8 A& J6 e ISTP = (unsigned int)vectors;) H2 c$ J7 P9 J+ B& T8 q+ J8 H
ICR = 0xFFF0;
4 T( y+ M1 t' N5 ]; T# u IER |= 0x12; ) k6 X+ i6 [0 v, _
CSR |= 0x01; : a/ K0 l, I& P- Q( [0 a* |
( e+ ~& A) K" u6 g1 c/ E- N5 {/ {7 y& D2 ~2 E4 _" g8 H7 T, v7 K+ ]2 h
, y0 \3 M8 ?; I, Z还有就是两个输入输出函数:
# m3 x5 Z; m3 jvoid output_sample(Int32 out_data)
7 V4 l& E3 c* c8 c3 }{/ X; Q6 m2 P% b$ z3 Z) I; f) B
AIC31_data.uint = out_data;
. y& Q4 \) p1 m* G5 t: M3 q3 W MCASP1_XBUF5_32BIT = AIC31_data.uint;" E, m1 k4 ^9 L: ?+ w3 n
}" ^1 D- }2 o: [0 f0 a& ]
# o, z: v( \9 g! S! O% t. [" ?4 X
Int32 input_sample(void)
. A- l, n ?' H3 N+ q- [* N{
0 l* K1 s) z, N0 X4 y9 N, y AIC31_data.uint = MCASP1_RBUF0_32BIT;" ` l3 E; J: j
return (AIC31_data.uint);8 U" P% W/ }: f" d
}2 G' c0 g' h- l1 Q# f, i4 b
* q/ M1 ~; e2 {2 W7 s4 {
|
|