嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
2 d" P/ ]8 [* i3 _3 h( `/ w9 P2 dmain文件:. Q# L% S& w  M5 H2 k
interrupt void interrupt4(void)  , X; R; R8 c4 M
{3 X# Z2 A$ M+ U% D, |
  Uint32 sample;
4 o& o6 J9 D6 X0 f  T: m) M" C
  sample = input_sample(); // read L + R samples from ADC
3 z5 A- x+ Z& |6 V+ o2 A  output_sample(sample);   // write L + R samples to DAC 2 u/ q; o; V$ I# y% ?0 {# }
  return;, X/ j5 {) }( R3 n' V5 b6 [
}
8 r5 I& V2 Z3 X- ?! J8 Q1 Q1 l! s( M  d3 y
int main( void )' E- V# r) ~% }8 j
{
) w, H6 J. Z4 w8 T) m$ ~, o7 T4 t1 ]) ?. q3 Y5 V4 L# V3 l
    /* Initialize BSL */
, \" l+ y- x! N6 L% x0 r* N9 @    EVMC6747_init( );) w# M) Z% b6 U9 m
        /* Call evmc6747_intr function */' d" l% i3 y0 A* h! q) a& {6 Q
    aic3106_init( );) O4 d. f* L' c; w: c" K: ]
        while(1);
5 q6 g1 L& Q/ K}
. K  p  I" r% X! }# m0 D0 b6 Q5 P3 F7 R$ {  ^/ Q' v  x
% L$ S$ e' c0 B/ j$ P+ Y
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题+ q+ l  N* R9 }# x/ N
/* Initialize MCASP1 */: ]" v% n  Z4 O) v5 s
    mcasp = &MCASP_MODULE_1;
' m$ U. [* [- m, Y, C0 l6 M    mcasp->regs->GBLCTL  = 0;       // Reset" \# Q( V  D  _
    mcasp->regs->RGBLCTL = 0;       // Reset RX
! L+ q, A9 B% d0 D) P, `    mcasp->regs->XGBLCTL = 0;       // Reset TX
! J, W! Y! E: T% p! p% l# t. v) @* c    mcasp->regs->PWRDEMU = 1;       // Free-running
5 @! t( {; D" @" _( Y% q2 ?8 ^   // configure McASP0 receive registers
9 }- z0 g3 J( I6 d* J5 ^    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used  k3 u* _; c8 G, R& }+ W
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 w  `% D8 U! t& ~! s9 ]    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word+ X% _4 o( U3 L8 a( N! O0 q, K
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
2 I3 l# L2 x* {    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)  i# U/ q# f4 O6 w" q+ G6 x
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1' }' s, X( h2 }( L7 w* e
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
1 a5 g2 W7 r+ X3 M; i" j    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
' P' \$ m: Q* _5 T0 ^& l8 `( v, I
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
5 T$ F& }3 l5 |) O! B* m" H    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus( I8 `: ^+ a7 j
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
$ W+ [- ~9 [) C    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-169 I: w7 p& \* I; v) {7 d
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK: H# \7 D8 T) I6 i2 N% M
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,19 p6 s; u2 a! v( }
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
! F  F- P! }8 w! ]) ], ]    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 s6 Q0 i- |3 e8 y2 {% T3 p3 w2 [: X& f1 d* Q
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
  e% t0 _* @& ~0 b    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT* W2 m0 b" K; n) P9 m
    mcasp->regs->PFUNC      = 0;          // All MCASPs
% Z& M7 c% `8 q; S2 ]- T    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
7 T. c8 ?2 W) i6 ?% W3 k
' g1 B' T* V( |" `  ]8 d" {    mcasp->regs->DITCTL     = 0x00000000; // Not used! c0 o8 x7 j) l3 D! D! H
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
9 t; ]5 D: R; y# x. v- a+ l    mcasp->regs->AMUTE      = 0x00000000; // Not used
- Z, F% W: Q1 H% O, H8 l+ l: ]! }! y& `2 b* C
/* Starting sections of the McASP*/" i" M4 H% i- r% ^- |
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
$ F0 W' j( C7 I$ p6 r4 Y/ Q    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
6 v+ D: P& ]$ Z3 i7 {8 ]    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; - P1 B, E* k! {3 I% l" @
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
& j# {5 \  `# ^/ Y# h8 M) e+ j
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; # E1 M  n) Q! ]
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );0 R7 P" z6 H$ ?: l( p3 K/ }+ `
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; # u8 i- `7 G1 L0 {
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
* |- p" `& H; Y, ?1 h8 o8 ?
, o, k/ b9 k- e: v4 i1 M) v- L    mcasp->regs->XSTAT = 0x0000ffff; 1 A* G! `, W9 d* T
    mcasp->regs->RSTAT = 0x0000ffff;
8 P( d- q  D- F# E' C( F; Z+ N8 B* }4 U* \3 o& o+ P4 Z" x: }
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
/ x$ C, n  f  o9 X7 G: w4 M# @0 K    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
9 b. d6 }( L$ p9 }- |    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
3 p% ]2 x, |1 M( p0 V, \: a    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
8 ^) |7 ~+ ^' K5 |1 _" l4 D6 [" K* [% z9 Y
    /* Write a 0, so that no underrun occurs after releasing the state machine */  N: `8 c3 R; O+ R2 Y4 g9 I' \. m
    mcasp->regs->XBUF5 = 0;
. h) M: T2 |7 \) D    mcasp->regs->RBUF0 = 0;
- A% D9 a: Y8 l  |/ H$ J* x2 x$ A( g4 x4 _* u( ~1 ?
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;   ?5 y4 w/ ^) I
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
' |) _, U0 A: b9 P" L    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 2 _5 `0 Q9 i$ ?4 f- y( f! `
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
# d/ c+ J) e* G9 W2 W% V1 |( u) o, s1 I  @. O+ w2 k
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
- Z, `% d  C$ s; y    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
- l2 d9 _0 a% z) h, E% E" u5 A    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 6 s' n. i9 W5 l
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );7 C. o0 r! Q( a, c3 v. A6 o  z8 N
3 W* \) P: A% S3 W2 q6 K" v' n9 k
    CSR = 0x0000;
$ N) l; s: E* j4 r( ?" F    INTC_INTMUX1 = 0x3d;% E1 y+ I  _* b: Z3 G8 ~" r4 g
    ISTP = (unsigned int)vectors;7 E$ S: `; Y  Q! [  Z4 c" O
    ICR = 0xFFF0;  + o! q1 P- `9 u
    IER |= 0x12;  
4 A  S0 J" d3 N0 R. e1 `    CSR |= 0x01;  
: `2 x( t1 x/ _7 T! p- ^; u4 `0 _) `( R
$ @; {/ S1 W5 a, e/ j3 a; |9 Y
8 s. x, z* ], G3 k
还有就是两个输入输出函数:
9 Y# [8 v2 O. Q" j2 e2 Vvoid output_sample(Int32 out_data)
0 W0 l5 Z! j. @" a/ @$ O{* s; U# b1 i1 ^  I7 N5 g
  AIC31_data.uint = out_data;  6 N$ ^. d' h% o
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
. S& ^. h' @. Q0 V}
" Y2 B$ }5 ?3 G' Y' T6 t9 L$ E- V  E+ E' |
Int32 input_sample(void)' J8 V. Z3 R7 E2 P
{    X5 \  q4 G6 `/ N+ H
  AIC31_data.uint = MCASP1_RBUF0_32BIT;) G% G- i. c0 V% [2 d# `0 N
  return (AIC31_data.uint);
5 s. f) d9 d. H}
0 v3 a* `' o- r- u% D9 i  y; H  A
" u7 U+ \: q; P3 ^+ P. t% L
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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