|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
8 T+ ?2 T. ^9 \. o; M1 J+ Y4 qmain文件:
( D8 N0 Z2 f1 }# g; q f7 g% a( Xinterrupt void interrupt4(void) ! m7 V5 \) y' N5 r
{* \7 P+ e9 V& x. _# R! @1 D; E
Uint32 sample;
, v* p! ^3 d$ \" {( c$ }
6 @6 V' p+ P7 u6 E* T) D6 o1 [7 _ sample = input_sample(); // read L + R samples from ADC, D% t% {& f& Z- h4 _% r
output_sample(sample); // write L + R samples to DAC ( |% g! A8 E8 n1 g
return;
+ Q. Q9 Y. n i* c}
* _9 p2 U! R* k/ f: a9 P2 }5 A( N/ f: W1 X3 P
int main( void )" a3 Y, G, [ k
{* c0 R! X+ q$ a2 C
1 j$ E7 u" F4 d7 [8 ^- t- ^ /* Initialize BSL */, i" q' k: j/ N7 \
EVMC6747_init( );
9 k, S5 }, G! j5 u" ]8 V /* Call evmc6747_intr function */
- C9 g- I3 E3 _: n6 z5 W2 | aic3106_init( );
/ _* u: k" X; r9 Q while(1);7 t6 f# Q; E& V' |8 ^
}; k4 e; Z+ c+ E# K, W# I6 E
* F- o1 u3 u- `2 W) Q; s6 [9 `
; x3 V& N; R0 M4 d& aaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
7 A! A( V1 r% K: b0 ?/* Initialize MCASP1 */
# t' W% Z, V" \ mcasp = &MCASP_MODULE_1;, {8 ~( v! r! s. _* x3 X+ {% d
mcasp->regs->GBLCTL = 0; // Reset; v3 |/ k8 m4 ~& D- \
mcasp->regs->RGBLCTL = 0; // Reset RX' d" m( ^ X m( t+ X
mcasp->regs->XGBLCTL = 0; // Reset TX. N5 ?% {8 ]4 t6 S, o$ {. l, G+ T6 y
mcasp->regs->PWRDEMU = 1; // Free-running, N" R% G# L( I$ F, D
// configure McASP0 receive registers
6 R, \# D# p% Y2 J mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used0 A. z0 A3 I4 X) ~
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 F' c2 d% S! _/ y mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
" l' m9 Y$ r* [* b mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
3 o% v2 _) f" u! N7 U% x mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
9 K* u& F( o% U8 {0 |" [/ W3 i mcasp->regs->RTDM = 0x00000003; // Slots 0,1
' w# S* C2 [2 @% D p mcasp->regs->RINTCTL = 0x00000000; // Not used. m* Z( M. C* r9 k# f
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
a2 g: [3 A( s3 Q- R& L
. I. D; [8 s5 e T mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
B b, n t" m, P* l' R9 q mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus( e$ @! U5 Y4 X# [
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word6 o) h/ }/ T# ]
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-168 W0 Y. C+ e! W# ]6 f) F' ~2 N
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK$ }/ c6 k/ D- b/ w9 w4 U9 K5 q
mcasp->regs->XTDM = 0x00000003; // Slots 0,1% N# }4 f( k6 m' z2 a1 Z
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit: N' P+ W7 m3 t c9 j' z, l
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256" z4 B1 U1 x1 T
( S7 {* \3 _: } mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN0 ^9 E. l& \( I- U$ s% a
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT; F8 w5 T- u/ n8 q% c
mcasp->regs->PFUNC = 0; // All MCASPs6 u* n/ U* J# w; Y( G0 a
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
8 z; r, V7 }3 C% T+ p4 a G, E3 E, V( p& P# Q
mcasp->regs->DITCTL = 0x00000000; // Not used, R3 j- N- E+ R) ^
mcasp->regs->DLBCTL = 0x00000000; // Not used$ D1 F0 K3 M! |
mcasp->regs->AMUTE = 0x00000000; // Not used
# _; b; e! O2 M+ e: a4 E
) q! Z& B5 W/ L( y/* Starting sections of the McASP*/( u% W: N6 m9 U5 |1 C3 S7 M9 B
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
4 T9 t8 p% j- F9 o% l( w while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 1 |- `) u' T# S- c& z
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
" s& P/ f+ n5 j1 J$ E while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
7 T! \3 Z# b% g v8 M* T. o" f) z% q, {' C! y" t1 b* R+ E( B
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ' x: S: G6 j _6 y# g" ]% ?! \$ U
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
$ V! m& U+ P5 R* y$ r: M5 D mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; + k# [% p; X2 l1 _+ Q3 {
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
: @ ~! h/ L' f# ~. c% o6 e
1 Z* @- n( ?1 T% a7 U mcasp->regs->XSTAT = 0x0000ffff;
: W, S& c* a D: g, O mcasp->regs->RSTAT = 0x0000ffff; " r% K: K: x5 H: L1 T4 W
0 b! T; C# Z9 ~% ]2 U6 X4 i A# D
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;; L- E8 S5 f5 D K' b: D. J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );7 \" z( V6 A& }( s+ j+ x) O
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
1 w) _5 F$ g3 b$ I' H" Q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );0 \* z( ~. V8 h+ U1 |* d
% `/ J9 s, U4 W- [, ]+ r /* Write a 0, so that no underrun occurs after releasing the state machine */
i2 i Q& l6 P) U+ t mcasp->regs->XBUF5 = 0;
9 X, ?0 B/ q2 O0 O% L3 e: F mcasp->regs->RBUF0 = 0;
& a9 W; G: O# y' K, Z8 ]/ E/ D* `* q4 E. ?# x# T' k% S6 k: M
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
6 q2 ]) L J6 D. A s while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
: h7 J" O$ `! N9 t mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
, }, [8 B7 ?! A while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
: `3 l0 l4 ^) O4 c8 p' B. G) L( m- n5 I5 U7 W
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
, b7 Y: r3 v" r while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
+ ]& u. i! m0 f$ }- H7 P1 N& b mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
1 K5 ~# b1 s9 K/ h7 ? while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
9 K5 k5 a& Y; [6 [7 {) E$ F
( C" L" q2 U7 l- R1 e CSR = 0x0000;
! d& f, h3 x' G! k1 t8 { INTC_INTMUX1 = 0x3d;
' o8 p9 d. b% z4 D6 r- o" ^ ISTP = (unsigned int)vectors; _+ M" O- D; G, v A* L
ICR = 0xFFF0;
$ V% _$ r& ?$ V5 l3 e6 X IER |= 0x12;
9 a# S5 i2 Q4 V- |6 ]5 s CSR |= 0x01; 6 f% I- h5 @$ c0 j( t
: K1 g8 b# c( o6 s! E# E1 ~! |
9 R- Y5 {+ K4 `+ Y
3 l+ A1 U# h* E8 m, M还有就是两个输入输出函数:6 F4 p' e3 [* Z( S g* j* Q
void output_sample(Int32 out_data). ` l" [+ O0 p/ \6 ^
{
5 r, p6 F5 I3 w2 @ AIC31_data.uint = out_data;
7 ?& v+ g: D' c) F MCASP1_XBUF5_32BIT = AIC31_data.uint;6 f+ [1 ^* u% ?& X
}
. l* ] M2 E7 Y$ e3 p, z: |) V3 T) _* i
Int32 input_sample(void)2 e$ H, U9 z) ]% W
{
& s8 M! D: ^2 Q+ G2 [% U N7 G AIC31_data.uint = MCASP1_RBUF0_32BIT;
$ i: c: o! B" u( R4 E& j4 N8 ]" u s return (AIC31_data.uint);& X% f; O" b$ ~/ z- s
}5 |( d+ J5 w# s$ q2 i4 V
k* S; B3 P$ T8 F4 T: Y9 O
|
|