嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
! l5 U4 V  Q- O# B# @! vmain文件:, B4 \/ ]7 T$ O5 |. v- c
interrupt void interrupt4(void)  8 E; m5 R3 [) S" `; t
{8 i- h  l% k6 Z+ @& ^, l! y
  Uint32 sample;0 O# Y6 P8 @6 ~9 d1 u% i! V4 o1 Z
# A. q2 v6 R% J) U
  sample = input_sample(); // read L + R samples from ADC
% L$ C4 t+ I9 j2 d  output_sample(sample);   // write L + R samples to DAC
8 |' `4 U/ z& m- z. |9 B  return;
) \7 G; @1 A# U9 b}) ?0 u2 @  E/ R/ G' y- q6 Q

2 j% E) l2 D" G  y. I" f! ~! fint main( void ): r7 i; r6 r# Y
{8 X1 K# g" V# g7 c/ t, S
/ |2 k4 ]% @, v. A9 L% P
    /* Initialize BSL */1 a8 I" M9 q3 Y# x7 L# A$ n
    EVMC6747_init( );
1 a6 l; e+ m1 [& I4 w' s/ V        /* Call evmc6747_intr function */
' a  K7 q* P+ y( j! q6 n5 y; v7 R    aic3106_init( );# E6 H3 f2 i/ S. g4 ^
        while(1);
: j& }( k/ W) O9 e" _4 I}
) o* X/ r3 m: N6 L4 A1 |/ V4 ?; d, B

4 T0 v; x/ W- ~! `, H0 z+ Haic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
1 T% N! j7 A0 q- E; P" O/* Initialize MCASP1 */9 H! i3 `2 K: d) z% R
    mcasp = &MCASP_MODULE_1;
3 ~% j  }! v8 G& g9 F4 v    mcasp->regs->GBLCTL  = 0;       // Reset. K8 W$ K6 ^0 F( ~/ V' a4 s/ W
    mcasp->regs->RGBLCTL = 0;       // Reset RX+ ?7 g  b2 @. C, X: j* ~4 M. u" Q
    mcasp->regs->XGBLCTL = 0;       // Reset TX
! G; W, }( H0 a: V6 R    mcasp->regs->PWRDEMU = 1;       // Free-running
5 e4 R. t6 C2 M0 q. H1 m. \   // configure McASP0 receive registers
2 d, k# R. y+ K$ c$ f    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
! r2 J3 K/ R! n/ ~& ^0 ~6 k8 g    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus* B% u. l7 j9 h* c
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
+ u: Q# v8 a  g' g    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)* y" b! ]& D7 T4 k
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
# H/ e2 |( j. F" j! h( ?    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1, A* S" w, J2 y  {% l' o6 H
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
6 X4 ~7 h2 F# U* B" t    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256" v( u2 B% y, M: |. F. a2 L$ N8 P& M
' _9 B, E4 ~8 O5 G  S: _
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
* F( t! [, k' f% c/ f) J/ h    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
' o: R+ l8 w0 V5 n5 y! ?: i    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word% M$ L+ L! e! |+ |/ C3 d4 w
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16/ @2 y: Q2 C% e2 M9 u
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
1 t2 Q: {' M  f" {3 i" R% H: w% d    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1& B. \8 S; b1 o
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit9 e1 X. R% F; D7 `$ a. W8 T9 _
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2566 S. T5 J4 ^3 f  M& Z* C

6 V6 `$ r5 U1 |5 y- Z    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
8 t6 d& k  |+ m3 T$ s& q! j0 O    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT3 K1 r/ m7 p" n* w- m& q. q
    mcasp->regs->PFUNC      = 0;          // All MCASPs8 A. p  S: k% F6 K
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
* A" ]0 p  j# R3 ~# K  O4 t8 a
0 b! F+ Y3 Z. v5 Y3 @; N    mcasp->regs->DITCTL     = 0x00000000; // Not used
. Q; U% O4 G# D( J, f1 t    mcasp->regs->DLBCTL     = 0x00000000; // Not used5 M0 Z; T! a! M, d9 |) d* c' s  T
    mcasp->regs->AMUTE      = 0x00000000; // Not used
" _4 v4 s" |- |  I; [( I% U
( p- Y" b! k0 A/ l0 |- V; A/* Starting sections of the McASP*/
) n  r; R6 b8 h" y  C    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 3 H( `: e6 O, a
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  - ]+ n$ s6 y/ W+ @/ |. b2 |
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
7 W8 n# M8 v' l; D5 K    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
, L3 g4 g6 J; v0 u" J0 R9 E" C' V, \/ I5 O% b1 \" r
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
1 v. q* u" z2 r$ }  |    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );/ b) _) t0 d1 E" S. ~
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
, ]0 h! c3 ]# P& s0 @    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );9 U# I+ P( @. ~( \) `& r

% f0 v2 `  L# D/ l$ P! I    mcasp->regs->XSTAT = 0x0000ffff; ) Y" @2 ]- J$ A( Z; l& C4 \' b
    mcasp->regs->RSTAT = 0x0000ffff; + _( I  u! Z; B$ @

4 O" u0 Z2 [; V9 T    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
: x7 U; M3 x* e# {9 x    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );% N. [0 m) h! F. y# G7 a: `5 j. e2 b
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
0 e, r  _$ g+ B/ _    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
9 M2 g6 P; S1 a! I/ J% |& V
, t! b8 S$ j/ [/ y8 b3 A    /* Write a 0, so that no underrun occurs after releasing the state machine */3 ~9 l7 ~6 N+ j2 g  k
    mcasp->regs->XBUF5 = 0;
7 n$ Z% L5 \3 l5 p3 j3 a    mcasp->regs->RBUF0 = 0;4 l5 k# o8 s! \, |- }" y: \5 u  {

8 p# R; @6 Y: ^2 X& G9 [    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
, C4 u( R7 P5 E$ f1 l, x    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );, [9 |5 p& A: I/ k
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; # B# ~  Y2 H3 G) J' X' V
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );) t% R5 x" z+ @3 h6 p6 q2 P

3 K3 S+ o. z) b9 F( o    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
  Z5 N: _5 u% y, D    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );- v( A8 y3 }8 B5 f
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 8 W0 _  Y9 X5 b5 w/ p( Q+ C
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
# i* ]" V3 k# G- @
# ^1 k- H( L3 w9 \6 c    CSR = 0x0000;
6 G. r! J5 ?! Z0 x4 \+ [& d6 m    INTC_INTMUX1 = 0x3d;
9 t! I; ~; K: I- f* ~* l! u$ c' [    ISTP = (unsigned int)vectors;/ ?& K9 e) ^" s8 K/ C8 Y0 }# |* @' z
    ICR = 0xFFF0;  . }% l$ N& i: y* E
    IER |= 0x12;  
3 d1 V9 a9 m( ~( \$ r# L$ L    CSR |= 0x01;  - s* I% |7 H& }# G# c1 ]
- @' }) Y' }+ C9 \3 O1 J# i) w
2 Q  L; O+ A# w6 c* k' p/ I+ g
# L2 l$ A' o4 S# Q- T8 D
还有就是两个输入输出函数:
# R' D# R' G/ X3 p3 y/ evoid output_sample(Int32 out_data)
; b/ m' z7 W: G8 d. Z" M& c{1 [& p0 S8 N, d3 v, V
  AIC31_data.uint = out_data;  
/ n5 ~+ J$ b, Y! {: S0 ]0 [  MCASP1_XBUF5_32BIT = AIC31_data.uint;' q8 l' W9 p4 C4 M! C9 ?. f7 n9 [: o
}5 [" x0 r+ Y/ R; {! u8 e

1 l5 |1 l* H- D2 H7 q( P0 i" _$ ZInt32 input_sample(void)
! i9 h- M$ b' _{  ' N* u8 P+ k$ W$ J) K( S, P% _1 ^
  AIC31_data.uint = MCASP1_RBUF0_32BIT;0 S2 U0 Q% l* E$ u! s8 X
  return (AIC31_data.uint);
& _$ x" h8 F. s. g}
: `' ]7 ~8 u! O/ b3 M( M9 Z0 B) a+ G5 }& D) J* O0 B  g

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




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