|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
1 k$ L3 T( ?5 [) bmain文件:4 W! b& Y: o# u
interrupt void interrupt4(void)
* T4 _- o- B" s/ u1 I/ \, \{
) n; @. C" ?* o; K5 a Uint32 sample;
* X3 ?0 W% ~/ T& u* Q- ^' J5 l1 M
/ k r, P3 d7 _ sample = input_sample(); // read L + R samples from ADC
+ C" C" I! l7 N output_sample(sample); // write L + R samples to DAC
( a% n% @ X: E% _. Y5 ~$ u return;+ m7 g: p) D1 @. ~# g
}; ]% q7 h2 Q( ` W* ~/ |# m
% g/ ]6 A+ n4 L0 E+ G
int main( void )& R% Q& o* u3 R
{
; W. h5 Q2 s, b3 g ? S8 M& k _: H! o. ^4 k0 a
/* Initialize BSL */
, X: Q. N) n( \8 i+ ]0 O+ S s EVMC6747_init( );$ x* D( J F, c! P& a' i; y
/* Call evmc6747_intr function */' E6 w4 v. d& v g; Z$ N. o
aic3106_init( );2 K& a$ u& b5 N( U K
while(1);
+ J r, O' x' ]2 v: n+ \}4 V- B2 I7 X* Y; }
- h: y) n0 R {6 f# G" N5 ^
& k5 w. I1 ^( d
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
& ]* i! S8 U0 Z! q3 L/* Initialize MCASP1 */7 s& [. F8 f$ v& _) c! U) m
mcasp = &MCASP_MODULE_1;# {& o5 O- B+ |! b
mcasp->regs->GBLCTL = 0; // Reset$ c9 l8 F* M, M3 D
mcasp->regs->RGBLCTL = 0; // Reset RX: W2 n* ], F- l7 ^3 x
mcasp->regs->XGBLCTL = 0; // Reset TX
: S. R7 X; I, _+ L& i0 F mcasp->regs->PWRDEMU = 1; // Free-running
. f' o G% N7 @8 R, ?) f9 A // configure McASP0 receive registers
h! q) C/ P5 n( s) M: K mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used: ~( _+ T, V/ B' [( e. U/ _8 f% p
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus+ {- j6 r3 c4 J, Z; { N* ?
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word1 `' f2 F8 R h- d/ v1 N
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
* u8 `) b" I, B+ @ mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side). [. o" k! R( U! U0 J; g
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
9 L$ r# U9 l# u p mcasp->regs->RINTCTL = 0x00000000; // Not used
, e0 I/ r* S3 _ mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
0 J9 I+ P' h W1 J; _6 y T
/ y( d/ ?2 C' S& f- B mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
" l1 M! ~! M2 ?5 c) O3 e mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus" G# s: K. U' E4 V% A7 X
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
8 Z) i; T/ ~; x7 ]/ s" Q mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
7 j2 R# `: ]( V& K" q$ ] mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK7 M# A; P% Z& L6 [+ [: q; M+ @! k
mcasp->regs->XTDM = 0x00000003; // Slots 0,1& `6 M @: d! H2 d: A
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit& Y8 j0 F2 U+ N4 u, Q
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256/ n% B+ G/ R, ]' n& y/ X# i
5 V. f, W. r7 P) x7 e1 _ mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
* |( x$ o% X; p5 e$ I% @. y mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
" `0 V, E. [& H mcasp->regs->PFUNC = 0; // All MCASPs
- ]9 s& {! ~, d, ^5 x% Z: w' e mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1/ ` t. Q' K8 c5 ^+ F4 N
) @, E, t) ~5 p, j7 ]; P
mcasp->regs->DITCTL = 0x00000000; // Not used
( j4 K' M- H. a2 s- k2 B' x: \ mcasp->regs->DLBCTL = 0x00000000; // Not used
; C- H8 b$ I' r0 ~& H mcasp->regs->AMUTE = 0x00000000; // Not used) u2 A* \5 e: h$ i
1 P5 A3 U0 X2 C9 U6 Z u" H5 M
/* Starting sections of the McASP*/
+ J6 U3 M' F8 t5 O# A# a! M mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ( N, P6 Y$ t' f, b9 I. u
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
4 k: Q4 h; _" Q8 D' \- L) ] mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
- P: n6 y* _+ @3 S' f0 j while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
0 r% } G* B6 b3 }- g
: s5 U$ O- s3 K) P/ B. t4 @, N- u mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
0 J/ y" K5 H8 P1 o: I$ l0 j while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );& i m7 F! L! H& ]/ j# {, N
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; & e( K1 n! {8 y, f7 Q1 N
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );- z/ U" f, h2 ]6 S
V8 R% F& }# z' ?' D1 M ]( ~% R
mcasp->regs->XSTAT = 0x0000ffff;
$ o, H# W5 D4 [/ z3 k mcasp->regs->RSTAT = 0x0000ffff; ( {" B% n2 T( F2 U b0 S' r9 m
; Z7 h7 N8 i$ P& K+ |6 ~7 g' w mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;( e) j! H- n" I- A) F9 s
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
& H- W. v" m8 Z) C( U. v mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
7 C9 S8 ?1 v/ |6 n8 x, [3 A% T while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
$ I$ H( _, i# b- ], S7 p+ i# Y6 ^" ]/ Y, t, `
/* Write a 0, so that no underrun occurs after releasing the state machine */& L) O$ s$ g+ s1 m, @# B
mcasp->regs->XBUF5 = 0;- Z+ y. ^$ z$ ?" @
mcasp->regs->RBUF0 = 0;) h; Z# k- A5 F( K( \. c
( d2 Z; @" @6 I mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 3 N+ O7 @; l; d
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );9 l0 }% }; {$ t, F$ l/ {! ^, N
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
! U8 o" X& d3 @2 Q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
- O% h7 R$ O9 i# c3 J2 k8 k0 E& d7 g- r4 k
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
+ n1 Y$ a9 T* I, q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );% S% ?: }0 t( E0 E* _8 z
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
4 U3 l0 K5 {7 S6 J2 ^ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
! k) z8 B+ U6 O: Z! o$ ?+ m: U. F! I3 ~1 j
CSR = 0x0000;
& Z6 l d! r3 m) z8 I INTC_INTMUX1 = 0x3d;
2 o0 m# `3 V9 c/ h; W ISTP = (unsigned int)vectors;
2 i$ b/ @$ j3 Z. ^* y) t8 ~- P ICR = 0xFFF0;
- m. L1 m& Y" ?2 W( ~ IER |= 0x12; 6 w" F5 R8 s" ?: \
CSR |= 0x01; ! Y: A3 N$ D+ ?1 y, U
$ w! @! R0 M$ c- G& `
/ b7 V6 v! R, F% r
- Y& z" i$ S2 l0 R1 J! t4 q8 t还有就是两个输入输出函数:
. L* d! [( O+ J0 jvoid output_sample(Int32 out_data)! O- H% Z1 O# L% a5 H+ T
{# Z# X4 N$ t; [: d
AIC31_data.uint = out_data; ; |4 {, o8 C, ^. K7 w* x
MCASP1_XBUF5_32BIT = AIC31_data.uint;
/ Z' J, g0 s* {( Z( _8 H}1 I+ N7 c5 ^5 }
; C" I! U8 [# h& g# @2 m2 KInt32 input_sample(void)
4 I* q6 m! F) F2 {{ ' F9 d2 O3 H, m# h6 a4 ^& W+ j$ O( }
AIC31_data.uint = MCASP1_RBUF0_32BIT;
/ A% a$ R5 |1 l G return (AIC31_data.uint);
. E% i n; v* H0 B/ S}5 y5 K* a% w7 T$ P6 ^# G+ Y( L
8 I$ e- o+ C+ Y& ~+ |0 E |
|