|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:" Z$ _2 N# O. z9 ^' Y, g# M
main文件:6 w0 I( v# V7 I& n8 F( X y: R
interrupt void interrupt4(void)
; w9 s( C; B! p+ a8 g{7 A' c- k+ K7 f! `
Uint32 sample;4 b2 x7 P1 a/ \) H, U( a: i9 K+ A- o. h
) h) ^' C+ _( A) P+ t
sample = input_sample(); // read L + R samples from ADC% s8 f7 j( M3 g) w
output_sample(sample); // write L + R samples to DAC + [1 A! A% S4 L
return;
- M2 T2 Z$ {4 j}+ b, t& l+ U- w3 H
* [. n/ M7 u, O' V7 X' a3 W6 Lint main( void )! N" L* W3 W% A0 ^; b
{5 l% G+ l0 k2 j: o
7 O4 e8 Q: z7 I8 x /* Initialize BSL */9 L# @3 D6 X+ a5 X0 o4 o# ~% d
EVMC6747_init( );
$ I( g4 d8 q1 l; o/ |! @2 q+ _ /* Call evmc6747_intr function */
/ D0 }$ z3 i5 `( b' L( \ t aic3106_init( );$ u; ?+ u9 ~% U
while(1);
* l# Z* @" L9 K* S% {}
V5 c ?; c1 c6 q5 y M' c5 G
8 t; i6 M1 B7 ?
) }4 D1 e. H) p9 o/ Y) Y$ n% Baic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题/ j# x' \3 I3 R4 n; ]# N& P( Z
/* Initialize MCASP1 */$ p2 d8 i" r! Y! S: P2 b
mcasp = &MCASP_MODULE_1;) M% i! P+ k5 X
mcasp->regs->GBLCTL = 0; // Reset
* k v. K- j* q% j mcasp->regs->RGBLCTL = 0; // Reset RX
$ ?9 t9 Z$ T, S1 P. r# X mcasp->regs->XGBLCTL = 0; // Reset TX
6 z1 n3 f$ H4 n8 W/ b mcasp->regs->PWRDEMU = 1; // Free-running
2 R5 _; G: B1 D) I; F // configure McASP0 receive registers
& C. h! K1 z1 \. q+ t1 b: Y mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
3 u& L, `$ Q& I. I: Y mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 Y6 ~( `' f' s0 @. I mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
2 Y9 X) H! a& p1 i1 E# Y* ? mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
x8 b+ s) {2 I mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
b8 \7 E: t' S0 ?& t mcasp->regs->RTDM = 0x00000003; // Slots 0,1
2 t9 d& U$ w4 e; }! b V mcasp->regs->RINTCTL = 0x00000000; // Not used
* G+ k& D+ u9 C' i9 [ mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
" B1 n( w' j& C3 i0 K# ^
" ~: i* ^9 o8 @- {8 m3 g mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used! p$ R/ V" ?" z6 m [ _; r* b6 \
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
- G+ y4 E% f6 E+ ^2 e" B mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word Q' h( G1 I/ d& ^" }( ^
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
% N) ~& ?% d1 a, `+ y6 }+ c mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
9 x. ?& m& H, t8 c6 F( Q* v$ s/ c mcasp->regs->XTDM = 0x00000003; // Slots 0,1( R2 L' h6 R+ u( ^: v
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
( {& X1 j7 L1 y# l3 {) M" G% J mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256; t8 t8 A# P% {% m& Q& A# j
' n- Q( Z5 a1 J- a7 O; X mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
' Y9 }: |7 H9 X! h4 P mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
% r# ~/ I' Z' E3 f mcasp->regs->PFUNC = 0; // All MCASPs
3 f" m" z5 Z3 n) a mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
0 e3 a0 g2 z4 O2 r$ d2 \; r' c! D! S
4 M6 B7 n Z6 O, z mcasp->regs->DITCTL = 0x00000000; // Not used: [3 F; Y4 O/ e1 _/ T/ [) A
mcasp->regs->DLBCTL = 0x00000000; // Not used
* v$ M( @2 ^ ~+ Z, L7 p mcasp->regs->AMUTE = 0x00000000; // Not used
9 I+ Z& `5 y" O$ a3 a& s
8 r# O+ H7 S! y- t* Q* ?/* Starting sections of the McASP*/
# H/ Y' |5 `$ z% R* K% `* l2 ? mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
0 ?+ ^$ ~& V. ]7 @0 N. X& {: w ^ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 9 r* H* I& u/ f x) t8 R4 Y
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
. M7 w# |( Q* u( m while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
5 ~( r/ V4 u" i6 Z# K3 R" V% }/ z6 \ L3 u1 X5 q2 m# M
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
6 _1 z. w7 h: C+ _ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
/ K' H# l$ M: T1 h- H1 U mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 3 A! q; I, _3 V8 f
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
& y# l' R7 b5 {
) q9 \ P/ p8 H/ t mcasp->regs->XSTAT = 0x0000ffff; - x; t2 W- H* l" r% X
mcasp->regs->RSTAT = 0x0000ffff;
# D7 x! _# @4 P# H" u' I; X; i J& y: x" ?5 _$ W
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
: [4 e" V% g# X2 s8 R3 u8 ] while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
1 D" F& o9 {& ?9 a$ g: v1 |: b* H mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
. Q7 S$ Y. a, i" t' i3 F" A/ n while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );! a7 ]* W3 B3 L3 S1 B u5 m
& B: G' A7 Z* R; C- Q! g /* Write a 0, so that no underrun occurs after releasing the state machine */
2 ~; q: Z7 [$ E$ Q$ y mcasp->regs->XBUF5 = 0;
" }. s3 X( X) ?# n mcasp->regs->RBUF0 = 0;
: S! j5 I) G' u% r# N( R6 H
) f9 ]& ?& G: f6 W/ u( ~/ M mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
4 L. _6 f+ H* `3 L# `- y i2 L# i while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );; T8 t) d+ W( E7 S
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ! y& t. |: d, ?6 k! A
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );: D3 a) [. M6 m6 }% X
6 }1 f$ O- F0 w/ Q4 [8 H& `! ^
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; % ]8 M8 j% h; \5 g8 d, N
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
- \" K7 j6 V4 ]6 X mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 4 A3 Y( _7 K2 g
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
6 l" `4 a! w% T$ u
4 I' A `6 L* [ CSR = 0x0000;5 a' s6 G) `) u& @& c
INTC_INTMUX1 = 0x3d;- G0 |& S( I2 e
ISTP = (unsigned int)vectors;! l) y' Z$ o+ M( t; S* u. r
ICR = 0xFFF0; / f5 u& }/ [; w. ]
IER |= 0x12;
5 k' H* a3 |$ S CSR |= 0x01; ! H- j5 v% H8 ?& T" K# T- Z I
+ M" i0 r; A9 N, `8 C/ Q& j% J. W- w# f
0 E. P1 M0 y* v, D! A! k w$ z
还有就是两个输入输出函数:+ I/ |( j4 R) W
void output_sample(Int32 out_data)' e6 E/ g! G4 A
{) a8 ]6 @0 {' w5 Y
AIC31_data.uint = out_data;
' C% ~6 Z/ n; b& m8 T5 }1 @ MCASP1_XBUF5_32BIT = AIC31_data.uint;# n# E- q3 }" W* u3 x2 I+ Z6 U( v1 `, w
}
- y: o: t4 m) p. q) Y4 N% c y" c2 t9 ]9 }
Int32 input_sample(void), J7 V! @& L0 |- `. t& R7 j
{ ) W4 s! T/ H7 [$ Q
AIC31_data.uint = MCASP1_RBUF0_32BIT;
+ y: a* ~5 n+ ?7 e5 G* M2 G return (AIC31_data.uint);
1 R) }" V n& X* D* r9 a# M* b}* n, x z* D V2 e
* \6 x. [) n( [, T |
|