|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
# S! H; z B! P/ R+ X; tmain文件:% U$ @ u( L2 \: _7 ^' W8 `
interrupt void interrupt4(void)
/ h/ ?; q$ e& E& ^+ ~7 e{
- k6 T& K$ ^: y: s0 o Uint32 sample;( e+ k+ o: I! V. r$ k& v
* S/ j# r; L4 H* S# @, z! ?# O2 J sample = input_sample(); // read L + R samples from ADC
5 b. x; B3 v: G. T output_sample(sample); // write L + R samples to DAC " O( V+ s. G& A g6 ]& Z
return;
, B9 F( H& ~! ~}
% B2 A: _( L9 I' z N4 u4 n
: v) \6 Y7 C, i' v) ?/ Tint main( void )
! l2 g. A$ Z* t7 ]{3 Z; Z( R) v9 E( L
) c {8 ~' F4 u/ |& u* K$ g /* Initialize BSL *// ]$ w P* H9 b$ C8 G8 V% g' U
EVMC6747_init( );( b$ ], @$ d) ]8 r: Y) p
/* Call evmc6747_intr function */
8 _' B: z( x- W9 m! x$ W aic3106_init( );
1 m. {- u6 Z+ \) I3 L while(1);; c8 G0 Y8 C4 u5 I5 r; a* B
}+ E( }# c; D F! q; | {2 B
" Y1 f$ ]" F2 b, `+ D1 S, A: D3 {% y+ L" V* J
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
4 D2 x! {( v0 K; O8 D/* Initialize MCASP1 */ W5 r/ D# U* i) z
mcasp = &MCASP_MODULE_1;
# ^- p. v- m% @ F mcasp->regs->GBLCTL = 0; // Reset1 N, W' Q1 \" g7 a
mcasp->regs->RGBLCTL = 0; // Reset RX7 e* E0 K5 G: z5 F( w, [
mcasp->regs->XGBLCTL = 0; // Reset TX
+ T0 n$ z1 s4 [ mcasp->regs->PWRDEMU = 1; // Free-running$ {; [ |# \% W/ q
// configure McASP0 receive registers6 E8 C+ Z2 Z# ?- x0 p
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used( h* l+ P& O$ X" [, q, p, q$ N
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% r k2 Y+ ]) h1 E3 ]) O# u8 p4 D: `1 E mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word; ?& R+ g6 _" u2 b+ a% e- ^, j. ]
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side) H. W. {' ?: A1 ]3 v$ K
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
# o; X8 l, b2 V& f mcasp->regs->RTDM = 0x00000003; // Slots 0,1
. l$ U4 W! V8 }& H mcasp->regs->RINTCTL = 0x00000000; // Not used
. f0 M" ]$ @& k: \6 \ mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2565 y( s6 |$ P2 {. \8 Y6 P3 E+ K
- T- r- a2 e: t( A) T! s: I mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used$ Q2 A* R6 V" ?( Q# A* `! G9 M
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus4 t* k1 }. |3 @6 t8 h- N
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
2 Q# o2 \/ ^; c) s. } mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16& I& I7 v+ h8 O& u' l
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
( Q) }# j* E. L' z mcasp->regs->XTDM = 0x00000003; // Slots 0,1$ `* W9 _4 I5 W. `
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit) Y! G, d& B2 q ~
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
$ y, h& W6 X7 g' l0 L, [
7 i) v2 ?( C4 u mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN( d; A, H' M- Z: P9 {; `5 M% }% t. D0 s
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
+ `) h, n) e1 d5 ^$ L, B6 W mcasp->regs->PFUNC = 0; // All MCASPs8 j6 q2 ~5 `5 ?! m" M% c
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
3 m# C2 k' j( Y) @: {( p) b
. K/ S& F! J2 N7 k( f7 q5 ? mcasp->regs->DITCTL = 0x00000000; // Not used
" c5 e/ }1 H6 J8 _% [$ ? mcasp->regs->DLBCTL = 0x00000000; // Not used
f! ~7 B+ I8 h4 l H, Z mcasp->regs->AMUTE = 0x00000000; // Not used7 k7 Y( V. f+ L. j1 |% Q( S* K
5 d& y2 ?( d' d1 T/* Starting sections of the McASP*/
* B& L& v l5 ?7 r( q mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
7 ~: G# E x( p3 `% o; h0 R6 F while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 8 ~! c1 j( ?/ S6 q& p" C0 R$ m/ k- J
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
5 r U; T/ i E4 _: K: v3 P; O while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
- f6 s, `& g( n* a
6 _8 L3 f' A( z" H5 J B mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
7 O. R. n0 L+ l6 V+ f2 Z9 N while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
5 P" g% i$ H2 }/ S% @& P mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
7 n7 ]4 {) x2 j while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
1 G7 X1 ~: Q4 m7 [, {
" l$ E# H6 O' H- k, D mcasp->regs->XSTAT = 0x0000ffff; ' L* O. k7 c8 R' E7 U9 \ L
mcasp->regs->RSTAT = 0x0000ffff; / J( B8 x4 R# j- r
# H; s$ ~$ f& q& |0 x* i* _/ C mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
, a8 I# F" \3 X5 _; B- l- P5 ? while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
7 S( E' k8 ~! Q9 G% A8 D) J mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
" o9 i6 y, U+ R while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );+ O2 q) O( {% w! n
4 m* k1 \$ ^/ R /* Write a 0, so that no underrun occurs after releasing the state machine */$ \4 x: h8 F p. C6 m; ^: \
mcasp->regs->XBUF5 = 0;( {& V6 w6 m! `" n" D
mcasp->regs->RBUF0 = 0;. G. s- j8 X3 o% e8 i$ U2 w
1 N( k2 g: \' c$ g
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 6 M5 B" u* s- D% }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
# e( C8 z) U( U# y7 N. z7 f5 X4 \ mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; . d8 }+ H; R: o; }- V9 A
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );* r/ q& G0 W; E9 x3 j. A
7 n# _: u* P# `" ^- L mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
' x( d6 G# E# [$ c+ l while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
3 [. U" W+ s, I% j mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; . h+ k) z+ G7 C: Q8 @/ X9 [0 z s
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );. K) w' k+ h) a% I( u
7 Z4 `4 @0 k1 Q9 { CSR = 0x0000;
& y+ E" S- |' u7 T INTC_INTMUX1 = 0x3d;
& v+ w Y( {1 y! t J- Q2 Z) X/ A ISTP = (unsigned int)vectors;5 y7 j+ I& h( p" [: A( B. Y* e" F
ICR = 0xFFF0; ! F- o+ B/ x0 k9 H w; R
IER |= 0x12; % t' B5 R/ [1 n2 N! V& `9 T& m
CSR |= 0x01;
D4 h5 j( f' z8 e5 O9 U( B$ j2 R8 h' K1 B" [
) P7 O. T H( [1 `2 }# z: o8 ~7 y S' Y* M) E
还有就是两个输入输出函数:7 J5 _0 g5 m ]9 Q
void output_sample(Int32 out_data)
" X& H# Z4 \* h; y3 Q0 x{/ T3 Q. {5 e4 C) Y
AIC31_data.uint = out_data; 5 r# y! n+ q. @
MCASP1_XBUF5_32BIT = AIC31_data.uint;# X3 f+ C: v* l! h! g& J2 o
}
$ G; k9 E- J+ p7 \+ J) U0 D, W( L: _% ?3 k# \% _7 g2 O1 U9 c7 }
Int32 input_sample(void)
( R3 p6 p5 c6 J# [{ " H3 m4 t9 a& D5 E$ }4 D
AIC31_data.uint = MCASP1_RBUF0_32BIT;
/ O( K3 x+ c1 w. D4 |8 h1 e return (AIC31_data.uint);4 e# ?. c* i% B r9 o5 z
}
) v& C# R9 H/ X% X6 U8 k* G
% W) F. }, z9 }+ ?* _& A$ x- c( F |
|