嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
  C! ?! |. j2 }0 ]6 gmain文件:
  Q5 l- d8 w8 I" v$ W$ Iinterrupt void interrupt4(void)  1 Y  X' G* Z$ g- I6 ?: n
{
  ^$ A5 ]) @- o- G" `4 ]' }  Uint32 sample;6 i5 d0 I8 B. @" k1 \; x) }4 Y

$ C) c! j. i7 {' ~8 |+ K  sample = input_sample(); // read L + R samples from ADC
2 [( ^- i# M7 P( n  output_sample(sample);   // write L + R samples to DAC 3 p) W5 {$ A) _& _: {
  return;1 {5 v$ ~3 m+ f0 e0 s$ B% c! w
}  W4 R7 K  ]$ Z. x& q  s: d

  w: J4 {, {% G# D* @8 g* r9 sint main( void )
6 L) Y( B4 J, V* i{
% ?' Z6 j8 @0 b) D0 H5 O3 m
/ }4 _6 q2 B% A: Z& z4 H    /* Initialize BSL */
2 ^6 \+ M) Q& d2 A+ ~    EVMC6747_init( );
9 y8 R6 A( n$ V' m        /* Call evmc6747_intr function */
9 `" `& A6 P2 |* N. Y  f    aic3106_init( );* S2 Q, Q6 r" g) g
        while(1);
# @- j$ T% p9 a+ ]! l( @% j8 n; U5 g}
) O% K( E3 a. u* l" j% r4 }* o/ S; I5 l6 d
8 _" t5 `$ ?: z1 J! f
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题" I, x" a0 X  L; R
/* Initialize MCASP1 */0 R* H7 ^8 l1 }9 l2 D  {1 |
    mcasp = &MCASP_MODULE_1;$ k7 t+ _; J  H; w  V
    mcasp->regs->GBLCTL  = 0;       // Reset% Z& r  b/ [  y
    mcasp->regs->RGBLCTL = 0;       // Reset RX
. A0 i2 _* k+ G& v3 o    mcasp->regs->XGBLCTL = 0;       // Reset TX
( J  X+ ~  y5 m    mcasp->regs->PWRDEMU = 1;       // Free-running' F! L6 o6 ], c1 L
   // configure McASP0 receive registers" x, J) t. y' ?0 }# n3 b
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
0 H- \  J: p/ E! S$ T- g    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus/ P9 f. {2 O" g" p9 E" k
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word3 ]  [+ Y8 ]. w; T0 G2 P
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)6 @4 x' B0 W: M/ O8 g2 v! D
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
$ w& H3 c2 i" R- `  x    mcasp->regs->RTDM       = 0x00000003; // Slots 0,17 y6 d- O( g6 h# V0 p  _
    mcasp->regs->RINTCTL    = 0x00000000; // Not used8 \8 S6 p1 B+ f* s
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256) e0 n& m# n" q) p

+ Q4 ]+ }* g- y1 l    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
% }2 k3 {: |0 J4 G9 q( w. v6 a: h6 W5 K    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus# n% o, }6 W, g6 M% ?
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word- s% ?0 [2 t& p9 Q' Y: |
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16. v+ O! j8 D& @; K2 [5 ^
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK( _1 k5 q3 e- G" d' x7 ^. Z3 U( y
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
; y  o0 Q% v5 v; F& `5 t    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit# C2 C. ?" E+ C" I6 w
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 v6 _. K" `5 b+ o: N1 N
4 `( @6 }9 {9 |$ _0 Y. C* p    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN. \3 L7 r( \% ~/ S6 J7 b* K
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT, I# F- j+ `  T- |# c& _! K. F
    mcasp->regs->PFUNC      = 0;          // All MCASPs: y+ W- X+ @* \* e& z
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1( {2 l; m; k3 Y* Q
6 Q: L, y; K( }$ O$ _
    mcasp->regs->DITCTL     = 0x00000000; // Not used
; @' E6 u& h. ~4 h    mcasp->regs->DLBCTL     = 0x00000000; // Not used
3 l0 h1 L/ c& q! X' t    mcasp->regs->AMUTE      = 0x00000000; // Not used! i! N+ z9 F5 F/ K' |

: n  Y9 X, d1 X$ i/* Starting sections of the McASP*/( e) E  ?9 X5 ?% ?
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 9 k/ P8 O" L- @: d" {
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
( O% H8 Y2 B9 j9 Q* E    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
7 y2 a- r) p" z. X    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );9 O% k; Q, D7 f& W( K4 h
- _! O! G5 p- F( H/ Q: R
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; # J& U4 n0 X8 l
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
% W' m0 h4 `: K; X    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
& G, i2 T, _5 q    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );% Z" X0 b$ @7 _

1 J# Y4 U, u4 S- K    mcasp->regs->XSTAT = 0x0000ffff; " k) ]- `9 v( _- K6 e/ k
    mcasp->regs->RSTAT = 0x0000ffff;
/ T3 X3 y( o8 L; z' e
9 |+ L# I1 |! n8 e5 H    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;9 p, E' V4 R1 s$ @
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
. e6 ]8 R* m" N# Q0 `' A    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
% S3 M  C. x- r5 o5 c' r  J    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );% ~' u% `9 C+ p& [& j% g  q1 d" h

+ d, B: {* H+ Z    /* Write a 0, so that no underrun occurs after releasing the state machine */4 m$ n; I1 ?- `
    mcasp->regs->XBUF5 = 0;
! X- m1 h) k  ^' x6 h! @. U4 ?5 H9 m    mcasp->regs->RBUF0 = 0;
" Z0 f2 r3 r! b5 o1 ^  q
* [. o  `: D" I! a$ ]- X# z9 {2 i    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ' m8 g3 O  a* a* Y# \
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
% D' h2 _* A. U: d8 U# O0 H    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; " ?* F% O7 g( D3 m2 @; l
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );/ i& W$ U% ^7 R. o* L; O0 e9 S
0 U; Z" A9 I! ?( y" q* P
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 5 Z  I& M% B/ e" V3 M1 O: B
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
8 [% f) f2 G: N+ l9 v2 p8 h    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 8 p: i' a2 V7 ]
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );5 a- w2 Y8 X  O: a
  f( H* v3 g" @, r
    CSR = 0x0000;
) U% w5 I* |9 A. q    INTC_INTMUX1 = 0x3d;
5 S) w$ @# _: P# f    ISTP = (unsigned int)vectors;
) {$ A+ s- e8 h7 o" T1 q    ICR = 0xFFF0;  
: r+ b9 m9 e; {( ?- W  }    IER |= 0x12;  & @, H" h  [4 \4 Z8 ?1 Z; |
    CSR |= 0x01;  
$ `7 ?: a2 _4 f: `5 r
1 z8 X$ }; U8 ^0 L! C$ U$ u6 d$ n
3 R( t$ u+ n/ D1 Y5 @5 M8 A
0 [' ?2 L( _- x& Z! m还有就是两个输入输出函数:- B; Y% W6 G. {( E9 u1 U+ H4 }
void output_sample(Int32 out_data)
6 I* v8 A6 e/ K. |& A{
& K8 v, ^8 B" Y4 @# O  AIC31_data.uint = out_data;  
3 O! r3 E, E) `7 ?0 o8 l9 j  MCASP1_XBUF5_32BIT = AIC31_data.uint;( Q6 A1 u3 V! u! v4 K
}
" e  `  `+ Y$ i" c/ v7 J+ B1 a# i: K" F0 V) e. ]7 {# e1 l, @
Int32 input_sample(void)
: s6 i( s& j6 {6 }9 r/ u{  
# b3 [+ c8 |6 m, y, r/ p& }  AIC31_data.uint = MCASP1_RBUF0_32BIT;; r% u& K8 u/ G; f% D$ J0 G
  return (AIC31_data.uint);
8 |$ y' I3 T1 o0 U}* D( j) ?) x/ g8 t+ T
) n" G3 K% W% c& K/ U& t

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




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