嵌入式开发者社区

标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 [打印本页]

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
0 x( z& p5 s1 S6 L, V2 s- \main文件:
, ^3 J+ R$ G; x) B: cinterrupt void interrupt4(void)  
3 R2 Q/ V6 x1 Y+ s5 {9 S6 a{
. U6 M5 q8 l* j) U9 O  |% F  Uint32 sample;" ]. d2 p- X5 v- p% H# U8 ]; f

# M# v, t# @% p/ A  sample = input_sample(); // read L + R samples from ADC
0 B# B$ E! y- ?; T2 C% a  output_sample(sample);   // write L + R samples to DAC
% Z* l" I! b" ^, K8 Y% ^  return;
% H4 S8 s- N7 `: H! r4 j}
& B. {* H- G* P( b7 L0 |
# D) W% U/ J- x% |. s6 q. Q3 D/ Gint main( void )
) w$ h6 U8 X8 Q{) d2 P5 @9 H, A2 W: f

9 X. n% I1 U1 M    /* Initialize BSL */* R  }  R' a3 Z  l
    EVMC6747_init( );, W2 n5 ]! W( {# g; c
        /* Call evmc6747_intr function */
( H' w7 ^) [2 y& e) o9 w2 u" e0 I    aic3106_init( );
8 H3 Y, c( o: h        while(1);
- N& ]+ c6 _! D% m; W7 e5 Z: O}
2 ~* c( s% [) z: ~" v: U
' S% L6 _& J2 p! S1 F: }+ n2 @+ Q1 u6 i! C
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题+ y8 Y, p" f  K% F% T1 V  `
/* Initialize MCASP1 */* H: f& x! L- M+ u5 N+ t( K! F8 z
    mcasp = &MCASP_MODULE_1;' b9 d# W5 W; N( I
    mcasp->regs->GBLCTL  = 0;       // Reset
4 z1 x: E& _+ q; Y, ^7 X5 s    mcasp->regs->RGBLCTL = 0;       // Reset RX
% ~9 `# ]) W8 u0 Z    mcasp->regs->XGBLCTL = 0;       // Reset TX! i6 w/ `* G" @
    mcasp->regs->PWRDEMU = 1;       // Free-running
. a4 |: g9 n3 M   // configure McASP0 receive registers( Q( Q% O' O3 l/ [( u, O- L* ]
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used4 ^9 V5 b* S% g
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus1 ^2 @5 A% x- O  O- O& V
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word* V, v* h2 @5 k& u
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)7 P! N" g* q- |7 @' m6 ^# v8 E
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)/ U9 m& U* {6 Z& `  U/ O/ _/ p; ?! Z
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
+ Q  \+ C7 h! `0 E- a5 L: u    mcasp->regs->RINTCTL    = 0x00000000; // Not used6 y* V& P. e/ n  D" ]! Z
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256) F5 S5 k$ `; W4 I7 |3 V- _' `) `/ C

) A' y" f7 ^1 Y. V4 a- R    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
; G2 J4 n9 G( K5 ?( b    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus7 y2 Q: a) X, ~
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word! t* Y  z7 U/ e5 e( o. x2 P
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
3 p) J/ c( Q7 Q( Y) l    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK; j& P& ^2 d/ z; f
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1. L" q% L0 N; ?1 x
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit7 c0 F' r& A$ j. v, [# x1 x6 G
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ s7 c9 }, q# _/ ?) F6 ?
9 A8 f) F( n% b; Q) X- ~" l4 L' g  e    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN2 \1 ]5 l7 H4 W: [
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
6 _' L- O& _9 ^    mcasp->regs->PFUNC      = 0;          // All MCASPs$ J3 E6 S7 W% {+ j+ n* U
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX15 ^" C/ \1 z& {4 u% ?6 }& x

4 y# A; G6 o7 l3 `/ F    mcasp->regs->DITCTL     = 0x00000000; // Not used
' E: @, U1 V1 Z4 p    mcasp->regs->DLBCTL     = 0x00000000; // Not used$ a9 L# ?9 `( Q# O. v. T! T
    mcasp->regs->AMUTE      = 0x00000000; // Not used
0 z- }" ~+ c0 c: U, a  R3 P8 E1 I$ C9 H/ B$ G! j7 X9 _
/* Starting sections of the McASP*/* k7 m" i7 Y. J
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; / ?% |; T7 Z4 J6 s4 S9 X8 z
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  9 ~; H/ P6 O+ r. `: ?% H& O
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
* I0 t+ S) }. Y    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
' x1 M' Z) t6 A
- e+ J( H; _) F  z6 k8 Q$ s0 w6 R    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
% A2 C+ }! B" I+ r# q- Q2 p    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
( r) d7 B) G9 q6 f    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
8 m( J" D% O! j2 ^    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
3 V& [' y* D+ {  y7 }& v6 n( |9 g6 f1 n" H/ T1 C- J0 X9 D
    mcasp->regs->XSTAT = 0x0000ffff;
/ n- X. ~" S# O    mcasp->regs->RSTAT = 0x0000ffff;
( @3 l. _: ^' \6 {" ^) G) W2 i! q. V/ i' w
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;2 T. P8 ]% r1 |# Z
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );* b, U) S3 ]% v8 Q1 L- s' k
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
2 c0 s+ O" u. P/ c7 b    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );0 z4 s: Z# o0 s( c1 X
- C8 l& Y6 C) A1 a
    /* Write a 0, so that no underrun occurs after releasing the state machine */
& @2 {& [7 F$ q$ A/ k) m    mcasp->regs->XBUF5 = 0;3 U" _# p' O" B
    mcasp->regs->RBUF0 = 0;* G& d3 A. e3 v6 ?( X( r2 L
# s# a8 ^; n, s' }# y3 ], q9 V, _* {5 m
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
1 {0 G* u  m) ]    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
1 S8 z& H$ G- ?! }  k    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; , N0 p8 E2 o# }
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );. x0 k$ l- M% q. n7 Y; c
; r) t4 C) Y$ Y
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 2 [8 I3 d3 e$ j9 x
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );& k4 B) b8 r( S! s
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 8 L  a8 e0 D- @  P' o( h
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
# ]% `8 U$ s) H& P6 l9 [$ b! c! b$ L8 x" K
    CSR = 0x0000;
! S. b* l8 u& q" Q4 E  y, d" m    INTC_INTMUX1 = 0x3d;4 j6 ^$ d: x6 m1 a; M
    ISTP = (unsigned int)vectors;& |- {' V5 t/ m7 w5 I2 ~% c
    ICR = 0xFFF0;  " h! t. K5 G6 c. j5 [+ o; c3 h
    IER |= 0x12;  
* k, @6 ^0 _# @& [" z    CSR |= 0x01;  
" ~, |5 a3 ^( y$ u) z2 j, X% }
3 ?# Q8 T8 R7 n7 n+ E
$ f. d6 ?6 \% N' Y4 D. V+ z. p+ \6 y6 x7 z! i4 }9 L
还有就是两个输入输出函数:: j& m  _3 ]0 `0 L5 n$ Q
void output_sample(Int32 out_data)0 z/ y6 J- O" B
{
/ }5 ?$ _% c' n5 H  AIC31_data.uint = out_data;  
2 q. V; [* ?4 s* X% c' A  MCASP1_XBUF5_32BIT = AIC31_data.uint;
- B8 D0 X3 ^' Z7 r: B& W2 C}
# ?5 s2 M2 K0 _: F* ]
8 u; d7 c9 i0 I# I# cInt32 input_sample(void)
; b4 d( O9 e& o2 v8 p5 F  ~: g( ]1 |{  
) h& ^' D; Z. o- e( e$ @* a1 o  AIC31_data.uint = MCASP1_RBUF0_32BIT;3 L9 `' N% _- [& I/ V
  return (AIC31_data.uint);
* f8 U3 L! @7 l3 C  A+ G}
4 B) f+ ~. n0 U; J5 ^
" x5 z3 h* z! F% I+ \& H6 a  X
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4