嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
: A8 o/ M" t1 Z" ~' emain文件:5 ?5 I; \% }5 D3 k7 w8 D
interrupt void interrupt4(void)  ) _( v6 p( H2 {' _. U; Y2 b) U+ q
{  V3 i+ b" O" H/ |5 W( p3 \
  Uint32 sample;; F, u. B- d" s( U
7 `. k" L+ E7 H" \
  sample = input_sample(); // read L + R samples from ADC7 g" O" h& g4 n* a6 E- i6 j5 o
  output_sample(sample);   // write L + R samples to DAC - u1 S6 y" _0 ?( f: q1 l% O* J8 c6 c
  return;
! F  {/ r* \; W& l( s}
* L" d! }) }& ^5 |" F( ^
2 b  r! g9 M0 S  A! |int main( void )
8 q9 h% O$ h  `: m{" h% s, Y! `1 D. E$ d

' `# A) I2 r( d. z# Y/ }& s    /* Initialize BSL */
- H5 h0 b, l+ }7 ]    EVMC6747_init( );8 b6 `6 ^1 }+ U' O2 j
        /* Call evmc6747_intr function */
- c1 T/ x; l, f- D# Y0 ^    aic3106_init( );
7 W/ z, N) j/ e$ l& C3 W; p        while(1);+ C# {0 y$ Q" C% t
}
8 ?+ f- E0 O; e) g  B- n& \. O$ S' B, g6 _( @

6 {2 F6 ?# `7 \, b( r" Caic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
9 Y$ n# e, D; G$ i: [. H/ ~) D2 E9 X, x7 e' e/* Initialize MCASP1 */1 D: F1 A! ~8 \: Z0 l4 N' Q: j: H7 i
    mcasp = &MCASP_MODULE_1;# Z9 p, b2 a3 n) S  ^& k" u1 i8 T
    mcasp->regs->GBLCTL  = 0;       // Reset! P/ r0 O3 ]: q* ?% v
    mcasp->regs->RGBLCTL = 0;       // Reset RX
7 h5 h8 s( \5 F) y4 B# T- n& U' z    mcasp->regs->XGBLCTL = 0;       // Reset TX- ?  z3 Q! b% h
    mcasp->regs->PWRDEMU = 1;       // Free-running9 X% B- p1 m4 F6 W; i8 g2 ^) ]! w; @
   // configure McASP0 receive registers3 j4 P4 \( K1 o5 R' a/ W2 A, C
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used' |3 K0 o3 g! h+ H
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 X8 I% _; o  o    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word+ T2 E$ ]( y$ X6 C# n# a9 i5 t# N! Y
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)' I) d. Z5 ]" e! F& b
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
; [, T# I! {; V/ O, b    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1: A- `& m- M; @7 l; T
    mcasp->regs->RINTCTL    = 0x00000000; // Not used  N0 o( q% J1 Y( |
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2565 T# x' ]" }2 x7 @& h
' j6 W1 [2 t- K: l- G5 h0 ?, w
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
% n9 W5 M" h8 U- A3 G    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus  A6 v: x5 i" l9 r6 ~
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word% L0 S* ?' c5 Y6 W9 h* D1 p+ H
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16& g7 L% o2 k" o/ Y
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
# n2 q% M/ ]* r' }6 E2 U- w    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
; M& w0 [) a9 [/ m9 [8 Q    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
9 I+ A0 B$ I# c    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 u- d, x  B" [1 ?- ~2 c' m9 h' f* Q/ y
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
! X  m9 Q1 K+ ]4 m    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT) ?6 u* }. _4 t8 f$ K4 m4 r
    mcasp->regs->PFUNC      = 0;          // All MCASPs9 q& t& |  I* J8 R* _
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
! L5 l) R9 e5 |" x; s  J2 y/ n. t4 c2 w: g# X' S
    mcasp->regs->DITCTL     = 0x00000000; // Not used/ m: h/ m& m* V
    mcasp->regs->DLBCTL     = 0x00000000; // Not used; J2 ?6 Y8 Z' V7 |$ E
    mcasp->regs->AMUTE      = 0x00000000; // Not used
) F  z3 S' _3 h( ?, D( O* _8 p; I" _! ?& h7 b
/* Starting sections of the McASP*/  D8 Y1 U: k( J* R, R# R" v! D
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 0 u& c: ^% f* V7 `1 p
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
2 X2 ~' y  R: [0 j2 {+ B: b1 R9 T    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
3 O1 c/ E" q! Z% T) R, e7 w& \    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );+ S. R8 L! u; C2 J. Z

! q  _5 B0 x4 m. W" R3 ~    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; , g$ V, `# Q9 ]" V( x: L9 ^8 Z
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );9 q4 l8 f" e3 L9 n, N* N6 W
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 1 B6 b$ z! O; }* _0 Y) L
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );/ q2 d0 G) d5 d3 d2 x; {  L

. Y. s' O, r3 Y1 x5 q8 h    mcasp->regs->XSTAT = 0x0000ffff; ! o7 Z3 v' l# x+ W. m
    mcasp->regs->RSTAT = 0x0000ffff; + D6 P2 X; q3 [

* I4 h8 a7 b, J    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
) O9 {+ w, K0 f' W+ g* f4 K+ r! d    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
8 x* _, L& e# q1 x' _2 I2 ]# {    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 3 j1 }1 q  [2 ^8 ^9 [: k
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );. l. n1 `: q+ @! O' W

' m" ]. J2 }; [% }    /* Write a 0, so that no underrun occurs after releasing the state machine */
+ w) \1 U, I5 m9 p9 O    mcasp->regs->XBUF5 = 0;
8 M+ @( E, }/ m! w+ o! A( i    mcasp->regs->RBUF0 = 0;# n5 F: f4 y! j$ e: k; B. y# _

7 k0 c; F6 g# R0 x/ i    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
0 d0 S$ g3 Q. }7 i! h$ Q    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );7 X! }$ D2 R" \+ h4 Z4 T
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; & o$ Z9 ?% q3 |+ a7 _) D
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
: o  ~; Y# f* Y( R' G/ f) c6 x. _$ @5 e
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ! j. t9 o* w( q6 J% m' `( Z3 }0 l
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );, e3 ?% r" D* f; {* N* A
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ( ~# O! ?# [% z; e9 W* j
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );0 l3 Y& c' W4 K" }- G

$ c% c: e# _; n/ S    CSR = 0x0000;/ x& a% q" o5 o  d# k7 c5 t( Y
    INTC_INTMUX1 = 0x3d;
3 M$ C3 T6 D& `7 A    ISTP = (unsigned int)vectors;
# Z( y$ l1 J& O% S% v9 e2 d    ICR = 0xFFF0;  # S* h5 f; c5 j3 m( R  X
    IER |= 0x12;  
0 v5 @) g# x9 y% `    CSR |= 0x01;  
! \; c2 E: g: K3 O% O+ {0 \* b6 }/ B7 q# w9 F) |% d
+ q( z1 s5 v) i# f4 k

5 L% }- }# _. e+ Q还有就是两个输入输出函数:- Q& _( r( w( l/ V3 v+ u
void output_sample(Int32 out_data), U9 f9 D, d2 o2 N1 V
{
* o6 u+ w# K! e# H1 S9 ?  AIC31_data.uint = out_data;  
1 B4 k- |' @0 O3 ?# e" q  MCASP1_XBUF5_32BIT = AIC31_data.uint;
  }! K6 B# A7 H" K, C# a, D}
; M" y% K8 l& f6 V9 _# D* g7 X
  p" @; u4 e: y3 |* q4 B! kInt32 input_sample(void)
) L# a: \$ c3 {- r* d  H{  
- O5 Q! l9 V$ R2 ~4 ^  AIC31_data.uint = MCASP1_RBUF0_32BIT;
7 F, P9 u2 V+ s; K5 x  return (AIC31_data.uint);
, }; g; w  d$ g+ d. J9 `  b}
' S; e% Z1 p* N% t: y. c, w7 P4 E
2 V' e( R: n' S5 a
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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