|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:1 x/ J/ i: T( H' Q5 r3 r! G
main文件:) [7 @) ?8 v' q6 p3 ^
interrupt void interrupt4(void)
' M, l9 `- P( [, h* ~ l& \{1 `9 o5 l. l4 j E% g3 H
Uint32 sample;
6 ]5 \8 x5 x6 O% r7 c0 E3 B8 L2 w8 Q
sample = input_sample(); // read L + R samples from ADC
( D% W& V, G, q* P) O2 u# K9 P output_sample(sample); // write L + R samples to DAC 8 x" ?0 t9 E* O' N v
return;2 x4 n7 r9 d2 r5 L5 k9 f
}
, B8 |* T1 l% \8 `. U) E, {' l" M
) A" O, A# W+ ?+ e3 j# a5 iint main( void )/ k+ q6 k+ Y6 J+ Q) I
{
1 S& k! _% k, [) Z9 K: A
( `- x: U8 U# z9 l2 e /* Initialize BSL */
" d7 L$ ?% j* ^- o; B EVMC6747_init( );
' b6 d3 x9 f7 u! j) D+ k* o+ {1 s /* Call evmc6747_intr function */
8 J- d: }4 M- q6 |+ K aic3106_init( );
, j1 j r7 _& E4 f while(1);7 o8 T) F/ |! u7 |7 ?; ?
}; ]" ~$ l* Q! Y0 b' a
: ^0 w* c* u- k D& z1 |8 P* c+ X9 p# R/ ^, z/ `9 y
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题3 Z& z) Q Z0 ?
/* Initialize MCASP1 */4 ?$ X0 j6 a' d% v0 C. @4 P
mcasp = &MCASP_MODULE_1;
; ?- J+ z7 R3 q% c% N mcasp->regs->GBLCTL = 0; // Reset2 l8 r2 _1 N+ r. `
mcasp->regs->RGBLCTL = 0; // Reset RX
& |4 [% g% x! c3 q5 a3 V/ l mcasp->regs->XGBLCTL = 0; // Reset TX
7 }$ c/ K0 V- g mcasp->regs->PWRDEMU = 1; // Free-running
6 K8 G$ a9 G0 U0 Z/ n) s // configure McASP0 receive registers' q' J4 K0 N- v- `# I A
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
0 y, U# A0 a- Z. S mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus1 r9 @! l/ m& ]) u* s. S- C. ]8 r
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
" i( j2 _+ _, {) L1 e; v mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
( ~7 A% ?( g8 T mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)3 B |- H* E: _! {8 J7 [
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
( B1 b) b! s: l% E- q b mcasp->regs->RINTCTL = 0x00000000; // Not used
9 r5 |% B% Z# |1 } mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
' D9 U$ i9 a: T
0 H6 A8 `- Z" V" w2 \ mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
" x) a4 }7 I; s mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
& v a$ G, D* ^2 d* u1 h, L mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word9 g/ W3 Y$ _" l
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
) I: o b6 {( ~ G mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
" P+ N2 L' T( E$ ]/ |5 L+ h; b, S mcasp->regs->XTDM = 0x00000003; // Slots 0,1
2 Z1 L! B6 }, [ o mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit* o3 I7 i+ b! K) C) P, B) ]6 b" N
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* _. d. [. N2 j6 j0 u% b! G g) S) L3 T0 C8 i" T; l6 ~# z* U
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN7 b4 B; U5 I% J- F
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT$ c/ @/ [9 l' q
mcasp->regs->PFUNC = 0; // All MCASPs
5 L0 v( S( Y5 C$ r' Y) O2 l mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
9 ~ Q8 g. i3 W5 ~* ?$ x
6 [' ?! M+ H. k7 a! Z mcasp->regs->DITCTL = 0x00000000; // Not used" C! R; o; }2 o! r! b7 p
mcasp->regs->DLBCTL = 0x00000000; // Not used) @3 K5 b- _. P6 Q
mcasp->regs->AMUTE = 0x00000000; // Not used
2 j+ L, ?9 E$ s J" X7 P8 p, I1 R# V3 K" G
/* Starting sections of the McASP*/: \% R4 G j( {+ Y8 ~3 G9 g7 A: C, f0 C
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; $ b& u* \3 \+ l
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
: ~0 K+ u; o. K mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
- G/ ]# B# V( Q6 s: | while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );& _* g" e5 X: Y6 O5 @3 H' Y% X
% E& Y8 J2 R( G1 o0 L8 G$ K mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
@! [. Z% K1 m6 _8 b& ~& e+ ? while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
* X) D. f$ F9 T- D* o mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 8 {2 V1 O8 e2 c+ O1 L
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );* }4 v5 k$ y' l! P* @
( `$ Y% R" H8 R% I; I5 j mcasp->regs->XSTAT = 0x0000ffff;
' h2 B/ w; ~4 }; P/ \2 H mcasp->regs->RSTAT = 0x0000ffff;
) e, X; C) I: i+ H0 ^0 \7 a
" E/ c, |% l( G( j; S mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;. D! J( s1 j. |# C. T% u# }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
1 Y, y+ J; q9 K mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 0 ~8 h4 ^' @3 w3 Y' L
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );" g& l( g; Y$ e8 C: e) Q4 b9 b6 `+ Q
m; K b6 e; L$ X* ~+ i+ T8 f. e
/* Write a 0, so that no underrun occurs after releasing the state machine */
8 s5 [; q; C! a mcasp->regs->XBUF5 = 0; k! G5 c/ b) P' s% T
mcasp->regs->RBUF0 = 0;
+ j( n& r, m! `4 z* b- ]! u. [6 Q7 q% u( o6 }0 ~. M
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 0 Z+ y8 B" [9 m8 i' q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );! W3 Y4 c" e) F* [
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
4 S7 a, n! L+ z: Z6 D while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
4 ]. j8 T: n9 A! `5 r' U# U; [
$ D2 F' b5 b/ Z2 @ mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 6 q& j M% {6 ?4 d' b
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
/ b+ U; ^# ~! d( c& J/ o- K mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
- Y Z! A3 `' L2 { while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );9 z8 j1 O4 }5 j/ J+ P' p2 Z
9 N% f, ~0 B& q q
CSR = 0x0000;' t: q. j/ T9 T* z# G5 F" l
INTC_INTMUX1 = 0x3d;
M) ` b! f, z" b( p' p ISTP = (unsigned int)vectors;
9 Q- l% i6 G7 l4 r j! Z: q ICR = 0xFFF0; , @* g9 e# O7 d) h T7 A9 j
IER |= 0x12; , \# P8 T$ D% E% w" a# J# C
CSR |= 0x01;
@; M. _$ s1 l2 X/ p5 ?0 ?2 R
* y$ v$ B& i+ @! G/ f j" ]! o u: `
. A$ c. i5 _: ^! y/ c5 d1 N$ V还有就是两个输入输出函数:- k7 Z4 B' }& X0 `
void output_sample(Int32 out_data)
% F$ \, Y0 A& }0 Y' {; e. {8 T2 ]{
" r2 A/ w: p0 r& ]! P AIC31_data.uint = out_data; 9 I2 H- q i. @) b- B
MCASP1_XBUF5_32BIT = AIC31_data.uint;
% ^8 W7 [0 F. |& D6 }* C}
& W9 H) ^8 W3 ^3 \3 `- y# D7 }' C. Y* U
Int32 input_sample(void)9 |; h5 f( j" V
{
( b9 ?5 B, N/ J9 J/ ^) o AIC31_data.uint = MCASP1_RBUF0_32BIT;
1 V9 c+ l' k. l/ l- T2 n; K) E' P return (AIC31_data.uint);
2 e/ Z. X. Y" M$ A s& S2 F6 T$ ?0 e} S0 X% x2 B# I8 i) j6 m; |
8 f1 Q$ N( F6 i' i) R |
|