|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
4 }* k: Z# J+ w' x0 {" S) T2 M; ?0 umain文件:
. m/ N/ b0 R5 Q$ s+ z, v2 f$ Minterrupt void interrupt4(void)
2 j$ |' C* Z- N{' q+ N* d1 J# `7 g) I: D5 N
Uint32 sample;
1 V% M2 @, |/ H# Q- Q; c9 l* r8 d+ i0 h1 O7 W2 m
sample = input_sample(); // read L + R samples from ADC# o+ j# {( ]$ ?; O$ T- [/ o
output_sample(sample); // write L + R samples to DAC 6 Z" T( ^: A7 _8 Z7 M2 e
return;
8 r# [1 d$ u* }8 K* u- P# |}6 u+ Z+ u: X, Z
" q9 u6 A! N( s$ h! X7 X' W5 [
int main( void )
2 Z# `& Y& [4 y7 y2 `, g1 ?" \{
% E5 w( Y4 ^% h0 n2 m; }: F. H) t
# `( e6 h+ v& d) h# b2 J /* Initialize BSL */' z1 R* I; L _& g! ]
EVMC6747_init( );
# ~: R+ `$ J E3 k0 D* z7 K& p /* Call evmc6747_intr function */+ q3 F" J, S8 H" B
aic3106_init( );* s! {5 A* y" y' k. P
while(1);
2 r, @( y0 G M3 t9 y}6 K, r! u- I" B( [: C
0 C) a) b! ^ A- o2 h
, E3 `( \0 G) _- v. _+ @
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题0 P, `: D6 f9 m8 V% \* n# l" z
/* Initialize MCASP1 */) j v* X$ }$ z9 U
mcasp = &MCASP_MODULE_1;
# b! c, V+ }! x- R% p mcasp->regs->GBLCTL = 0; // Reset" ?2 k) b' ]% e) t
mcasp->regs->RGBLCTL = 0; // Reset RX
; n$ g/ N: `* i. i mcasp->regs->XGBLCTL = 0; // Reset TX1 A) F% L! l+ I3 R; d' v" a1 d( c
mcasp->regs->PWRDEMU = 1; // Free-running
- |3 t. H9 D5 F, K7 s# M) A _& P // configure McASP0 receive registers1 j3 R3 B, T) Z4 P5 [
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used& y- m; z9 y; M- B4 j
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus. r) k5 c! |$ h0 ~$ X# f, s9 z7 z
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
4 p! u8 G# c2 W4 N, ] mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)! m3 X1 D( x8 w
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side); T; a1 _1 ~/ x1 b( f0 p- K, u
mcasp->regs->RTDM = 0x00000003; // Slots 0,1! ^4 E' p( V9 G8 X8 y; x
mcasp->regs->RINTCTL = 0x00000000; // Not used
8 [! [4 B( o$ n; Q; h& M5 K mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
3 u2 w0 C, C2 e5 @7 [5 r! q P
- R6 {0 W0 s) K6 B4 ^7 d mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used( F. Q- S# p8 ~
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
9 E( b# J. L( D& x9 b2 Q5 i mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word7 |4 W' }* z2 b' D' Z% l$ F9 J
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-166 u* u1 e( Z* L; L: f5 j
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
0 e4 M* e& t4 ]1 | \! A; y! I0 l! b mcasp->regs->XTDM = 0x00000003; // Slots 0,1* ]) N8 B3 s7 Y. @/ |' Q6 o& |: Y% F
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
4 n2 j$ n, V0 o b& g mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256% \0 h, d/ J" ]7 G
; }3 g! ~3 Y6 I
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN8 ~8 Q! [7 o" B8 s6 b& D
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT, l, F/ e8 E4 i3 `# `7 D
mcasp->regs->PFUNC = 0; // All MCASPs
& E6 z+ l9 l' n5 W% K mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
1 O+ ^5 `3 p, ~. a# h6 n. [! R) v5 c* J, K9 ~
mcasp->regs->DITCTL = 0x00000000; // Not used
* ~% a% j7 Y3 x6 T# ^) O mcasp->regs->DLBCTL = 0x00000000; // Not used7 T/ B7 ?1 J0 @; q! {5 n5 |8 d
mcasp->regs->AMUTE = 0x00000000; // Not used
0 @3 M5 ^8 F' o* z4 I' f
( q$ l1 [7 ]) R# ?* ]6 g4 f/* Starting sections of the McASP*/
. d4 F' b2 Z. X mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
# O' L% D! N x1 A while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
( q% L R* ^" W# P6 X3 P3 Y, c mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ) J) w+ c: s+ ]1 }
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
9 }7 {. S7 m# l8 ~) X1 C1 {2 ^# l x$ i
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
- ]. m3 A @4 h) n, i while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
4 X" C9 b* q+ p mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
1 R2 l# g5 w/ B% l; E6 \+ D while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
: x, Q% Z) F" p! @# }; q( k2 d, F
mcasp->regs->XSTAT = 0x0000ffff; - c" T; r5 A6 S
mcasp->regs->RSTAT = 0x0000ffff;
0 W0 [9 }% }/ ?. G! t2 W) n$ x5 O: \' \
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;5 I' _, D1 d8 I b! g8 r2 o1 }/ L
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );4 w4 G6 i& a5 |. P' _! z2 t
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ( f, L, R7 e* u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );1 Z. {- v9 w6 P. @
. K. r% _( @+ f. n5 H, |0 ]& O /* Write a 0, so that no underrun occurs after releasing the state machine */
8 W' k) j7 m1 X4 Z% _ mcasp->regs->XBUF5 = 0;( X# e/ s4 m$ G3 M, G3 {
mcasp->regs->RBUF0 = 0;
3 F j+ J9 w- T( ^$ R- i, a4 ^
; P# }0 K8 Q) e3 `3 }) D) g! r mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; + u2 z3 i* D+ L* v7 S5 Y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
1 N8 L7 `* Z2 X% l' g mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
" n6 n. g- @/ W+ ~5 _" K7 l+ e while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );6 U# ?/ [' @, C. R
- t1 J, L$ {2 S5 @" R mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
" q- @4 r9 ]! j' l3 A while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );1 a* ~) W4 @; A# q4 C
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; / y2 w1 @( U# F" G& O# E7 y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );! o4 J" u6 D* r8 D: K7 ?
0 p. |# I: k: |. i; y CSR = 0x0000;' w' e( g% N- c7 W. \5 z d
INTC_INTMUX1 = 0x3d;
0 B7 q: Q, s. l8 E9 d5 ? ISTP = (unsigned int)vectors;
$ c0 ]! C6 q _/ t* o* V& u% _ ICR = 0xFFF0; " k8 g( ?. L: M0 m6 `/ |8 @( |5 H
IER |= 0x12;
! u8 \: D$ x4 a# ^1 H I0 G CSR |= 0x01;
. T" M. Y/ ^1 X* a9 {' \/ d5 W" S: g5 ?8 Y
% Z1 y: T) O' G% D9 Y
/ I: T8 l4 e$ o& P" G还有就是两个输入输出函数:
$ U7 b1 s, i- I' p9 O k9 X& evoid output_sample(Int32 out_data) J5 V: _0 p. T: v, c
{
: p6 v& ~$ e7 Q( E, Q8 U AIC31_data.uint = out_data; ' Q: A. A1 s* P6 L7 @" L5 l
MCASP1_XBUF5_32BIT = AIC31_data.uint;
2 V; u1 R* k8 z+ L4 j}( W7 x9 K6 u0 A g- v, f9 x
; r" x) v y+ o" U
Int32 input_sample(void)
* C4 W$ X0 |, m7 E{ 2 O( K$ j+ O I) V3 w3 r- D' z
AIC31_data.uint = MCASP1_RBUF0_32BIT;3 k+ O' I+ k' _* @ W1 O: u* I
return (AIC31_data.uint);
& ^: X- N6 e9 O$ F/ {7 }2 C* t4 ^0 C}
9 W- F, n* Q+ u/ n2 c: l* ~( K- }% B
|
|