标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 [打印本页] 作者: yusijiangchengm 时间: 2016-3-15 16:07 标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序: $ W' ^0 u3 b- _# H+ A* d ^) T. imain文件: , [9 P6 ?3 ?) y8 Hinterrupt void interrupt4(void) 4 u0 c: @( I" F' M* V
{ 2 `0 B/ s1 |6 N* d5 K. C; c8 | Uint32 sample;1 l5 @* b* T; S8 q, u; |
5 S" m7 C g8 Q, S; o% w) s
sample = input_sample(); // read L + R samples from ADC+ c. o; X- M7 _/ S5 c7 w
output_sample(sample); // write L + R samples to DAC . j( k5 `' H' ]% B
return; ' h/ [7 f+ A( i- f; N} : D$ l3 i$ v+ Z, U3 z; C M0 P % q& n& ?+ C: h+ U. e* Iint main( void )- C7 X5 k- z4 W5 Q( m \, M0 A2 F
{2 o0 M) N# `7 J0 V2 K* H0 |
! y( {) ~" E3 a C, w& ]- X, ~
/* Initialize BSL */ , j* w9 s$ E; ?6 _ EVMC6747_init( );# V2 p0 L+ r0 n
/* Call evmc6747_intr function */; P. ]- ~* l" ~$ ?7 m! k
aic3106_init( ); 6 E3 Z5 _! C# l7 I2 E% O2 X1 ~5 s while(1); " A0 T- `( Z0 q; v}0 h7 |4 t# g% R
0 Y% J+ |4 Q7 n3 e$ i ]' I4 K- |
5 B+ h# e. D5 H+ h" ^7 P+ Z
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题 & R2 n! g4 B; G/* Initialize MCASP1 */ ) ~: ~* Y$ L* [$ e2 X" v0 y mcasp = &MCASP_MODULE_1;' k( _/ W7 H" h' f# H) u
mcasp->regs->GBLCTL = 0; // Reset6 E8 q( x- b- U( }# e* `: [8 P% s
mcasp->regs->RGBLCTL = 0; // Reset RX % W5 b! D2 y* s/ c0 h) G N mcasp->regs->XGBLCTL = 0; // Reset TX . F& A' K, n, w6 C$ s mcasp->regs->PWRDEMU = 1; // Free-running * E: u% E& S8 O, l' G. y // configure McASP0 receive registers O. p+ L: @5 Q! `- W
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used ! J& O9 _" v! I$ K4 F* N o mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus4 |% Z: ?; E. E& i
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word2 E( d* N8 s# l3 o) T
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side) & D0 f7 @5 \! d/ [ mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side) w7 Q$ f! e7 A5 r mcasp->regs->RTDM = 0x00000003; // Slots 0,1, K+ |* q3 a$ r# H7 H
mcasp->regs->RINTCTL = 0x00000000; // Not used 1 r! L- h8 S& v5 r% F% ~ mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 : Q7 i; A9 [) R" T9 o 3 R1 V/ A8 E9 b' v5 r# ~+ {& C7 ?5 [ mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used # W& j% _/ O: @9 [; j" w5 O mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus0 \% B, s( P* K! r
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word 6 h7 B' p: q4 {' Y* d: z; Z mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16% t v! g/ h$ R
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK' x2 _7 ?0 s& f1 U
mcasp->regs->XTDM = 0x00000003; // Slots 0,1! O" s) ]) `- R8 t3 V7 K5 P3 k
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit c; J! }% f1 z1 _ x7 Y8 T
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256! n( R+ `( \' V
9 j7 u9 h* u5 i; G mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN% ?& s; D- M2 ]% i# |9 c2 G
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT1 U. r; S" Y3 c3 ~ V0 H% z- f
mcasp->regs->PFUNC = 0; // All MCASPs. h z# O4 Z6 }- @5 j6 z
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1; }- \3 C7 e. Y% T T9 i# A: U
# e i8 e/ X% a. \# `/ x% E0 l; ?9 }( J mcasp->regs->DITCTL = 0x00000000; // Not used # t. p2 J5 C; ]0 N5 M$ j mcasp->regs->DLBCTL = 0x00000000; // Not used , X' \) U, w( Q! i. ^8 H1 H4 I mcasp->regs->AMUTE = 0x00000000; // Not used+ O4 s& b+ I. R9 M; z' w# t9 a
+ y. N2 B: z2 z: K- u, o8 ^/* Starting sections of the McASP*/6 U( Y0 Q6 b" t7 b: f+ D
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; . l0 P- b1 j2 g( Q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); . S3 v& G/ G, v0 N& u" G
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; + t- m9 V' o2 I1 r while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON ); 6 F1 _% t1 o0 C1 w. I w( `4 G0 A( M
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 4 z) n! G! a( k% _ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON ); 5 t% K! `, t% j" T) G# E mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; # u& V& n8 c7 c0 }( `9 R, K! \
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );/ a1 ~. G( ]" r5 y8 {/ R: e
' H6 h( ^$ L/ ~ mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;. h8 O" O$ z3 X% `; T4 a
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );* V% A5 i8 V* C5 @! |% L+ J% L
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; $ P( B/ q% k& I while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );' s$ N, P+ C* W ^7 O# O) l- g- a
+ A. r5 ^+ q" D) Z7 C /* Write a 0, so that no underrun occurs after releasing the state machine */1 {& V. H! f6 \5 m* g
mcasp->regs->XBUF5 = 0; 4 a5 G* b, h( J9 Y9 ]& G8 z mcasp->regs->RBUF0 = 0;+ K R0 S5 j# ?. j7 b- O) N
/ u( n8 K7 z: z+ ]8 a, d+ Q" z! ? mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 5 X t0 X0 h8 F! E/ U q& f
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON ); ( ^! Z2 @2 G- o1 i mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 7 S8 c* M+ _+ p! z# N% k while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );( \6 Q7 O* F) w C
$ o' S0 l0 i9 {6 k* ]4 e2 O
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; & l7 {% h& v8 S0 D" k
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );: R/ o$ c9 v4 y8 c
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 0 t! i' f) H6 R) Y* Y. q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON ); 7 r# b1 M; s8 Y; p8 _ " f2 z# B }1 L3 K6 q& F CSR = 0x0000; / |8 @! d' s2 a" g, W INTC_INTMUX1 = 0x3d; / Z7 P+ m: X2 w/ z2 \, i0 X$ n1 D$ L ISTP = (unsigned int)vectors;! D" {7 f# M& ]0 Q% r
ICR = 0xFFF0; 4 J- P5 q- [% y% }, D9 s IER |= 0x12; - Y8 Z+ h9 q* D. I CSR |= 0x01; - F# t* P8 w% w, @' A* @
" C: O2 n4 {* a / w5 h$ ]: R0 l- w- r3 Y( {, ~/ ^! E
还有就是两个输入输出函数:7 T& k a' K1 W# B- e
void output_sample(Int32 out_data) $ ~4 x- ]7 V5 h1 R9 M{; P. c5 G# a3 e2 [) H
AIC31_data.uint = out_data; ! K2 G6 \" k7 y. h6 i3 f MCASP1_XBUF5_32BIT = AIC31_data.uint;; T7 y/ P% p$ u9 e5 m9 l" t2 X( w6 @ ~
} 8 P+ I: R8 _8 u. I1 }+ T2 i: B7 x0 m4 p% s) A; A0 e3 E
Int32 input_sample(void): }2 C* K* {# a
{ . F4 ?) i. [0 c AIC31_data.uint = MCASP1_RBUF0_32BIT;$ E: @0 C/ o# r2 L
return (AIC31_data.uint); - `% ~( Z' I# B0 x5 k r$ Y}# U, t" `: E# z$ w0 Q
7 _$ ~' s: t& H' `( q; `5 t5 R作者: human 时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)