|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
9 t% m2 Y2 O7 V1 c3 Z2 [5 x# y7 Xmain文件:
/ L! O, m' I0 {0 p- Tinterrupt void interrupt4(void)
! ~: o0 G( @9 c7 i8 s2 u# ^{
5 d" \7 a% v, V5 W6 S2 O t3 K Uint32 sample;8 L n; A( x' ~$ ~
: `3 I8 U8 ]4 c
sample = input_sample(); // read L + R samples from ADC
" t( C# \3 Y# }& ^ output_sample(sample); // write L + R samples to DAC U9 H2 \+ m! F" I. q' j
return;
) G9 w8 ~, W4 F* ^" h8 U |! T: `+ r' w}
& r1 E2 D2 y4 o0 t/ {0 e
9 q5 i9 ]3 s! Q. S: \, _; W+ d0 f9 xint main( void )
+ y) p4 Y6 v) S7 N5 p0 x{
" K' j! [7 ~4 L( e6 @7 W' w
x# H/ o- N# {( \: ~$ }4 T /* Initialize BSL */- ^+ }7 \! c: W
EVMC6747_init( );
! s! D4 ~, o% N: @% k( x' n /* Call evmc6747_intr function */; S P& Q! N6 ^# \* Z& @
aic3106_init( );
8 U* n: s$ v' i- [. Z6 ` while(1);! S5 J' S, x& I
}
3 J7 c+ {- K. [8 Z( r. I5 e) J9 ^$ [) h& A- M3 E
' D& m2 F: g( ^* h9 y
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题/ b* Z3 X" w1 P4 U% u6 w! L2 }
/* Initialize MCASP1 */) x8 ~; U& ?7 H% b+ M
mcasp = &MCASP_MODULE_1;
! u6 v( G7 ~! Z$ c+ q mcasp->regs->GBLCTL = 0; // Reset
! {6 r( k- ^' u; {6 J8 ? mcasp->regs->RGBLCTL = 0; // Reset RX
0 x9 n( O+ v4 k W* Z mcasp->regs->XGBLCTL = 0; // Reset TX
' b3 ^" f/ j8 ? mcasp->regs->PWRDEMU = 1; // Free-running* I$ ]% X8 D7 y
// configure McASP0 receive registers
( ~% D" ?0 F6 u# O mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
7 u2 Z: H/ b7 c6 E% j- ^+ d) C mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus' s4 E2 R. g$ D" Y
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word/ j9 j2 F7 l/ ~0 y% m' T
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
5 T" E$ a- `; e: S" h: ~ mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
/ u9 G# d6 j# G4 ^ mcasp->regs->RTDM = 0x00000003; // Slots 0,1( D. @( I8 L, }( E( [& l9 N, ]
mcasp->regs->RINTCTL = 0x00000000; // Not used
; J7 w) [0 o7 p2 ^ mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
$ O# D* \( ], m$ r; w
% E i9 c4 s ?& D1 K" d! a mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used/ X8 }& c" S; Q8 p4 A
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus8 f3 ]% L0 g( m& e0 D
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word: O, f2 j% H/ ]7 `# U
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-164 S$ v1 d3 a( p4 ]# n0 v4 Z
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
9 R$ L5 E( I/ u7 X4 k: V! j b3 m mcasp->regs->XTDM = 0x00000003; // Slots 0,14 P. X& E3 u4 q/ a, H) ]- C
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit8 t" Q+ \6 ?1 j$ e% Q4 p
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256* `, m% H& T& R- w' s: L- `6 Q
, u& a& V8 M% f% P) U
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN# {+ Y( A( H$ J" c1 Y' e1 B
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT6 A7 d4 i. p+ I( [8 A3 q& K
mcasp->regs->PFUNC = 0; // All MCASPs7 x+ N* I5 i: y% _& g& a
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
: A/ W8 n8 z+ A' i, }$ y+ q9 @$ T/ U& a( \8 F( W6 Y
mcasp->regs->DITCTL = 0x00000000; // Not used9 ^+ t+ k# {& |$ v3 M
mcasp->regs->DLBCTL = 0x00000000; // Not used a# A' }- D0 c3 ]# c
mcasp->regs->AMUTE = 0x00000000; // Not used
/ G: a/ v! m0 j6 a% p* Q7 P
: k8 ~% j3 [& e( v6 W/ b/* Starting sections of the McASP*/- w) ` x' D' {
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
. @% ~' B9 ~# Q" r$ k1 m while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
/ d# F7 K: ]# T' r/ G" x mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ' _# ?" D* R2 y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
1 a% I8 J& [& _! c3 K7 p- z! x1 g* w2 ~, i0 _
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
7 v9 e9 c% x3 }) S9 z/ i. p while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );# \* P0 f$ c6 T! P' X* P5 |
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; * {4 Y& _4 o! `; [ |- b4 ?
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
" ?9 P4 L3 u; ^) `/ G4 f5 Q* H3 ^5 q/ s8 J
mcasp->regs->XSTAT = 0x0000ffff; 9 a/ Y/ M+ R% `+ Z* X* q8 S
mcasp->regs->RSTAT = 0x0000ffff;
m6 n; `/ O0 @+ y* T2 Y
6 [0 l0 z6 z, k! s5 \+ s0 u mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
; u: }* l4 T$ e- b% l. v0 M# k while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
/ v' L4 p. l! D g# n& a& W mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
- Q% ] N' i! B" R, O T% D while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
+ a0 I+ D; B1 d$ l1 l/ L% N
4 \% h+ l( {+ Q, [2 Z; f S, G /* Write a 0, so that no underrun occurs after releasing the state machine */7 _2 N7 e- T: n- V ]
mcasp->regs->XBUF5 = 0;
) B3 q" N5 N) X3 {% b5 K mcasp->regs->RBUF0 = 0;
, @; a' e6 @3 `2 i* E- P! c) C! |! O1 X6 a
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
& U3 ^2 }2 F; J7 s6 Q" W2 X2 r. ^ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );- a9 C) o6 z% o4 I
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
& u2 }' P5 R5 a# K while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );$ W: Y: n) I7 a
' Z6 x) m+ i# b; ? mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
# U/ I! ^9 q- I- r3 k1 s while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
7 c1 Y% t0 x0 z* ^ mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; % l$ w: G: b+ ?+ A3 N( Q! u( S
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );. ]1 \, c$ T( A( V. A, F$ E& ]
! l* y( S4 s, P( R8 H8 k
CSR = 0x0000;. v& \* p! f2 @" R, G: n" m1 i/ `
INTC_INTMUX1 = 0x3d;" D0 K& p" K" _9 F
ISTP = (unsigned int)vectors;8 B. {. a$ C9 u! T
ICR = 0xFFF0;
0 c* r2 L! z# z8 r IER |= 0x12; ) n7 P8 }/ Q1 z2 q) ~6 V+ O6 Z# O
CSR |= 0x01;
4 ^& ] ^& P5 c# C3 b% u3 w! B
; A, b& Y! j% b. ?3 Q
+ o1 V. K+ F9 p# \2 G ?; w, ?, }4 l f7 m. g+ O8 n" j
还有就是两个输入输出函数:" }8 _( h$ I& W" P2 W
void output_sample(Int32 out_data)# {% J( r. [, I2 O
{4 q1 A) k2 Z6 P" q3 y: T
AIC31_data.uint = out_data; ; B' A% v& k. D9 w" l* y
MCASP1_XBUF5_32BIT = AIC31_data.uint;: g' t+ s( V4 ^* `" w" k* K
}
; X0 N% D$ J; S3 i+ b: j8 i5 f' O; _3 }0 C0 y* Z- _7 S- p$ h
Int32 input_sample(void)
" ]9 p* i3 ]' ~: f( e{ ) o; n1 X! y% _& l% n& O$ Z. K$ k
AIC31_data.uint = MCASP1_RBUF0_32BIT;
$ l. [# N0 G. ] return (AIC31_data.uint);9 y% \9 c! \) V* H/ P$ ~9 Y
}' e9 x0 T1 I( ?: E: e. h
9 ^( d0 y9 h8 ~) D- B |
|