|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:( @1 M& B4 a- ]* k0 ~- [. z, E
main文件:. p5 c2 ?' @ Q' }8 T
interrupt void interrupt4(void)
# X G9 M# [9 O{
: V# t8 V, q+ ?& v Uint32 sample;
8 Z2 p, t- \: M
- k) ]$ ]# c# d% n/ `4 r7 j+ a sample = input_sample(); // read L + R samples from ADC
' f1 V5 F+ s# X. M4 \5 _/ J5 ]/ \ output_sample(sample); // write L + R samples to DAC 8 j; v& c, J& }" D9 {& z; v) M, P4 U
return;- s/ i. Y: n; s/ m1 s! ~; ]! l
}
% M0 l! @, w4 F0 ^$ u' V; B$ F. P- M% q; m# z% e5 @- D1 ]
int main( void )
5 c9 D- k. @1 ^5 B! _{3 ^, _; x% z j% o0 D' K" P
& A3 s$ h C t
/* Initialize BSL */* n6 E8 W2 a V
EVMC6747_init( );
3 U1 B6 v, w) G9 ^# ?2 ]& r# E; A# W /* Call evmc6747_intr function */
' z5 M. x1 Y `% D; R1 I* ~# c8 \ aic3106_init( );: f9 e: N/ R; y/ B5 q6 N; O
while(1);
& @. r2 j, b- y+ i: X3 j s}
' d. p8 l" S0 }! T( I$ x0 Q3 ]# w5 _$ g* a3 {& H* H, Z) D
( H' t8 Z6 L1 u
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
; j" w! @+ ^8 @5 C2 d/* Initialize MCASP1 */
, E& c4 }& F/ ?: J* F, `( [; u mcasp = &MCASP_MODULE_1;
( ? I* u! y1 ] mcasp->regs->GBLCTL = 0; // Reset
3 @ O+ M3 C6 `& { mcasp->regs->RGBLCTL = 0; // Reset RX
+ e, z S1 G+ x3 x0 E mcasp->regs->XGBLCTL = 0; // Reset TX! X0 D" L6 {3 t0 ?8 e' o
mcasp->regs->PWRDEMU = 1; // Free-running) w# L/ x+ z: p5 X& F' y r( o# M2 V
// configure McASP0 receive registers2 G9 V% i( c: I( n# j7 S# G9 S
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
, p- Q5 X. m$ e, t9 G2 @, C1 i8 A8 z mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus W' p& o; L% _- |! N6 e
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
5 j: Q; `. n2 E1 V$ y mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)% c% j0 T1 Q- o% `
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
9 T( F1 C$ f: [- B# B6 F5 l mcasp->regs->RTDM = 0x00000003; // Slots 0,1
% v! F2 t' ]- K) x mcasp->regs->RINTCTL = 0x00000000; // Not used
0 {: |# \1 V' y$ ]( m* g mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256) {5 d1 r, j$ _3 _
$ W+ w/ F% ?$ D$ }% s6 C mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
, T* s; L. k: |- x0 i mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 D: [* S4 v0 a9 b mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word3 H: n n& C; L j6 c
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
5 g( M% F* ^/ E K mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK& }- u2 f1 z, G
mcasp->regs->XTDM = 0x00000003; // Slots 0,1) a3 [' Z V8 H8 m0 U: S
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
" F2 s, ]3 j' s { mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* @. C# a6 ^. K8 q1 M/ P: b* v4 z! Q) {2 B: Q/ q) F( O5 Q. V
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN/ _: W( Z Q3 I
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT' W: R, K0 M( N9 l, a& |
mcasp->regs->PFUNC = 0; // All MCASPs1 ]& F& x4 r! [' @: L9 P
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1) o. n, Q7 ~) H) A
8 o' z( R) q) p6 g+ A8 P
mcasp->regs->DITCTL = 0x00000000; // Not used
+ _0 C0 g- W, j' x mcasp->regs->DLBCTL = 0x00000000; // Not used9 m! a; \/ l5 K9 v7 s, E
mcasp->regs->AMUTE = 0x00000000; // Not used3 Q! L* x4 f" w' S; @
. d O( g# [9 r% Y3 |1 e4 k* d- r4 X/* Starting sections of the McASP*/% B5 t0 b4 ~. p; K
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; . g. U: ^+ j& c' p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
# g( e: E) S1 B- ? mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
& q* ~( e; z0 U; C* }+ h* ^ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );. p7 m* q7 b4 _
- S3 X& c% @/ f8 i0 C& e. V
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; y& E) w- o# h3 Y! R6 R" Q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
7 s3 y, \* c7 ^2 M mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; : u5 f% E9 D4 i1 L6 |7 L/ q) ~
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
3 F' Z& x2 H# @* g0 h/ I4 @: b2 E J" q
/ {# \ U, F; z6 x1 w mcasp->regs->XSTAT = 0x0000ffff;
5 B2 S9 ?5 W6 h4 F mcasp->regs->RSTAT = 0x0000ffff; ; p+ _6 J! W" F' P
* M7 B' g( @9 O mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
* J. E, T# C: U* C7 h+ I: z: ]3 R while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
! c+ x+ {4 U' N8 }7 D6 M- Q mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 8 g" X$ O( C1 T I0 Y3 I
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );$ r( C- R6 Y8 I; ^
% }' e3 Q' S- [* u
/* Write a 0, so that no underrun occurs after releasing the state machine */
4 r- D$ h& g& a4 S' S0 w mcasp->regs->XBUF5 = 0;
; ^6 Z! @! f7 B/ a8 u% ]( n* ` mcasp->regs->RBUF0 = 0;# ~3 e% O O6 }
- a5 F b2 R* u6 P" \5 d1 q mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ) L1 j/ d* r' x, L7 I; j( l
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );/ I1 s# j( h% i! W: X
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
4 u& v( n9 F- g' S while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );+ f9 [3 G- @6 b$ S% M: e8 M
" `9 j* z n7 P' h; z2 A0 f! \* } mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ! F2 ^# p& R' u2 {3 F3 R' a
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
5 l" o0 ^1 p( h2 U6 c8 U* _* | mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 6 @( ^' s. u* _' y; l' O. l
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
2 f, n0 t: L. _" `+ I: u4 V- \) ^3 J' ?; Y* {" R- p
CSR = 0x0000;
6 O+ f6 w) C+ ~2 u$ _( l INTC_INTMUX1 = 0x3d;, i H+ @. Z1 u3 ~. U
ISTP = (unsigned int)vectors;
& J: C& p/ p$ Z, @) y. P! C ICR = 0xFFF0;
4 S5 o, ?1 k: _5 |8 @4 J# ` IER |= 0x12; - Z3 ^9 v0 d6 d4 W' l4 M5 x' n7 P
CSR |= 0x01;
3 @0 {% |% }8 D3 ` J9 l# z! f
( a9 ^6 ~: I( r- O! d9 k! b, a4 \7 I0 m
# T5 t# e6 m/ [! p3 _3 z' j; u1 y还有就是两个输入输出函数:- B) C% d8 H! @9 P6 c; Z% |" t/ k
void output_sample(Int32 out_data)! m- z' n; K1 u& |9 A2 y
{ y1 U2 a4 S6 F* S) z* [* Z
AIC31_data.uint = out_data;
8 u/ n! `- m0 G5 n0 Y! ^: g MCASP1_XBUF5_32BIT = AIC31_data.uint;1 q9 r' ^" _ x% I5 g
}0 F7 G4 g4 D; O
$ D9 Q, j% K+ iInt32 input_sample(void)5 |# O. l+ v" A- d) E
{
" u; z6 L6 f( f AIC31_data.uint = MCASP1_RBUF0_32BIT;0 E/ M0 V0 Y. v
return (AIC31_data.uint);/ o) e+ p0 L+ T/ \; M" a
}) E, k W+ Q0 ` Z
3 F8 ^0 U2 r3 y) W, j Z/ G+ p |
|