|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:! A& p8 \8 e, n) t) n
main文件:8 v. z. V4 J, k4 _9 X
interrupt void interrupt4(void) 3 V i- n4 u$ ]. Q7 u& r; g
{
1 |8 q( I& y. C* R2 m% d3 l( W Uint32 sample;3 _) Q/ P4 }0 s- K% K( u
5 c5 G# Q" R. g- |3 i v
sample = input_sample(); // read L + R samples from ADC: ?- Q' a+ r @$ a+ c i
output_sample(sample); // write L + R samples to DAC " ?! {* M) o3 V2 ]3 M
return;
' `6 w3 I6 h1 f8 E. Q}
- @9 b* B8 Q: E( S7 I2 `, p# Z6 G0 P! B W: P- z% z
int main( void )
' j/ T8 Y) h: q3 y" u3 Z{2 v4 v; V9 |2 ^8 {8 W" }
: C- a; [; ^. ?7 n: t1 T /* Initialize BSL */- q' y: S0 L5 i/ p
EVMC6747_init( );
! a5 s: ?# Q% V: h% f /* Call evmc6747_intr function */6 l4 {# Y z# ^3 r
aic3106_init( );
1 S) h, }" |1 B8 u while(1);
' b/ d' t5 K# r: ]3 W; o} E" e# E' L# E% P$ y4 v
2 o( f% F( f8 m% s; p0 b6 k; ~% |
* l2 S* a2 P4 r4 u- A2 D
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
( E! _7 s7 P, }. U/* Initialize MCASP1 */, d5 M$ Q( p$ B$ X2 [' V
mcasp = &MCASP_MODULE_1;: g) |% F, x2 H( G
mcasp->regs->GBLCTL = 0; // Reset
# J! m% y, N- S& G8 d mcasp->regs->RGBLCTL = 0; // Reset RX
! n6 E7 i: L: d/ I$ m/ \ mcasp->regs->XGBLCTL = 0; // Reset TX- r+ k$ r9 y: D5 v
mcasp->regs->PWRDEMU = 1; // Free-running
( b, t+ q; |% W9 s y // configure McASP0 receive registers
, R" f, G" z7 u- p3 B1 C6 N. Y( p mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
$ {6 F# R, V, R0 [+ G9 \+ ~, W6 k mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus# A4 f2 ]1 y; ]1 U
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word! G" G4 I c8 y8 m: p0 s: `5 R9 S' \
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)- G o6 K4 C5 |9 ]
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)# W e! K$ s% c/ [; E% x
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
$ _* j+ q0 h, U6 P9 {' { mcasp->regs->RINTCTL = 0x00000000; // Not used
# U- U4 \6 T. H% @' @- D6 Y mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2561 s2 g# g, i1 B
$ K/ S5 S* g. r7 P4 u mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used, e( m; v! p7 W: l) k" l
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ L, A" |# w' ?! j7 }" |$ z2 q mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
2 J7 l" Y T: _% z mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
& J" U0 Q; U' d7 `" Y3 A mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK; [0 y' L$ c* R7 W
mcasp->regs->XTDM = 0x00000003; // Slots 0,1* Q% \. t$ d7 Z- _" w8 c
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit5 M) Q# _" `5 X
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256* H' g2 a! V) w9 T) W- j* B$ p
4 }# c: r8 `* w8 k# s; z mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN0 y9 l5 ]+ j' Y, b, m
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
. Y" n' l K T q% N mcasp->regs->PFUNC = 0; // All MCASPs! Q) p" X: Z/ w$ q. s: F0 k
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
0 }+ t: O @! |! }
+ a3 D A5 V8 ]# E& O mcasp->regs->DITCTL = 0x00000000; // Not used; |8 h5 w# n7 ]" Y
mcasp->regs->DLBCTL = 0x00000000; // Not used
: n( U/ y; ^3 a+ ~, i! \) Z mcasp->regs->AMUTE = 0x00000000; // Not used
5 T" z$ a) W$ K5 N6 N8 ?3 ^! e5 q; [* W. }/ Q1 L: Z6 P B
/* Starting sections of the McASP*/
. h/ Q# x% w* x mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; : G5 `# K5 N2 h9 ]
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 6 f& v4 Q. H% a Q
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
{0 W1 d5 f1 ]+ k( L- | while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );/ h. C4 ~% _ R. E' q* O% ]/ e
j f" E ~/ H0 v( }
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
8 z Z6 X* a1 \1 r" E while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
0 P$ N ], R0 } k# {% B5 C$ y" B1 H mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
D a4 {- ~; C! W while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
/ x/ ]0 j! H' [; e8 [+ u
& G6 s0 ~( h: X8 n6 \$ h7 ] O mcasp->regs->XSTAT = 0x0000ffff;
7 Y7 I% \+ \* T6 L; B9 v* \3 K mcasp->regs->RSTAT = 0x0000ffff;
" T, @' d, \0 Q* r* o0 G* z- i
1 j' K1 t& b; A mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;% e0 Q7 X/ ]: \2 N" m
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );& y- i9 v0 L5 O8 P: V
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; $ Q! U, x0 R3 k
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
- _9 u) b8 ]- J" _- q, Y: `3 X# k
/* Write a 0, so that no underrun occurs after releasing the state machine */: R7 o2 s( q% Y. ~) P) {
mcasp->regs->XBUF5 = 0;! t% f, P" X) R* `& ^
mcasp->regs->RBUF0 = 0;
1 [9 R7 c1 n7 ~! ~& E2 A
2 m1 v0 D# x1 u/ s0 Q mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
( }' D# V! k: \ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
4 t5 ^: Y8 j- _4 N mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ]! h, O' C: e3 K3 ?/ `" z0 H: [% P
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );3 n9 e0 c& t: b& k# Z* l
' O) b. Z# q) x7 g8 U6 c mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 6 d. Q- b: |, W: Q8 H! E
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );6 w7 @+ I6 L4 X2 X, `! k" j' d
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
3 f- Z v" M8 e# b0 F Q# E while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );7 h) C& k5 ?0 n5 H* w. t
) o( i& ]( N+ E/ Q3 `5 [
CSR = 0x0000;
8 O- D3 b% H" k7 d- X INTC_INTMUX1 = 0x3d;
O7 r3 [5 M9 y& t4 x, z, C/ W9 q0 g ISTP = (unsigned int)vectors;' G# u( d8 |! y$ _: g: Y
ICR = 0xFFF0; + L/ `9 Z4 [7 s1 }; F
IER |= 0x12;
2 F: X5 E, Q: P2 v/ r' O CSR |= 0x01;
: T8 X6 C2 n, m" h# }9 a
- I3 G- T, X6 E9 Y# M
+ `; q+ O7 S l9 c% W7 a7 X& O
) g( b1 ^- B& [! k: U+ k6 x5 L还有就是两个输入输出函数:
- {) y. g' ^3 `/ P1 M; w: tvoid output_sample(Int32 out_data)
$ K6 Y: H* @2 y{2 _5 Y! Q% D* X7 S% ]
AIC31_data.uint = out_data; 3 e; t; E* |' X( y( X( b4 h
MCASP1_XBUF5_32BIT = AIC31_data.uint;. Q, l4 |: ~# p# s0 u: R9 c( ]! R
}
* k7 a- c4 p. ?4 `5 B" }% N j5 k6 P$ v3 m' {
Int32 input_sample(void)
! o- ~* z* f, p. _9 T* B{ 7 L6 p' m; @* G( h& W R
AIC31_data.uint = MCASP1_RBUF0_32BIT;# U! X6 ^ a# B- v+ O
return (AIC31_data.uint);
- }9 r y- X" t( n( X2 j0 |- a}1 [& Z4 e) O8 Q' I* J" G! y
7 _. g* J/ {% U" I: \4 b# ~ |
|