嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:$ H4 N7 a8 ?: y9 \' a& M
main文件:
) O! y7 P9 W/ M! h0 `interrupt void interrupt4(void)  
. \% \1 l9 A9 ?" @0 O/ f{( ?; H. j& m- o! _' G$ l
  Uint32 sample;1 L2 y# l% `: b, z* \: ^+ F
9 C1 P* t% |9 _/ r0 B! x. d2 h  M
  sample = input_sample(); // read L + R samples from ADC
# b* o& d8 U+ p3 V- L6 J$ V9 I  output_sample(sample);   // write L + R samples to DAC & {+ u% \- I3 I: ^
  return;
' g) i4 P7 r: `$ r}7 I; b- S7 u0 g3 l
( U" E0 S- M. Q. o% g
int main( void )
0 S7 x3 s# u4 A* h- z  a% S{
; E* d$ H# b9 a" B3 r1 @  w4 D1 F; c# `( P3 Z4 j- V0 ^: u
    /* Initialize BSL */2 i: R+ ^( R1 Q- \, `6 x
    EVMC6747_init( );2 d1 V7 t4 ?5 {- P+ Q) E
        /* Call evmc6747_intr function */
' N3 u$ [3 {. E: A7 b/ {    aic3106_init( );
' q4 n( F3 ~, s& m5 I" ]( N% B. w        while(1);7 X3 `, d- |& O) Y2 {
}5 k1 A" t0 o' Q9 i2 T3 D) e
3 x. a/ S$ M$ E4 h# T/ l
) `$ L, d1 f! h4 u
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
0 c9 d: c+ D8 o$ u/* Initialize MCASP1 */$ ]* m2 w1 y0 n9 @
    mcasp = &MCASP_MODULE_1;/ B0 y1 X6 \$ e- k' N/ K% O. p
    mcasp->regs->GBLCTL  = 0;       // Reset& f1 g+ u( L5 g1 A: {
    mcasp->regs->RGBLCTL = 0;       // Reset RX
( Q# j! |+ O' i" F, ~' ~    mcasp->regs->XGBLCTL = 0;       // Reset TX5 t' T. B+ k  I* e7 q! z1 a( z1 t
    mcasp->regs->PWRDEMU = 1;       // Free-running9 H7 _0 t  ~: B5 V
   // configure McASP0 receive registers  a  R' _3 v4 \
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
$ v0 M& |( h) H2 w    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
  y. n* ?8 t- F) G1 z* \' l    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word, b; i1 _' G4 k6 L* L0 Y3 K  o
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
# i: S# Y# f6 [    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)8 K& X& v, Y& j  I0 L# ?' u
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
, z- i+ t8 _0 ]7 F0 q( H    mcasp->regs->RINTCTL    = 0x00000000; // Not used8 Q4 X7 E  |0 v0 j+ q
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: N, i0 {/ T9 ?+ Q2 n* G( S, a- B! G8 S
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used$ c3 \9 C6 S4 w8 c) K
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus: Q$ j! j% B4 p) A+ F
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word8 [  g/ P8 \, N+ t, ^# F! U" m$ t
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-163 I1 g  V' v) x* Z7 C
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
' x4 {! _6 u/ h+ g4 y2 }# f- r    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1: ^9 g$ G' }! |3 s6 H! C1 n" k4 e
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
) J9 `& K' V' i, O) f+ Z; y    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256- g* W0 p& P( d& b, l9 U1 v

+ F0 N9 R- K0 @3 I8 k, ?' }1 B    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
6 H: u& J1 }, E' ]  P9 X' K- _    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT, i6 d/ \% J1 T, V
    mcasp->regs->PFUNC      = 0;          // All MCASPs
1 t0 a' z: z  G( a    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1% o' E7 ?( y) E( I/ M$ n* f
; U4 l* }' W- C) J2 l
    mcasp->regs->DITCTL     = 0x00000000; // Not used; X4 q; Y) d9 |. |: ?! I2 `/ m
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
& L) _9 T1 `; _6 F" @* [    mcasp->regs->AMUTE      = 0x00000000; // Not used$ j5 J8 p4 Z3 g  P" s, j! K, t

# P) Z7 [5 z7 F3 \4 g/* Starting sections of the McASP*/' ]8 u' U: d5 u
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; , M4 }/ Z$ j: X% w7 J
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  9 C! F- t; F8 f
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
1 `( O" J: l! `, U  B3 o! r- R8 ]# {( C    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );/ g2 Q& i/ u- I8 d
/ l$ |, d, d2 C. h5 s; b% |
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 4 {% p  F! Z3 ~) ^: Z" G: r* C  L
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
$ ]/ o; n% \- z    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; # j, @* @/ U' S; g; S
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
) V4 s0 e) ~: t( z
1 R1 q1 u1 X  S; m    mcasp->regs->XSTAT = 0x0000ffff;
6 Q) x4 k* `1 \% C    mcasp->regs->RSTAT = 0x0000ffff;   q% U- v- r- w% N: Y  C1 M2 g3 g
8 \3 s+ D, F2 e( R
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;1 X% i: W6 i" l) z
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
& K' ]$ y( k; O* s8 E# x    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; : p& e5 A* e) p$ q
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
& w9 O0 E6 p  b/ \" S; Y- J5 O- t& M+ F: ]- [) q
    /* Write a 0, so that no underrun occurs after releasing the state machine */# W: F8 C( w! _* o% O% U9 ~
    mcasp->regs->XBUF5 = 0;
6 Y* w4 W3 e- |! V    mcasp->regs->RBUF0 = 0;0 p, {# g7 H5 h# |; O$ r5 Q  I
  {' ~& C& u) t5 a& O& X
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; , h  o" R: L9 z. m
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
' l- d6 m; y( V( h4 ?. V: _    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
2 x- G" N/ m, Z, ^    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );. y3 q) ?$ G7 i; N
' A" h  b4 q4 Y, d
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; . J& ^% q0 \8 d
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );% v9 p" i3 Y. S. ?4 @- w$ X+ M1 C
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
9 C& q$ Y: g, t  d7 j3 t  }    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );2 @8 j; h' i  |+ t$ |$ \
8 v2 A" g! r/ @& P6 `
    CSR = 0x0000;9 C1 |  r  b/ g
    INTC_INTMUX1 = 0x3d;; f- E# ?- }: K' e0 P& k$ w+ v; n# q. k
    ISTP = (unsigned int)vectors;/ t+ R7 y* U% B9 x1 b  r' M% v8 f
    ICR = 0xFFF0;  
( s! x# ^% d) G/ W    IER |= 0x12;  
- j. B6 u# M+ u# c" M$ d" y    CSR |= 0x01;  + v# z& a9 n; {1 F3 T1 B  A  N

0 M' p( o% t& m/ \) E9 I! {. p: S6 r& _
) M8 W! t1 B- }- a& A* ~
还有就是两个输入输出函数:
/ }9 l8 X0 p! o6 p1 g% `void output_sample(Int32 out_data)
4 n/ l5 Z* `  z1 Z{
% D% P* f# {" g3 N# l! q2 ~* u8 c  AIC31_data.uint = out_data;  
& p7 A* C* z' N9 a1 v$ `' ^  MCASP1_XBUF5_32BIT = AIC31_data.uint;0 d* U1 V2 F- f# P
}
) B. M" }" E- v: _$ P/ I5 P
/ u# l4 o& b; n9 ~Int32 input_sample(void)( C5 Z# x) R$ _
{  
1 |% j: a$ j6 s# X  D' c  AIC31_data.uint = MCASP1_RBUF0_32BIT;9 m$ C/ o  S7 D4 U1 ?  a) @* U
  return (AIC31_data.uint);
6 A; M% A2 x2 `' z3 m( Q}% n" _: R2 u7 c$ R2 ]0 C) {8 W* c# f
7 ^, M* M) H$ X

作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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