嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:6 H/ a( N# y; t+ W
main文件:
) U. _- u$ ~$ r  y& E- N( l! f* z% Tinterrupt void interrupt4(void)  1 M& ^( E+ E! N7 c/ b
{) i$ v4 _& N" w& w6 q
  Uint32 sample;
* R' i' D0 z" O/ X: n  H4 b# Y+ R5 d2 r
  sample = input_sample(); // read L + R samples from ADC2 A  F, K4 V! `( X3 S1 _: @
  output_sample(sample);   // write L + R samples to DAC . g$ v  b/ L6 a- N1 `
  return;6 Z, b, J3 \1 R  O. @
}$ p5 e9 _9 m7 M' X

3 W7 P' S5 o: |int main( void )
  e9 w, O* ~4 Y$ a+ ]' {$ H{
  ?5 H0 e* L0 B+ g7 ?8 J
6 ^2 g  z2 Z0 [* s3 U    /* Initialize BSL */9 M$ n/ @: F* G: o, s4 V! T
    EVMC6747_init( );
. g6 |, A. h4 G/ [& b        /* Call evmc6747_intr function */
( Q' o# o7 R  r# W- m& I    aic3106_init( );
# B$ C2 ?. |; {( D1 O        while(1);4 h( r. k8 [0 u5 _
}
! _2 X  ]! L- g5 _- `6 u; z+ o4 v% i9 X1 g

! a. B7 g& T# ~8 jaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
& u3 U9 O. p; T5 J  T  @/* Initialize MCASP1 */
' O: U* e, g3 u+ V    mcasp = &MCASP_MODULE_1;
' G+ D8 A3 J* T8 J- @! u% W    mcasp->regs->GBLCTL  = 0;       // Reset
/ r- ]: x* h+ m) u; K    mcasp->regs->RGBLCTL = 0;       // Reset RX% e. O/ l+ S3 H  P- Q
    mcasp->regs->XGBLCTL = 0;       // Reset TX0 s# z$ _9 r- j, X" N  r+ M
    mcasp->regs->PWRDEMU = 1;       // Free-running' x3 n$ [# y+ B6 ?
   // configure McASP0 receive registers
# ^8 S  F, e0 R6 E) X' i* j, e& _* R    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
8 K9 K, O. H3 e2 W; Y    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus$ c3 n* @0 b  p! p1 l
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word* t4 z5 o% b" k& F9 w
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)5 G6 ~& Z/ l( U9 _8 y2 s* P
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
1 v/ E: ^8 g) @4 G( L* H6 k    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1; a- S6 H: X  U, g
    mcasp->regs->RINTCTL    = 0x00000000; // Not used; d/ b8 w: {$ F; @) F/ }
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256; J2 f% x8 m# K$ n; p" J+ R. F
; H1 m4 _, ?0 o
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
4 l* g$ I2 V# G+ x" V4 o& J4 b    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
- e2 W1 s7 s- @) E3 q0 M9 g; m    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word: Y3 u7 Q; j* `% z' G0 u
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-165 s8 d( l; m3 ?
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK2 X; B- q8 |: E2 T9 ~( D1 k2 M+ b# |
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
) H% ~8 E! k; H! |( J- q2 B8 W8 N    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
, Z. ^8 x- d' D; g+ p  Q* @0 S4 A    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256; ~( k+ H1 S# o( }3 K4 G
* P5 w  a# `, d3 e) r; z# N
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
, ?. U7 C' ]$ P; f1 H' d    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT4 ]" h5 R% K: |5 `# W
    mcasp->regs->PFUNC      = 0;          // All MCASPs
" f1 w; p6 m; x6 L) i    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1+ `8 J) j' m$ E" O; W; t

) T6 T+ m) Z" N( w    mcasp->regs->DITCTL     = 0x00000000; // Not used: _3 Q0 }0 z% M! x' t
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
6 E4 l2 b) Y3 F* v1 L+ P    mcasp->regs->AMUTE      = 0x00000000; // Not used$ o: K  d' l8 J
: j4 v1 a1 S( m
/* Starting sections of the McASP*/
2 V; Z' _( B' [    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 4 L+ }, j' h5 j/ T7 e  z
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  / [6 Q) e% Y) S
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; " J( J4 q( F9 A" U; ~( p- m- k
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
' K8 N' j5 U) w" }* g7 m; K8 s# \4 r. z' ^4 J% U. h- c! K
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; # e- Q: t1 p2 w0 d  L9 A
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );4 B# x& V# j$ f+ P0 F2 w
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
' n1 K. O( X1 w' u) L    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );: f, h' I- |  ]% V) q( _  w
" f) _+ O/ I0 G- |5 Y" t" h+ L7 |
    mcasp->regs->XSTAT = 0x0000ffff; 2 t! P4 [# Y: r0 Y' h
    mcasp->regs->RSTAT = 0x0000ffff; 2 k8 R2 ~# x3 @

2 x. ^. W& Z. V  f& |9 D    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;2 [0 T& o/ s4 E
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
0 z7 L1 v" C! W    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 2 `8 V0 g6 [" _3 ?% x$ W: s
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
- R2 Q. N3 l# e; p. T: q" p. L
  Q1 K, e+ W/ h    /* Write a 0, so that no underrun occurs after releasing the state machine */
5 @! k( B5 y( ~1 g    mcasp->regs->XBUF5 = 0;& N7 s3 Z9 r) X) \  P; {. e: e) [
    mcasp->regs->RBUF0 = 0;. @- s+ ?6 A0 C, S/ H

( N" [9 w% ~% i! q    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
6 }1 R( F! \. W/ d* Y    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
9 V# R' _" l  R, f( }( Q( ]3 Z" Q    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 1 H, J" x% K, h0 Z2 s/ X- F
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
* d% _; F5 y! w! m: C
0 o- i6 W+ @2 k# f    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
$ S3 G% O* m1 |! u( U6 k  S" `; j8 `    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );: T" Z) ?# b9 l! D
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ' [! Q% a+ c$ r$ `/ I
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
7 ^5 s& b' c/ W  }$ I# O- M* a! _5 Z' x7 \7 {
    CSR = 0x0000;
8 N* J5 C% ^0 Z, ~    INTC_INTMUX1 = 0x3d;# k- w3 j/ U7 D& I: w7 P1 \8 X7 f
    ISTP = (unsigned int)vectors;
, s$ X7 Z  G! Q4 `: W- x. t    ICR = 0xFFF0;  
7 g5 R* C$ O, s1 ]2 o0 c    IER |= 0x12;  ' x' N8 J% f; ^- g1 P* f1 I; Q/ b
    CSR |= 0x01;  
, t# Q0 A3 E6 b! {# P  k$ S1 @+ d

3 F. F. l# E" A' w. P& X; e3 V& \/ P5 S' z7 w1 t$ r. x2 l
还有就是两个输入输出函数:* m& T# q* ^* g& }7 ~  ~
void output_sample(Int32 out_data)) e. H. [2 W3 n7 H  o
{9 I4 L# `) d, W1 Z7 @9 E4 Y
  AIC31_data.uint = out_data;  8 `* u4 H( P& _7 j
  MCASP1_XBUF5_32BIT = AIC31_data.uint;6 }& Y# o* p) @3 q, @+ \% F
}) E0 p3 `" U9 R0 ~! t  X* G

! P  U' {/ f; A/ J7 T: MInt32 input_sample(void)
  S0 U& j$ B8 g+ P+ G{  ; j2 @' t; A+ J' K% c" K! Z
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
; d. h, G3 j% o  return (AIC31_data.uint);
, h- K: y* W4 m1 v* U4 v}
* a' t3 O0 j' s4 @+ K4 _& C4 I; ]  k. t

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




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