|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:6 x6 F% O2 j( T$ V/ u+ k
main文件:7 |9 H6 i" Z. o7 v) l" E. d4 ^
interrupt void interrupt4(void) 6 `3 ?1 H# _* ?; @# E5 D+ g
{
9 I: @2 C4 ]6 L$ W% x* J' W, Y Uint32 sample;
) v* C7 A- t) K9 Z. \% g* t6 i# k2 }/ v, z8 M# u- j
sample = input_sample(); // read L + R samples from ADC; e2 F1 B3 R, I# L0 Q( Z$ o/ z
output_sample(sample); // write L + R samples to DAC 2 \7 h) ~0 D& r" W
return;: G5 v( J- u" u. s8 W1 X) S
}% A. _+ t% j& F7 |# {+ B T
4 x: d2 j* p) Q8 \$ T1 Oint main( void )
# N' E0 Y: N& H. q$ ~{" _( Y7 f7 Q# {( O1 z3 }( a
* w5 [. p a j, Y4 n0 l. u
/* Initialize BSL *// ?" W# B, |; |& t8 \
EVMC6747_init( );- w* y" P5 Q* ^' [+ u
/* Call evmc6747_intr function */
/ ?% d3 Q) G) N+ r/ ?8 K- j' \ aic3106_init( );3 q5 j" b; K0 f! L: v
while(1);
; h& b* Y z/ m _& z}- D( M, p+ O* Q: H/ u: \
0 T" Z* ~' {* r4 I9 h \. C; M7 ]6 q2 y% L3 I: ~# |
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题. H j, g: Y1 a
/* Initialize MCASP1 */
" ~" y8 ^+ m' ]3 q mcasp = &MCASP_MODULE_1;
* Q# q8 p6 z- c) W$ Y5 C mcasp->regs->GBLCTL = 0; // Reset
, y& P; K4 G5 L+ R mcasp->regs->RGBLCTL = 0; // Reset RX
( Z5 H. G& b+ w5 x9 H$ ` mcasp->regs->XGBLCTL = 0; // Reset TX* N# D9 {1 u8 g8 L' P
mcasp->regs->PWRDEMU = 1; // Free-running
9 u# w8 ^5 S5 u5 S7 H // configure McASP0 receive registers
$ V) n9 L/ r4 J7 D, c mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
: r9 F; ]' H9 `" j: e/ R* {5 b E1 U mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 N; M3 c% E( N mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word9 C: B1 ~! F% k
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
3 b: D! D; D: t; b: T mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
* d+ J: e! r' U* t# O mcasp->regs->RTDM = 0x00000003; // Slots 0,1( f7 D% o7 L4 i2 C: M. x) o
mcasp->regs->RINTCTL = 0x00000000; // Not used
& A" H$ A) T" `9 i l$ Z mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2567 `/ Z/ K2 E6 a7 t$ ?/ |( G
' ?* U. n4 h& @ x% f) p+ i5 Y
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used! @. y' Q8 L; H' T6 A6 B g
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
9 b1 V. w9 M5 F* O mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
- H/ g0 [% P( N2 z$ L1 v mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
- S- A5 ]4 i# b1 B mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
) z- c" I8 A& _( A+ Q; W4 x6 m+ q mcasp->regs->XTDM = 0x00000003; // Slots 0,1; |" L$ _- F0 {" f
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit' I+ j+ I/ C& i# U
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 I; F) d, u0 s: O. h$ u$ M
: X6 B0 K0 l T- `( a3 ^9 X mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN3 F) [/ x* ^& o5 `, v* T5 J
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
- s: f8 H8 u& W( c, b2 ^. V D( E mcasp->regs->PFUNC = 0; // All MCASPs! O; h' p% S l7 p( n. q- }. O
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX17 q7 K0 p6 C6 ^
, _: B, e7 P0 L) t mcasp->regs->DITCTL = 0x00000000; // Not used
9 N. @% M+ N! T0 ^8 O# K mcasp->regs->DLBCTL = 0x00000000; // Not used
) T; l( `2 u& J/ P/ d$ L mcasp->regs->AMUTE = 0x00000000; // Not used
1 t0 d/ O9 h7 U6 N6 d* J: r' Q6 W3 P" Z
/* Starting sections of the McASP*/
2 ~) l' [5 v; ^$ V4 M L mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ) q# B+ S( u ?9 Y1 X
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
& D$ q8 T# s( ^+ G mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
4 f% ~% N: Z5 L! U7 v while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );+ N% J9 Z3 \# ]0 P5 ~' y% i
% Z6 J* u" T8 q# e' D mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; $ b; Y3 R5 O2 J: x. E/ m
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );0 `& |8 W% B$ b' H8 r- I/ [, f+ n
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
V7 G& j; K1 o0 R% F" R" g4 H while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
( k' x! ~1 p. M3 D2 J( k' n
# D% t& O6 K( _ mcasp->regs->XSTAT = 0x0000ffff; 9 a+ |' |8 b) Y1 G
mcasp->regs->RSTAT = 0x0000ffff; + [9 d( Y4 v/ P. ^# P
0 I# U9 ~( V5 X9 { mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
# P' |$ E" a5 m* |1 Q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
! f- r3 p4 Y k( u$ l' l mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
4 n; y, @+ m& }- r6 x while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
9 O5 C! M! J. ]7 W2 J7 O# {( M+ c0 E
/* Write a 0, so that no underrun occurs after releasing the state machine */; Q0 |# d- ^9 f
mcasp->regs->XBUF5 = 0;
5 P8 B7 Z k. R mcasp->regs->RBUF0 = 0;' _' q5 g" f* B2 [$ Z( }
( y( c% U* o" F( S9 G
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; - W3 `1 l6 V* u8 M( n Z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
# F0 C' d7 D5 u Y5 H5 \1 z/ l mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
V. d2 v# ? W r* R0 g0 s while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );" ?+ y0 _. |; Z
3 Z" g# T6 _- Z9 c% }4 s! G' P
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ; r$ g- V* i+ l( w6 a
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
* R$ A: A7 U* H5 x mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; $ _; p* O; d+ q- E
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
. d9 a; ]! y9 X% {, c
, B) {5 P! w% ]' l: P! v' i0 T CSR = 0x0000;
5 M! f& @& {7 N, i+ p: ~2 | INTC_INTMUX1 = 0x3d;' U2 v9 }$ T% H& c/ Y" h1 h
ISTP = (unsigned int)vectors;
! B% q8 s: h, r2 J: I% \1 ^ ICR = 0xFFF0;
2 z: R( S0 O( {5 _* k0 D IER |= 0x12; $ b! B4 N% s4 ^1 q( Q
CSR |= 0x01;
C% [+ i/ C. _
. a) J' U' g6 m; m
3 |! j1 q: F+ ?: X) o. L/ k; p+ t/ w8 ?' K
还有就是两个输入输出函数:
8 j# F! U. U! w1 tvoid output_sample(Int32 out_data)& y _0 ~% Z! s4 D! k9 k3 P; S0 J8 t0 s
{6 k3 M- U6 _6 V/ p8 Q3 N. l8 Q: \3 b
AIC31_data.uint = out_data;
$ v0 b& w1 \3 y+ \, V6 @ MCASP1_XBUF5_32BIT = AIC31_data.uint;+ P. `# T) n# {6 u; E
}
5 d9 p$ `% u+ a$ Y6 a, z2 X8 K$ |: {/ l5 W& M3 {$ J2 F
Int32 input_sample(void)
* V# a% V3 Y2 [/ @% [{ 8 H4 B5 r* {' Q. u- @4 L9 \
AIC31_data.uint = MCASP1_RBUF0_32BIT;
! K5 i# r- @" L% Q! {% f return (AIC31_data.uint);
( E C' J J7 Q8 ^/ W' b}
& F# B' j s. q
# G! E3 f+ T7 r |
|