|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
& v$ {7 \- p" F. s- J* X0 gmain文件:
9 p( i; Q# p: l: C0 q) Pinterrupt void interrupt4(void) ! Z n& }" e% e+ c
{/ V# C% L) ~6 H, E" N: \1 H
Uint32 sample;
1 V2 K0 k- D' F2 W7 u" t' A @/ s# s% V, f( X7 I
sample = input_sample(); // read L + R samples from ADC0 \2 j) ?$ ^. _$ N' F
output_sample(sample); // write L + R samples to DAC 7 c R% o% s2 ]- d
return;9 k" a. T r0 C; ~5 F
}
& ^: ~& d/ V u
, F7 h+ u* U! B( l( Qint main( void )
$ M- q3 b/ y; ^{
! B2 u2 Z# Y3 a( f/ T! y7 M, J- I$ m. ^! p5 R4 n
/* Initialize BSL */
2 [. K& f, A4 G7 o% ^ EVMC6747_init( );
1 p, h. o. W8 l, C; l /* Call evmc6747_intr function */
/ d' ~+ B+ O/ ]; \, q aic3106_init( );
( J0 G* P [& P6 j. s8 L* G3 f* t while(1);% r0 r( ^9 ~8 \' c6 [+ B8 U1 A1 V
}: \. n& z$ L8 B/ K8 ^1 Q4 D
0 l5 o" d1 A: S) n4 U
5 @" \ q/ D5 d/ i+ C1 H% Maic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
+ ~; O3 x- A( b5 `2 p! s/* Initialize MCASP1 */
a; u% z7 f, e% l6 [5 _ mcasp = &MCASP_MODULE_1;
; G! D' f$ ~$ C# V" v$ c% U mcasp->regs->GBLCTL = 0; // Reset
1 h! \2 `! |! W* g5 B6 w mcasp->regs->RGBLCTL = 0; // Reset RX# J* A) n2 o. S) C g; H' o
mcasp->regs->XGBLCTL = 0; // Reset TX
) ` M- d' f. ^9 Z- A! P mcasp->regs->PWRDEMU = 1; // Free-running" Z0 r# a+ k8 z4 c9 r. b
// configure McASP0 receive registers
8 ~$ @& L0 T. E" l$ I mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used/ L( y; k, q/ U0 a: t- C
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 N( N0 b2 n5 C0 A/ t G mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
6 T. _: I$ U2 ]0 }* E mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)( D( ^+ w1 E6 V# X
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
) M6 t& {" t) B% _7 A2 r* P mcasp->regs->RTDM = 0x00000003; // Slots 0,1' t0 G# J3 J! q$ ?0 `: H
mcasp->regs->RINTCTL = 0x00000000; // Not used- U. v$ J1 N5 ^
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 o# R3 w: r8 B+ K2 X( \9 c* ~
: Z; W9 G* n) l0 c mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used2 o( m6 x" X7 R [
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
) C0 g& P4 d1 R. s mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
3 V% w2 z3 V$ W1 t/ t) C mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-164 T% ?4 \( G: I
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK4 v6 I8 w- ]4 l" w1 d8 g3 k
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
* E& J3 k$ z- s5 `: k mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
( g5 q7 t5 c6 Q( k$ g/ }; l: u mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: H1 K2 X8 |# R# M' F- L/ Q9 b; k+ @$ J$ Y2 f; ^" y) k: b
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN9 p2 F. H& a! G( h8 i6 P1 V0 a
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT- e) a \ R- x" h2 @: R
mcasp->regs->PFUNC = 0; // All MCASPs
1 S4 s2 f4 x/ Y9 W mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX19 d' l' S A# j. `& ]
6 a+ i9 q: P2 W! e1 J/ g
mcasp->regs->DITCTL = 0x00000000; // Not used
5 H+ T) F& W D) k mcasp->regs->DLBCTL = 0x00000000; // Not used
3 w, c9 r% r3 l( |$ c0 f mcasp->regs->AMUTE = 0x00000000; // Not used4 y. O" S# ~& L9 G
$ V6 b! d6 ?/ o0 W# O! r, ]8 t/* Starting sections of the McASP*/7 o' G8 |' x/ ~- L( P: X
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 2 Y' V2 a* C' d1 W$ B9 b( b
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
3 W* T9 F4 \- ?, l0 f mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; & [& r/ R) w/ ]) Z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
% L; ^. K' d) P2 C7 v1 R, \& W; o4 a3 E: k9 d5 \; t5 k t
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
4 w( T# V. I, @3 G while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
i4 g! j$ o; ^( P( N) q mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
* L6 \1 a9 i; s5 a" z, y1 o" { while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );( C) x# z& n5 x Y5 v( h
) B5 h( e: I# \: y/ L/ G0 z mcasp->regs->XSTAT = 0x0000ffff; 4 C, V4 }8 r* z$ [
mcasp->regs->RSTAT = 0x0000ffff; + q+ x) ?* X* X3 X, g/ f& a# e
2 q, `3 V- x) W9 r
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
- D, U q) H% s. T, {# K while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );3 V3 @4 ~6 W) V5 L: K4 Y, d
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 0 \5 {: F0 Z7 M1 j
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
- {) q" p8 u5 {. E/ Y G2 z; K6 K- O: j# n& U
/* Write a 0, so that no underrun occurs after releasing the state machine */
) A7 ]' a; a J& S% K2 b mcasp->regs->XBUF5 = 0;
/ p0 a C% N. V5 T mcasp->regs->RBUF0 = 0;) i) d8 l0 I8 q+ [/ c. R
4 f# y2 `3 ^8 G6 M
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
, s6 N! n2 g3 p while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
: i6 K. x4 p" e3 a# r mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; + {+ b3 @5 T# z2 \% Z* ~8 G0 d
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );( d$ i$ @8 A! R7 l X/ O: d! T# d
1 j, q$ Z1 b* D# `5 @; `
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 6 v: |& X) q, {8 f9 `4 [- v5 C
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );5 ~9 b, P P5 j; T0 t6 g' U
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 9 P$ z: y/ I1 V- `5 B' s g
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
^3 r% l# y: V' f* k7 U n6 b
. ?: s X# s+ V/ {; ? CSR = 0x0000;
! x6 E5 r; z s J6 D4 }5 o! ] INTC_INTMUX1 = 0x3d;2 s0 k! {" s" q6 V$ ?
ISTP = (unsigned int)vectors;8 a- \2 C; X/ z" `0 O# J) {
ICR = 0xFFF0;
7 u% `6 h. Z' [; p8 R5 z% F9 K, u IER |= 0x12;
; U; m7 ~; ~" f& f& c CSR |= 0x01; ; q7 m1 J- h0 F2 l# R7 m
- A& Z# e$ u. p* d) [+ c+ X2 \
2 W/ p3 n a3 i( S' y& M7 X# H$ c8 ~- k, h9 h8 t. y4 S: `5 u e: \
还有就是两个输入输出函数:
( F! w: v% z( L! u, Qvoid output_sample(Int32 out_data)9 y0 u' ]& r) u4 ~& R
{% J* M" k! l C e2 Q
AIC31_data.uint = out_data;
9 o8 ^, x& Q2 A: O; m MCASP1_XBUF5_32BIT = AIC31_data.uint;* x; w; s3 S: W, ]+ L
}
. s8 K0 [, F% P# C, u3 {( E! `2 N+ l* `/ T1 w/ a, [
Int32 input_sample(void)
8 \2 v% s1 f; i, f{ 9 M& f* [' w7 x4 e7 k8 \
AIC31_data.uint = MCASP1_RBUF0_32BIT;- X9 G) I) M: _6 Y/ ~ D. ~
return (AIC31_data.uint);
' K, s! C6 O& _ F}
6 E+ |4 c# ~( x4 a1 f5 l" N! L; [8 M& y: \' J/ H. t, s
|
|