|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
( Q- I$ A5 O+ R6 r$ y4 ?main文件:
8 c- P5 a! X% f2 ]( Cinterrupt void interrupt4(void)
& {' d: L- K* J' H6 K) q/ F0 P{6 ^- [% X8 D+ B# I
Uint32 sample;/ y& Q* m ^3 S. U' y4 ]& B. m0 K
6 _! w8 X9 Q/ ^* h) W8 G# G0 Q2 ]7 \
sample = input_sample(); // read L + R samples from ADC
- O9 q7 @; m. ^: q: S% [: m7 } output_sample(sample); // write L + R samples to DAC
9 n% i+ P7 Q9 _, z return;' d" B4 S5 j1 X
}% j1 W; j9 ~( o6 j
4 }; b* \) u) T0 u* X
int main( void )
" g! `! [. H/ h# L{5 Q0 R4 K' R$ t( ^
4 m- S5 i/ B5 Q5 q" o /* Initialize BSL */
4 Z' H/ L) @1 }$ \4 E `5 ~+ F EVMC6747_init( );
. g, l, [5 B9 f( J5 t% f L& T: | /* Call evmc6747_intr function */
9 V0 E F `3 R3 I) J1 j aic3106_init( );
1 f7 K. H) a: o" P while(1);) _" Q' P8 V8 L0 ^
}
4 p8 ^* m: ^2 t. }9 a- N7 M
" L; S7 Q( I6 n- I) c+ F; u( D
8 D k- }9 G9 J O) g4 i- [aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
/ W! ]: h3 e" R- f* X% v. [/* Initialize MCASP1 */0 v% F' w% ~8 ^0 U/ W; n$ J6 K
mcasp = &MCASP_MODULE_1;
6 n3 G6 B" }. ^: {# y mcasp->regs->GBLCTL = 0; // Reset
9 f: t5 T, T; K& I mcasp->regs->RGBLCTL = 0; // Reset RX2 I( R( c5 @+ o" b
mcasp->regs->XGBLCTL = 0; // Reset TX' X+ T- m$ {7 r5 I3 g9 {9 k+ s
mcasp->regs->PWRDEMU = 1; // Free-running0 b4 v- o- I0 ~1 W: Z) {7 B
// configure McASP0 receive registers
, W8 w; s3 }( q; W+ f; I mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used+ E6 |: J# m) p7 u9 x+ J
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus5 B- V) } P' O# A5 S
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
1 b# ^' P- i) N/ F# F mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)7 K! g* X. ]1 t* Y+ A
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
7 _+ b z4 Q3 F+ b mcasp->regs->RTDM = 0x00000003; // Slots 0,1$ N' k/ O; |) V' W: B4 `3 m5 L
mcasp->regs->RINTCTL = 0x00000000; // Not used: E O7 y6 _/ r
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# e; j! N( U+ }: F2 K& I* ?5 h8 n: G7 k: e
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
, ^2 g7 J8 X. G {, ?& f; m; g$ W mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
& v/ K+ M. {# v' E$ M# h) V mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
( f& R0 p1 B! |+ U" g mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-161 P7 N" X- i7 B6 _ n" @( b
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
3 K* k2 T, G$ [ M; Z" B- p mcasp->regs->XTDM = 0x00000003; // Slots 0,1% `6 i, K$ k6 X( i- [
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit% z+ z4 n' L2 M. i
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2561 K/ B6 O) {, |7 |6 O
5 f. V, Q5 C9 g# A/ _
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN+ W# L+ q8 P6 m- j
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT) b- ^% C7 X6 }% r, ?
mcasp->regs->PFUNC = 0; // All MCASPs7 W' ~% n7 M- r. A& Q
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
+ h. L& r* A) _* [" ?
. T* h& i0 q( d I2 f mcasp->regs->DITCTL = 0x00000000; // Not used
2 z" y4 p, _0 s1 e mcasp->regs->DLBCTL = 0x00000000; // Not used% t0 @! r6 j4 s: }9 v4 v
mcasp->regs->AMUTE = 0x00000000; // Not used6 E# N( n3 M% h& f1 n: o( |; Z
' e& v5 o6 d+ k0 {2 F
/* Starting sections of the McASP*/+ U6 p% t' c* n+ N# ^# R9 C
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
5 p* M+ ~8 U: T4 [. h* P( } while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); * k# k4 ^$ d0 V
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; , e- K; s. r* C* l
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );# o- N) a) t: @" E
. V- c) z# B5 u; m0 E4 S" |
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
- [6 N9 F5 D, z1 Z while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );) E! I7 ^ B, T
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; " d3 Q p2 _1 l+ e
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
* N; t( s1 F& V& D. P( D) R# F
, S6 q7 s% E( n$ @ mcasp->regs->XSTAT = 0x0000ffff;
7 E* i& c0 p E mcasp->regs->RSTAT = 0x0000ffff; 6 W; @ \0 x% }$ x
' W0 x6 B* V4 n* A/ e' _
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;8 b1 Y+ J1 }) L j
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
% d3 E% j; e7 U' a4 l mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
6 Y, x2 B7 e# P& q& U1 M while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
" q& J L- C5 \6 t0 ?+ y! U7 [; p; E9 q1 O6 V
/* Write a 0, so that no underrun occurs after releasing the state machine */
' C) k; |% Z( P! y2 ~- B: k* H) G9 D mcasp->regs->XBUF5 = 0;
# ?! ~5 G, [9 L" U0 ~ mcasp->regs->RBUF0 = 0;
. R# W* t2 u% S% M6 n, Q j I* T
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
: f3 u- ~% W+ o while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
- W5 G w9 \! b2 f. q; D7 M8 M mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
! t% u' B$ k9 v5 ~3 Z$ W while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );# T3 ?2 L& x7 t, N. n
) j6 f' y7 v; I/ ^ mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
( \+ V/ Y; x' K" ]- P7 X: P W while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
' U" n. L1 Z% A, A* w# n5 z mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
& U* \8 R& N8 s5 v- W4 S4 N/ U while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );9 U9 H |( {+ v# L* Q3 v4 H2 a
% A# d; @9 b; V5 }% y
CSR = 0x0000;; s0 ^) y5 |6 [& ]7 ^" N. k
INTC_INTMUX1 = 0x3d;) E. q' x, B: ]" O4 t/ j; W. a* ~
ISTP = (unsigned int)vectors;8 A' p% N' J/ O: `1 Z, z t
ICR = 0xFFF0; 5 K0 o. w) K5 t# V. V
IER |= 0x12;
/ u3 g3 r4 ?1 D. U CSR |= 0x01;
' p/ |6 k$ K( k7 G3 |4 i4 A; P1 L) t3 c# Q/ g0 X
# B' ~( v% u- `4 ?0 S, F% C
; ^- F+ j& x+ } Z7 A还有就是两个输入输出函数:+ v9 F8 @/ f4 v% {5 U$ F8 Q+ p
void output_sample(Int32 out_data)
8 f) Z5 z% d9 L! |2 |: `{4 i5 N0 Y# u/ }
AIC31_data.uint = out_data; ; d+ t$ p% I- L5 W/ i9 g7 u
MCASP1_XBUF5_32BIT = AIC31_data.uint;- j3 g8 ]$ v2 {3 o$ L$ U! K7 z/ O8 Q
}
3 M( X9 t9 x7 G" _& g, J9 C
; L" X! @; k _) UInt32 input_sample(void)
" g1 R( R+ `8 ]. _4 u n a{
7 A% \- }* T$ T$ Z AIC31_data.uint = MCASP1_RBUF0_32BIT;
3 u5 G1 v0 G! x# S1 @; j return (AIC31_data.uint);
) v5 _) f7 ~/ N}
2 z* a6 \, E& E& D8 A7 B6 c3 S3 T& h4 [% f! R. M2 B
|
|