嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:4 ^! h& i  c9 O0 z- e& Z$ ?" A3 B
main文件:0 N9 T; x* Q2 K& Y  i9 ^: M2 z% C
interrupt void interrupt4(void)  / p' U5 z! i2 E  u# Q
{1 s0 A" t8 ^4 [& t& r) t
  Uint32 sample;9 U. u2 M# Q" J$ \# [5 l
5 X2 V& I7 K7 w
  sample = input_sample(); // read L + R samples from ADC0 @- N- d  j: u$ y! x& h
  output_sample(sample);   // write L + R samples to DAC
( j: n' l4 o3 G# k4 Z  return;. b$ i5 L+ n3 V- F: D+ e
}
- O) K' ~/ B/ z; ]$ c% W
' H3 o' {8 N$ B: y; N1 E# M! Cint main( void )2 d" N1 I7 c) h  E
{& P, J" Y: ]+ \, G9 s) i% Z
+ i7 q7 L5 i* |( K
    /* Initialize BSL */
0 s) j  K' c- }! p' V1 N$ P) P4 i    EVMC6747_init( );/ `: W) M' s* f" Z3 L4 C* x! l
        /* Call evmc6747_intr function */4 e/ |5 @. k/ G+ B2 J( w2 p% B
    aic3106_init( );  @( r2 y0 X0 `+ {2 R& h" ~
        while(1);
( U: _& [, l# q6 }; c/ W$ o}+ ~% d- |2 G5 Q4 }0 ^: f% \5 h& y
* E% n2 `( ?2 F
$ D! d; v9 i3 C; Q, e1 H) M: o
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
$ |$ e& y/ W' k5 s( p/* Initialize MCASP1 */
- Y9 n1 {- ?6 z! d    mcasp = &MCASP_MODULE_1;
/ p" V' |  }5 ]3 E; t4 p* q0 Z) H    mcasp->regs->GBLCTL  = 0;       // Reset
4 i# [& ^+ J2 ]- g& G2 J    mcasp->regs->RGBLCTL = 0;       // Reset RX
" \( B& N$ O' G. y5 }0 _2 \    mcasp->regs->XGBLCTL = 0;       // Reset TX! |! R7 j6 ^  A  \7 M7 j5 z
    mcasp->regs->PWRDEMU = 1;       // Free-running1 I4 F( G8 }3 O& \: a8 w
   // configure McASP0 receive registers. w9 @  `; l/ e
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
8 _! U8 z3 X" R4 K" Z$ e    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
3 Z+ U8 M% h, d3 @    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word4 c% Q* I- D5 O, \! b
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side), o+ S: U1 x2 E& j7 j9 j
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)* m" _/ `7 P* y* A
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
1 i8 _5 F4 B9 \; T! t. O" v    mcasp->regs->RINTCTL    = 0x00000000; // Not used
0 t: o! o3 J# X* H    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256  v, L, C+ z- `' u( p6 F3 n
# \, K' D, [6 |+ ^; L9 M4 e
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
# v7 u+ ?0 a1 I" R/ ^, C    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus0 |, j7 A0 `( `- U1 i
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word$ |$ y9 r$ V! Y/ L7 J7 ~- b
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16+ B: u! Y- U2 e3 _  V" h: D
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK( ^+ P7 r: L( v  n& y8 o
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
6 v' Y; {5 B5 D7 M    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
* o' V! ^3 X" X6 T# q    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 w$ V" d! {4 X# u$ Z* Z- K
/ O3 I; d9 `% w  H- J& [* ^3 N    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN% L  k% ]  `6 Z6 @: b: A3 Q
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
0 W  ]! N5 s; X- e- y; h9 X    mcasp->regs->PFUNC      = 0;          // All MCASPs/ s# K$ n7 l3 S" l
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
& U2 }. \- A& E/ [0 Y! \* ~- `$ }8 k; @1 ^. u, g
    mcasp->regs->DITCTL     = 0x00000000; // Not used: T8 N- b; Y# H# a3 c& Q6 U
    mcasp->regs->DLBCTL     = 0x00000000; // Not used8 D! h+ W* }* Q7 N9 x
    mcasp->regs->AMUTE      = 0x00000000; // Not used% \" Z% ~8 h3 E- @, M
+ D9 S+ Q# B( z
/* Starting sections of the McASP*/+ o+ E! S/ a: L4 u, }/ t, R% w* d
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
$ N2 S, D9 u8 y4 x/ }, }    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
' m2 r5 A1 g1 Q) h1 [! ]' r    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 7 ~3 C" Y: o4 ~2 [
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
2 |' u6 H9 ]6 }- O0 Y* n; k. l
, S* I& q) |, f, ]+ e    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
6 [9 T" |/ K7 w* y    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );; Y4 s) r* ~$ y  Q
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
7 Q2 f8 S3 f7 O9 i, `3 H: |$ s    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
5 I3 p  @; E8 O$ n* {2 H; x; o4 T2 W
" d+ t& |) q: \' o2 G# P& C    mcasp->regs->XSTAT = 0x0000ffff; 1 N( s* \3 v( e8 N5 `( H
    mcasp->regs->RSTAT = 0x0000ffff;
% c0 V! u. E- f: h' e
7 m3 L  S, f' b% M8 e$ Z; ]8 E    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;+ u. z, n5 c) T, N
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );$ d1 [1 c: M  n! ~1 |) a* ~/ T6 O
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; , q0 P& u1 f& @4 i! w$ c, I
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
6 f, C" n5 e5 o. G/ r' W7 ], B1 f, _% n$ E3 {+ y3 d# {2 k
    /* Write a 0, so that no underrun occurs after releasing the state machine */
5 ?- Y& w: K& d; R3 V: o    mcasp->regs->XBUF5 = 0;! N1 m! d0 n4 E+ G4 N7 q) O
    mcasp->regs->RBUF0 = 0;
$ e: P: }6 u/ \& ]$ M0 b6 S7 k( M2 l2 n. c
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
1 D" f( W' E) H( O" f    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );* S6 M  U; {' `2 q. a- m+ y
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
; J* K7 d$ p4 v2 \0 A" A7 Q    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );- O, I) K8 h6 X$ Z6 m; G1 q
, E- I- d, _1 f  q, z+ `; }
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 8 j2 j8 K' u4 Y
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );" ^- H& m; L: g  c+ G+ i
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; " X/ z6 d2 d; \2 z8 I+ @3 N  m/ f
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
+ \4 }, ~& T$ f% [1 B2 S, G3 z/ U' g) C0 V5 G- i. b
    CSR = 0x0000;+ ~5 T$ }) ?+ d
    INTC_INTMUX1 = 0x3d;
/ g3 o$ I! E# O5 b# c2 J* X/ i+ w    ISTP = (unsigned int)vectors;5 W, U, A! O$ r0 x
    ICR = 0xFFF0;  & b4 R2 ~- _  x* _& W; U
    IER |= 0x12;  
- |: @/ j& @% a    CSR |= 0x01;  
- R2 O6 f" T% e
9 d2 ?! n6 A4 H0 A/ \: c  f3 y0 s+ i/ J# G* Y) N

- c: f2 Y4 i) o- r, |0 ^! a+ J还有就是两个输入输出函数:
( E, g0 y: L0 v3 I( L) Y5 ^void output_sample(Int32 out_data)( v. i: e4 U0 A! n$ o/ Q9 K
{. Y( J  l6 {' P' j" c9 ^8 J
  AIC31_data.uint = out_data;  
  x% a  F% p3 M& y. ?* V, _  MCASP1_XBUF5_32BIT = AIC31_data.uint;- b4 a+ y9 r& F8 O0 a
}8 L  q# r" `4 N! F, c

9 r! ]$ u2 L$ N+ dInt32 input_sample(void)& m; N" Q$ w* p2 g" M+ t% t0 A
{  
+ q+ b3 _( a5 ^: [. i1 A  AIC31_data.uint = MCASP1_RBUF0_32BIT;8 ]- t) A3 Q/ i
  return (AIC31_data.uint);
" ~0 E& m& t1 ~/ \: {* }5 H}) Q: p  A( n' `: K) o5 h3 ~

! s) O2 x$ t6 o9 o4 a* U
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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