嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:( ?# a7 F: @* |4 a$ h
main文件:
1 K# v7 k7 Z" O9 q9 Binterrupt void interrupt4(void)  ! I% c5 f; s* R* x) O- Q* L, v
{% f3 h0 W; \9 \' C9 _* g
  Uint32 sample;
( G, c5 b: u" i" c1 j* @
  h8 m7 K6 T, k: m. H5 z  sample = input_sample(); // read L + R samples from ADC
4 _0 t$ P( M9 L4 |* t, ?  output_sample(sample);   // write L + R samples to DAC 2 }7 U7 x! @  c4 p1 r
  return;
! _4 D7 u9 |. J7 [* _}
) C, h7 Y9 R: X  o
9 {1 k) p' `5 _3 ~# x# n9 xint main( void )7 Y; n6 p. [( U/ N5 a# o
{
4 d+ m+ a& }7 S, U* s' v1 c& ~' I
+ h* ]) m6 O5 u, h3 R9 G' P    /* Initialize BSL */
/ ~3 K' {7 ^5 E  F4 ?7 v: u    EVMC6747_init( );
0 o& ~, C: H% l" t        /* Call evmc6747_intr function */# K6 v) g$ m0 i* {$ t: M
    aic3106_init( );
. U0 m, ?5 S3 k; ]' r: k        while(1);
+ i. s% u1 `" X1 S& ]0 E; x}
: k0 r) b: \' d$ Y! p3 e+ M$ |3 K9 k

  M  G4 @& D# [5 R  B3 @2 V# laic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题5 a! i- s+ \5 P4 H: p
/* Initialize MCASP1 */
$ g( g: L  Y; c( T# c    mcasp = &MCASP_MODULE_1;# t. Q1 v( {& |. h# X) y: q
    mcasp->regs->GBLCTL  = 0;       // Reset
' ~8 t+ r- ]+ S! v  v3 T    mcasp->regs->RGBLCTL = 0;       // Reset RX
  T7 B( o/ M5 g6 H' ]$ I" b! z    mcasp->regs->XGBLCTL = 0;       // Reset TX' a- S7 q$ J  v& j
    mcasp->regs->PWRDEMU = 1;       // Free-running( S* ?- ?, d! d
   // configure McASP0 receive registers. T! N  F+ {! _( z6 n
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
6 _/ r9 t( w* A# G: p' V2 D    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; t5 J& U0 {, K0 g: e' W$ L% }    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
9 U/ l& P& f- u) i    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
+ s, y1 z5 ~- a$ a' W    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)5 p  X2 o$ Y$ W( l5 S+ m
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
3 e" {- h2 i! M+ D3 ~    mcasp->regs->RINTCTL    = 0x00000000; // Not used
' v) e9 L, n( s    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256# S/ q5 C5 d5 [

* q+ s& x( D& S, {+ k: V$ M    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
/ H6 F. C' g- V  i1 T# u* ]    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 c! U1 L$ x4 Y0 q    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word& j* C* s2 |! Y9 \  O, \
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16; c% Z$ m, @  i! z
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK1 R  D$ F# @! S7 `0 b% y6 y- P! }
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
! j* j, u8 {! n    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
, e9 I! X& n) E    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. Y: i( ]  `1 ]3 s
: C: f( h6 S1 {3 R. v    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN1 l- I3 d' T0 ~
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT5 r" z! ^! X! P: L
    mcasp->regs->PFUNC      = 0;          // All MCASPs
0 X. N3 Q2 g: |1 h; d; V' w+ V" i    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1  i6 ^+ }) @( c8 _$ H9 ^( R0 Y/ y* z
% E% T# q3 Q" t( R. D
    mcasp->regs->DITCTL     = 0x00000000; // Not used9 F& j- }0 w( R8 p- \/ W
    mcasp->regs->DLBCTL     = 0x00000000; // Not used, q  q# W& W8 Y6 m
    mcasp->regs->AMUTE      = 0x00000000; // Not used
5 E9 h. A. C  `3 H. r4 Y% h, p
/ H: K6 X- G5 \+ r6 v9 r/* Starting sections of the McASP*/% i  c/ r, m8 p+ \# Z! `
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; & F, q8 t2 Z+ R3 W, m: c
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  + u+ o, Z6 l7 i3 f
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
4 {2 ?' `3 _3 {" ~% c    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
6 u  S& h5 b' }9 Q, R( y
* v& o- I! y4 @2 E2 m+ c    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; " h% k7 P  `* m! z- t/ J, F1 T
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
: t9 ^, P+ N, A    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 9 W! C5 _3 y4 g2 e  h. h: w
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );$ ~/ o2 ~) Q9 p
3 I: r9 k  W. G6 N: d) |! |
    mcasp->regs->XSTAT = 0x0000ffff;
' Y# \+ B1 M+ ]( K& d$ y0 u" I    mcasp->regs->RSTAT = 0x0000ffff; ) |1 V# g. ]4 H
) P# p2 W4 ?5 m6 `3 L) N
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;4 J4 c, t9 C/ L3 h6 y/ q
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );3 F& j! X! c. V& R- F
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;   n; K  q/ P1 @" G6 r+ f
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );3 K0 M3 L; D5 {' r# l6 E+ J1 D# O+ @- k
4 {) ?8 ~* h, U1 K1 X9 b% s% O
    /* Write a 0, so that no underrun occurs after releasing the state machine */
- ^; ?& g4 z+ S3 q! T9 D' S    mcasp->regs->XBUF5 = 0;
6 x5 E- M: N, S    mcasp->regs->RBUF0 = 0;
3 ~$ Y+ U& ~  C* I7 }- V: t- a
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 4 o: `; P; q" u- l& c
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );! q4 ]% V: P. n5 i
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
, d9 R9 |; L5 R/ E/ u6 l    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );. W  f2 j: `3 I) u. S9 e
9 E$ f: z- Z/ v& T9 Y+ p
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
) z( ?+ `5 N% Y' {+ |    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );4 {$ b, d( h7 N! b
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
1 k, v3 w' J" ~7 N* h  V    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
( ^4 ~! H; }/ z2 C7 a0 T" ~
: ^+ r$ T. B7 V) c0 ]; o    CSR = 0x0000;1 d+ ^' X8 B; `5 z) T
    INTC_INTMUX1 = 0x3d;
/ i# F) O1 i* D. c    ISTP = (unsigned int)vectors;+ o' O0 y' E; W( l  \
    ICR = 0xFFF0;  
5 {) R+ e: w; Q, @/ [# I    IER |= 0x12;  0 ?' q5 ]& y# j4 x/ T( t0 U
    CSR |= 0x01;  
" @; e1 e( j7 Y3 H
4 N0 T. L$ ^0 t2 y( [5 w2 T8 S3 L! V& p% P% V
8 z; j0 s% ?8 C
还有就是两个输入输出函数:  X. Z$ P: p- \& M
void output_sample(Int32 out_data)
( A; V% k  M3 b: a" A2 p{- @5 n6 J4 W. s( Y3 P
  AIC31_data.uint = out_data;  
. ?% m% {8 S& {" P6 e  MCASP1_XBUF5_32BIT = AIC31_data.uint;& z& i3 u0 s6 K  z! ?2 M
}
4 D7 q: b6 [* p4 Z+ p+ }' K% ~  Z7 z9 H+ k  E; }6 Q, R
Int32 input_sample(void)
5 K) t0 X$ l; w0 a9 N{  
4 M9 G1 d$ o- k% A4 d* I  AIC31_data.uint = MCASP1_RBUF0_32BIT;2 H. \( U8 {1 o6 i# `
  return (AIC31_data.uint);2 R0 C/ r& Q( X* r5 T
}7 {& \6 |: \; L+ R/ ~. [+ x

+ U1 f# x3 _% p- a5 ^  M
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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