嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
. V( o4 w) N9 V# Imain文件:8 i. r9 C5 Q8 c% X0 P
interrupt void interrupt4(void)  
/ a' X. b2 p' E- j4 h! t{$ c0 W% a7 }0 t3 L- `$ t: g
  Uint32 sample;
6 ~/ G/ ?9 ?' d+ V: K# y& k3 |& L% Z+ L! i) z: ]! |
  sample = input_sample(); // read L + R samples from ADC: N/ A! P8 q8 P4 h7 \
  output_sample(sample);   // write L + R samples to DAC $ q9 L2 G3 T7 W# w5 F
  return;
$ o. I/ U3 z8 V}
2 p$ |/ J- {0 {3 E  [3 l
  F) G' i' r' u! N. ^. Gint main( void )
4 c% p  {# \, z8 \. A7 m4 Y& P6 T{
- @) h" T( y) N" x* y+ q9 Q, q3 }' h  I0 R6 Y0 o
    /* Initialize BSL */; X" _+ a) y% y: d7 W8 ?
    EVMC6747_init( );% s; J0 ]. X, |) d1 V
        /* Call evmc6747_intr function */
2 d! \% {; J) m0 R; }    aic3106_init( );
* C6 G( _( B, p4 a6 e# k; O        while(1);
$ F8 S! }# C3 @6 |}
4 p* ^; z4 p  G) T% H+ c$ ?& q, S" k
- D- n: [; O# u5 N& Q2 @  ~" M6 U- C) }" t
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题- g( k4 t7 Y- e6 R9 V4 j% j: v9 o
/* Initialize MCASP1 */
% Y2 }5 @; N  k! M: U( R; k! q* o    mcasp = &MCASP_MODULE_1;
& h7 L$ p6 u  Z) e! A  v8 k    mcasp->regs->GBLCTL  = 0;       // Reset7 Q% U1 @$ i) k& W6 I
    mcasp->regs->RGBLCTL = 0;       // Reset RX. [! z! K7 `' z# l: _) X
    mcasp->regs->XGBLCTL = 0;       // Reset TX5 q: O' i2 B9 m" C4 D+ f& e
    mcasp->regs->PWRDEMU = 1;       // Free-running
% {4 H' q2 T% N' X- _4 I   // configure McASP0 receive registers" h1 L+ a9 z1 c+ \( G# K- R
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
/ M% e8 K9 ]/ {0 T  K$ U8 v    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus1 f4 n2 p/ ?$ p
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
; }: N; d+ [+ `$ s    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
! c1 G3 B" T5 ], W8 J% d2 R2 |    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
3 g  p5 E7 J; \: e6 q( V0 \( b    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
$ [7 u6 s8 ~) `6 J) g    mcasp->regs->RINTCTL    = 0x00000000; // Not used, j. C8 M+ J+ w0 @( J8 Z4 E& G; f
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2564 x$ ~( ~) d4 l* T. x

6 a$ D, }* q: x' d& y" j    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used8 A8 W1 g" e" l, @+ V- a- H
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 G2 L2 K% w7 ~+ x5 F! x) m6 }    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
7 l" y/ o; `3 {5 g+ B  F    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
  j3 {- L0 C/ y    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK7 v' b1 H& a" |, M+ ?5 ~
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,11 l6 X( y) U7 ?* c  {3 c- G( w) A7 [
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
4 A; I; x5 s7 f  ]& c- U    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. @9 S3 a; q, A$ G. z5 y2 ]: J% x& U7 e* ?& n- j- c5 P
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
5 |) f* N3 Y3 t# m" c" V    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT" G; f# O2 R  d6 R' B% ~
    mcasp->regs->PFUNC      = 0;          // All MCASPs/ G1 d: w: P4 q( t9 e8 v- L
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
' D7 c$ l% k/ m1 H0 g
: v" D* F9 H, G# U    mcasp->regs->DITCTL     = 0x00000000; // Not used
" {5 N4 a1 c; ]; R& d    mcasp->regs->DLBCTL     = 0x00000000; // Not used
1 f* A8 c% o% M) z( d6 f9 k    mcasp->regs->AMUTE      = 0x00000000; // Not used
6 I4 O$ }3 V* W4 ~, B; R
  j7 O4 Z& h. H' k& U/* Starting sections of the McASP*/
- ], D) |, j# f6 B    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; # k. h- L4 z! x' ]0 B* ^
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
/ K( m( [) M# d  H. U: a4 I+ l    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
! L5 `& s- M1 L/ q    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );; b# O6 v: I8 l/ q* M9 O# @8 q+ T1 E7 N
0 J6 Q, ^. p' I3 n
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ' d' Y- P4 K2 S) p9 u
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
4 y: [5 G( z& ^; Z2 e0 V0 W    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 8 _- F/ {+ U7 t+ X% m
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
. `3 l2 q4 h+ r7 T" A, B7 t( C; D! ^* W# Q
    mcasp->regs->XSTAT = 0x0000ffff; / Z) L$ f6 p2 j' U3 B2 }
    mcasp->regs->RSTAT = 0x0000ffff;
$ x# ?3 T9 z8 Y9 G0 X' m
. X! b# ]- V5 }% K    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
; d; r% \$ a; ?1 @. w  g* j    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
" u% Y0 R8 v! W% S: {    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; / @( t- x1 a, O1 L0 K- r- p
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );# K; c: L# X' f
; o% `1 I  ?- ~& m. x+ M& y' S
    /* Write a 0, so that no underrun occurs after releasing the state machine */5 R0 Q& o6 P9 X8 s6 W
    mcasp->regs->XBUF5 = 0;( j, n. y& ]+ B6 F) B3 ]
    mcasp->regs->RBUF0 = 0;8 `9 Y( _4 b5 ?+ V& E& q
) A# u( [4 m% g, Y
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
' h% ]# M' ?9 J. d+ j    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );5 O5 Y/ }# {8 T/ f
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
' }# ~: ~3 l0 y5 w; W: H4 j5 i; }    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );  x- u) _; C! o4 z* S1 S! L4 Y

, d( M# N( j% |    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
. w% H9 t5 }$ o. S! \0 g8 E. n    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );9 H* ^3 b. B$ t1 Q3 z- B
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
( J6 K3 M& `" `3 g+ l9 m9 i4 R    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
8 s8 H+ N+ L; E0 R; Y0 S# h; T8 p) e
    CSR = 0x0000;% h% c" p# E3 o2 K6 v9 E. s, U
    INTC_INTMUX1 = 0x3d;
% [0 {" D! d3 l* Y% d' X* S& p7 N    ISTP = (unsigned int)vectors;, u/ e' F) G/ J0 Q; t
    ICR = 0xFFF0;  
* g  _- v1 y4 T4 n    IER |= 0x12;  - m  I  S3 q! u4 X  t9 h
    CSR |= 0x01;  
& ~3 u. b$ r: c" J
1 Q. S; k+ A) s: ]( z/ K8 ^6 L. x4 F! F7 f

; k2 m# R. M8 J4 U还有就是两个输入输出函数:
% q0 e8 u, V! ~" hvoid output_sample(Int32 out_data)5 ?5 }) r0 y: G( A) \
{$ y! g7 {3 b) O% K- N* q
  AIC31_data.uint = out_data;  
: S+ q9 `$ \# w* N- R$ x; ?. A  MCASP1_XBUF5_32BIT = AIC31_data.uint;' U9 c9 p- I, s
}
1 U& \9 G3 b) O5 W2 J( T# n+ [7 a% L" g* J: B- r) |
Int32 input_sample(void), B) |; `9 Q3 i9 ^
{  # m* J9 h9 k6 T4 C2 S  E& ]
  AIC31_data.uint = MCASP1_RBUF0_32BIT;& d& g1 J! e6 a) |, Q
  return (AIC31_data.uint);
, X' u1 \; [4 ~: H( l}1 l9 k) l3 N6 l0 W! ~5 U

1 ]* b* @+ c' N" Q) ~5 j
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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