|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:/ }; E8 \ R; }
main文件:7 W u b& v+ H* m6 S6 k9 E+ S
interrupt void interrupt4(void) 9 `+ k" R+ M/ |; c. o2 F
{
. y+ Y; N" x) A8 W Uint32 sample;
+ H8 [/ p) f [- i+ f$ ^% @* |8 A: a
sample = input_sample(); // read L + R samples from ADC
2 J) U9 {. w! s# r4 }2 i* ~ output_sample(sample); // write L + R samples to DAC - d5 I* h1 Y! i/ w7 ?" f9 g
return;
( W2 h/ T0 @' n1 C' o5 m}
$ p; x1 K# V M3 H: E' l7 O C
$ W/ E: i3 o2 w* p8 m; o! _! A- gint main( void )/ f/ ?1 _3 C" @/ W' I5 g
{
% a$ e. _" o- R2 [% x4 t9 e0 z; a6 { e6 g& U& m
/* Initialize BSL */
# c0 v; D- I& w3 N& l) b8 g EVMC6747_init( );
1 [3 i+ R+ ]/ X6 ~: I+ m0 S /* Call evmc6747_intr function */
: d' N' d' k) _ aic3106_init( );% _7 T7 B: p) ?3 t
while(1);" T I, q0 F3 H' r9 M( z* C. k
}
, I5 |7 z' G8 G( E% Z% O1 d% t) @) M- E' J% W4 L3 s. O
3 J) N2 s$ {3 k1 ?: ~; a' t
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
" d0 o, s: G1 f( A9 b/* Initialize MCASP1 */7 R D9 z$ d4 ~# N, P. |# [9 G9 B
mcasp = &MCASP_MODULE_1;
+ ]; W% k! {( L8 z z9 X) t% a! E mcasp->regs->GBLCTL = 0; // Reset
9 T3 E/ N; W1 A' r5 ?* N' x mcasp->regs->RGBLCTL = 0; // Reset RX( X' n5 ?, s0 r3 k" J
mcasp->regs->XGBLCTL = 0; // Reset TX% m2 D% p- k; E* F; u! P
mcasp->regs->PWRDEMU = 1; // Free-running
: S7 b( q1 ~- B( { // configure McASP0 receive registers" Y' q: O7 t5 g: C
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used. ]( i+ y8 j# `& F) ?+ g
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus: ~ T2 ^& C" e ~- Z7 x
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
1 g& P2 l3 D, \7 k! @' L/ ^ mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
8 k7 ~/ A( C7 ^ mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side). t/ a9 s5 r! n# }, Y4 V/ Z! r4 d
mcasp->regs->RTDM = 0x00000003; // Slots 0,15 Z1 G# Y* U6 L9 t) r6 W; a
mcasp->regs->RINTCTL = 0x00000000; // Not used
! \( ]+ }8 Q( b6 U3 U mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2563 z1 |( {6 c* T! u. m
0 v! @# Z/ p0 _9 y5 s/ U- f
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
" j( |# p9 O$ e. M+ G mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
& T" c' G, n: v6 m5 S ]# F mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word. N& t" h6 X; o6 h/ V
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16! k4 ^% ]; x6 O' O
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
' V8 ]- [5 ^& O: |6 l6 f! z( B mcasp->regs->XTDM = 0x00000003; // Slots 0,1
; H: B4 |' w' C" ^/ ?* s mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit; f( ~; [6 P( A8 [. R# R$ ]% G% N
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, F, \7 p% i) E1 u+ h0 l
$ F ?2 K& ^7 ^! s9 |1 B mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN% b O3 I# y# A, W/ k9 |; {0 A% i/ ]
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT( q/ \& `! R. F: z9 o8 ~
mcasp->regs->PFUNC = 0; // All MCASPs% X" ~9 u+ S0 m! D
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1$ s+ b: p$ y$ D$ i! m1 m: h( g
3 G5 T" j. C, w4 y+ Z
mcasp->regs->DITCTL = 0x00000000; // Not used; e$ Z. H/ J" ?; q5 F
mcasp->regs->DLBCTL = 0x00000000; // Not used
: ?1 D/ f% A6 F5 L mcasp->regs->AMUTE = 0x00000000; // Not used
9 F+ p. K* i3 M$ a! t, s- ~
" `" ]: W8 E1 _7 _1 N* q/* Starting sections of the McASP*/3 O9 M. I% Y2 g$ r& u( m) M
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ' k7 L8 t; j! C0 s
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
% j+ N) @, M1 x1 t% v! U9 B _ mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; " l3 s$ a' m; z7 [. K/ G
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
, R# d" M8 C! @% ? x4 d5 D8 Y" c5 Q2 m8 J, R8 V. o
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; , w% s1 }! ^0 ]0 T% N6 ?
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );9 C. F O0 G$ C8 I
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
0 X% Q' a* j" \! N) T. W while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
$ @! m# U: e( [. P( f
% [+ {1 g y% t mcasp->regs->XSTAT = 0x0000ffff;
|; p, m, t# B% @ Z mcasp->regs->RSTAT = 0x0000ffff;
5 q+ w. w1 D' g/ e/ K, F% A: ?( q+ e* W$ M
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
2 e$ _; k0 B8 h+ F' v7 ~6 J, q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );; T# J- ^9 A+ q
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 7 l0 O( d9 X% B/ K' b1 W
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );$ w+ \& ^. Y# y0 d1 p* D
, {6 m* j7 X4 n' X$ T% Y /* Write a 0, so that no underrun occurs after releasing the state machine */, N+ c8 S( ?) _) H
mcasp->regs->XBUF5 = 0;
2 i9 c- i1 J/ B mcasp->regs->RBUF0 = 0;3 k- h1 z) u7 r0 A* T5 s
8 k6 _. p+ a" d/ Z; F9 O$ B, Y mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
/ Y9 j/ d, y" S" z7 ^' }- { while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
2 L: T/ t4 `) w mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; / u9 F3 E# y; n0 t
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
+ @+ W* |/ ^" g7 F0 k" e5 b7 T/ Q6 y( m; @5 f5 X* F$ a V4 C
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
9 C9 A, U3 O4 {/ a; P& }9 Q* A! p while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
6 b' n: e) l1 W& `( @ X6 \ mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
& T2 p8 F4 Y, f7 T) j( V% D) d while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );) Z' A: q- B* ~- w
; R. b3 Y& u' b2 x1 H4 h
CSR = 0x0000;
5 h- k H; L; z/ @. d INTC_INTMUX1 = 0x3d;# I& e0 W' `/ H8 S% U, y
ISTP = (unsigned int)vectors;& |# T! {) A7 I% j: _
ICR = 0xFFF0; % r- n0 g, ]; Q
IER |= 0x12;
$ ? u6 ~" ^2 t& W CSR |= 0x01; 5 C0 B) D, ^. o: L, [
/ X4 A3 e9 Z8 V) O" A2 d$ E
) b( D( @1 D2 M1 U: H2 m* @6 ?" _+ ~) g- G. b# } ^5 t# m
还有就是两个输入输出函数:
; o+ h8 U; A3 Y$ C+ Ovoid output_sample(Int32 out_data)4 J2 B" c) S/ Q5 B! j2 e0 Q) k7 O
{! t5 `& ^# S4 v
AIC31_data.uint = out_data;
) u9 ~. U7 K+ ^ MCASP1_XBUF5_32BIT = AIC31_data.uint;
; v$ Q& E* T* }4 L0 X}+ ?; t8 @$ ?4 I/ T0 |
. B. k/ C( J$ o8 tInt32 input_sample(void)- G# N% F* l3 A$ B/ m7 p, @
{ 4 ~" y1 n/ G- s4 K. X
AIC31_data.uint = MCASP1_RBUF0_32BIT;
& w u* W, x) |. @ return (AIC31_data.uint);1 V: |: D; N( A* j2 j3 }5 b( S9 p
}! j: J S+ T6 \. b- `
+ |& c8 ]! e/ g
|
|