|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
; r8 P" B. K7 U0 S2 Lmain文件:
6 s' w$ h3 u- x' Q5 ~interrupt void interrupt4(void)
, h; F; b. f" n$ `- `{
' A5 c0 T( N5 Y6 j8 a8 ]. ^& k Uint32 sample;, [6 r( [# k, x q# }$ K
) `% {4 o) y1 u! s% c" B* ?8 |* k sample = input_sample(); // read L + R samples from ADC
+ g, k# [9 \3 x% v& X L m output_sample(sample); // write L + R samples to DAC ) H; M7 s! e. o' D. ^% X3 P. g
return;6 o6 R$ w3 y5 c
}
9 X) n. M; H X2 x- x- `
; R7 R# ] o+ l! L- kint main( void )
# c2 @* B' R% U/ |3 P3 d1 L! R% L{
; _& \7 ~) J9 D+ ^+ j! [" G/ ?
* K( y, S4 |$ l9 r, c /* Initialize BSL */
7 P5 W+ O8 x; v* t; P EVMC6747_init( );
0 o" i4 }5 o3 Q" y) ~5 |' v- |; { /* Call evmc6747_intr function */# \# M$ w$ M2 {4 X: e4 X. h" d
aic3106_init( );
! o% j( X6 |! S while(1);; w( }6 C- w' C. K% Q! |- i& A+ h+ ]
}
M! i3 ^7 K( v G: Z# G8 ?1 W1 `6 A3 l! {: ]3 f4 G+ o
* U" z. O8 |: L' Z, ^, E2 A+ v
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题( Y, I: `9 x- v, E3 c. y
/* Initialize MCASP1 */
* a' x, V7 d1 c: J mcasp = &MCASP_MODULE_1;
; |( J& X& p2 v% T/ a1 G+ e mcasp->regs->GBLCTL = 0; // Reset, r9 |6 N3 I& v( g+ {. @2 T
mcasp->regs->RGBLCTL = 0; // Reset RX' Q8 G# d1 n9 T+ w( G, U3 D
mcasp->regs->XGBLCTL = 0; // Reset TX% p5 l! u# f7 ?7 ?/ y- x
mcasp->regs->PWRDEMU = 1; // Free-running! ? ~# _/ x; | _
// configure McASP0 receive registers0 T+ B: U; G& u
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
( N3 V* C0 j2 v7 Q$ W mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
8 Z& o9 W* h4 R1 ]8 w mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
/ t) |7 s3 Z2 ^# I: s mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)8 U" H# i1 |7 U/ B+ a
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side): P- J# w. H2 @ z4 y! j% m
mcasp->regs->RTDM = 0x00000003; // Slots 0,1$ a) @" q) l, C; g
mcasp->regs->RINTCTL = 0x00000000; // Not used4 Y# D, w0 R# ?( W8 I3 }
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 O5 j* ^* |% ?) g( N. X7 o* f+ _
( J3 X9 e. C) b& ~+ Y! G
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
+ C: C' Q7 W2 e; j4 n$ W mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus( t) i. \, s: c1 V( o ^
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
, s5 u& t4 o, e& u7 B9 A6 x mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16) R$ J2 g( f7 C5 Q; y5 ]9 E
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK B; w; Z" B& R- K8 w) h
mcasp->regs->XTDM = 0x00000003; // Slots 0,1* \; ~: b) q4 P! d
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit y& B6 j+ N4 |$ c
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2569 x$ F6 d% |) Q$ c$ m9 _1 N! g) L* \0 C
- q0 r7 y t: ? mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
0 X: L3 x9 ^( B6 L- T1 b q! s. X mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
9 q9 u7 _8 X& I/ Q2 ~ mcasp->regs->PFUNC = 0; // All MCASPs, N2 [7 E" ~' S6 Y- M
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1% u& o" t3 v8 O3 X" \6 s* M8 E
: E. w+ }# N( W$ M' R) h% h mcasp->regs->DITCTL = 0x00000000; // Not used2 M% P( @; ?) J2 p- k
mcasp->regs->DLBCTL = 0x00000000; // Not used4 E5 b5 V- O8 f4 F
mcasp->regs->AMUTE = 0x00000000; // Not used7 k5 T0 r+ P# n, V4 ^( @
" s+ |9 p) K5 ~$ A
/* Starting sections of the McASP*// W. ?8 p1 h2 W
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 0 c5 y% k7 r+ l1 h
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 3 @4 f% D9 r4 t$ }
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; " X7 l3 u1 w9 v
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );8 |& X0 L ^0 h& m+ |" U
" c4 z) E! c/ M0 O1 X" U" r% h* p
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
; }3 r/ L! h2 X2 T, o while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );$ z) m8 h6 T7 j6 h; R. p
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
5 d2 _9 E( r: t. _ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
' z! c" [9 W+ t5 O- T8 ^+ u9 o8 ~. f3 q" U( ^& h
mcasp->regs->XSTAT = 0x0000ffff; % x. _7 L n7 ^2 s7 ` Z3 g# U
mcasp->regs->RSTAT = 0x0000ffff; 1 v4 e) i+ Y7 w1 }; d$ @# o7 N
% y& C. ~* |0 R: P1 M, o _
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
! F$ b* D' m0 {4 K% X' b while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
' ^+ A% w" r {. O mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; , y5 |. F! Y& [
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );: @3 q% C* e) W5 x$ @6 g7 S1 ~
5 x }4 H0 X, _ /* Write a 0, so that no underrun occurs after releasing the state machine */8 Y- e% n. ^9 o2 {: V) E
mcasp->regs->XBUF5 = 0;
8 D' ~& K" z3 q+ e# E0 X9 I% g mcasp->regs->RBUF0 = 0;
% a' Q$ W: e4 P. k7 ]; }( W. p0 r; [4 ^8 b5 W, O3 c9 r
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
8 u# t" @3 ^ W+ o3 B3 b' q/ z8 H while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );6 d1 _% F6 U" n) D7 K2 e
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 5 _; z! Q$ F/ s) a# I5 ]1 R
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );- y& d6 K/ E) G% [- I/ t
4 a2 N7 s7 Q& v0 r3 J mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
^% E" j; q: L% l while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
8 ~- X8 ~9 B" `1 `2 K# [ mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
! r! \$ p4 X' d# G while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
6 a0 _! }. `4 t) V0 }5 y- Z$ f1 b. | ^$ ?+ S+ \! j/ X9 k0 U& k' ^' ]
CSR = 0x0000;
$ v6 z6 V) R( i9 J INTC_INTMUX1 = 0x3d;
: E7 ]# {% \6 c3 H, |* ?- D# c( W ISTP = (unsigned int)vectors;$ ~/ c) u9 {7 W j/ a" T' B
ICR = 0xFFF0;
! [" X+ I: z, z; i IER |= 0x12; & H8 y5 s! P, X% k6 a0 v
CSR |= 0x01; % M2 w9 O9 Z$ N5 l
+ @4 Z1 \; B. |: N4 z& R, l: b0 |, c( C
7 e8 a, T/ W& v8 I5 Q9 _- e
还有就是两个输入输出函数:9 R. N+ g! B8 [) k B
void output_sample(Int32 out_data)
0 q, D& ]4 Z+ _* [0 u' [{
% y/ B+ o, ?8 \& m AIC31_data.uint = out_data;
( A) K9 L. f& i" O MCASP1_XBUF5_32BIT = AIC31_data.uint;- i5 v+ ]4 K+ c$ ?% O7 K4 C
}4 S8 ^$ W ~) n/ U2 n, Y# ?! `
6 g' x0 F1 N2 N1 x( X4 J5 V: LInt32 input_sample(void)" Q# L* t. u0 m
{
, T9 m6 ]% }1 j; S AIC31_data.uint = MCASP1_RBUF0_32BIT;
1 }# E2 C. h. `3 B: _ return (AIC31_data.uint);' Q9 i: q& {! C* C4 S5 ?1 O
}
9 B$ n+ p3 f6 d! e0 j b1 z
5 q, c+ c1 B( ?3 B% g+ X |
|