嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
2 c4 Q  }& L0 |main文件:$ G6 D, J% m; l) e
interrupt void interrupt4(void)  
' P, l2 C) g) v7 x8 M: Q7 j{
8 u7 Z' U  p% z3 y. Y; w' d  Uint32 sample;
, {  T" {/ a/ ~2 \2 _' b& r6 g. G! M! x$ i7 B( E$ P  |- q2 v! @
  sample = input_sample(); // read L + R samples from ADC0 T- V" E; z& S
  output_sample(sample);   // write L + R samples to DAC 3 Y- n4 C- q; q5 k
  return;
5 v9 E' t: `3 S" {1 V; H' l}
" W' K: ?6 Q7 q5 A4 H
5 ~' K: e5 b% f1 y% ]int main( void )
, y  }5 j6 m9 ]( @- y) Y4 S{9 T, [* G  ?/ x% q, i
( a  `4 B/ M* L( V, o
    /* Initialize BSL */8 h, ~+ ^6 Q9 E! D
    EVMC6747_init( );
! B7 ?; R* l+ a% K/ q3 i* ?3 I' ~2 B        /* Call evmc6747_intr function */
+ u% z2 e4 q8 }$ ]2 g6 E, q    aic3106_init( );  q$ s" j$ F7 q; u
        while(1);
) T6 _& n- F7 R. U}
& k7 k4 H, Q4 h& {
! [& n/ f" r/ b0 y% P' c8 |
' L6 K9 K& q! p5 F% k: K) Oaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题* p0 a5 U0 s  t4 K  L+ {$ U
/* Initialize MCASP1 */
+ i* m' Y+ V1 I3 e, Q' G5 d    mcasp = &MCASP_MODULE_1;  W$ T! `5 C# Q$ B
    mcasp->regs->GBLCTL  = 0;       // Reset
( u; R' d1 B% a+ T    mcasp->regs->RGBLCTL = 0;       // Reset RX
! j, G! ^) C& @    mcasp->regs->XGBLCTL = 0;       // Reset TX
% i4 t) C* A2 J5 D- ^6 K' i6 O    mcasp->regs->PWRDEMU = 1;       // Free-running5 D# X2 ^9 R- F% m
   // configure McASP0 receive registers3 D( f, g& p- @. a# F
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used' E" V: S8 r/ h: h
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 B+ d# ^( G( \8 G  w    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word' }0 G. S( f9 _9 ]# z. [/ H
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)1 Z" ~5 Q! ]6 }
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)# c+ P9 z1 O, |, G( s
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1) a9 F/ f) {, N$ S5 L
    mcasp->regs->RINTCTL    = 0x00000000; // Not used( e- I/ V, P: {& ^" W; M
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* ~! O/ P4 N3 M3 d2 t, T  O3 p9 |: S9 }: Y% F* h0 j0 W
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used4 K1 `& i+ X. d4 s
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus$ j- {. n$ @& U- t, s  i% w
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
) d% m* c$ U3 R4 V4 a1 a2 z    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
" b9 l5 r1 k2 W& l4 w- G    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
: e% g' c! e2 _8 {    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
+ y1 A" C; j+ L$ y# Z7 d  t7 h7 i    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit" g9 T' M8 q( r. ~
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256' F# J5 M9 b9 M  M
1 h8 c  Z8 {2 C5 N- Z( S
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
/ L) ?$ ^& T2 v$ I    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT* h. k- N  w0 o$ f- W
    mcasp->regs->PFUNC      = 0;          // All MCASPs2 N1 K5 R+ W# a4 {) j
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
$ k2 T. i+ f* k0 f7 A4 M8 a4 n1 J* G- B% j
    mcasp->regs->DITCTL     = 0x00000000; // Not used
8 P5 a; ?' l( j    mcasp->regs->DLBCTL     = 0x00000000; // Not used
  ]. K' f6 ?+ G2 p  l, ]& V    mcasp->regs->AMUTE      = 0x00000000; // Not used5 P. }9 b, _% @5 J
4 ?8 X9 m1 \- ]: m7 G9 o
/* Starting sections of the McASP*/# a4 v. L! ]6 z8 f: ~8 ~2 [3 b+ Z
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
2 |% h' r6 G( J: X7 l+ M    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
/ L. j/ j  A6 {1 N* Z0 b    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
/ H+ f+ d1 ~4 ^2 e' C) @/ }    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );- \# a6 Z7 h0 i6 j

! f# }1 @- ?2 ]( Z: c* g: Y! o3 e    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 3 n8 R' ]" z2 U8 z4 d
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );0 |# j, g- K; H+ j( j3 H; \: S
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
" G* v' P6 H4 R( M& {    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
' H1 F8 a$ m. P. T: K! j" Q4 q# z( V: V/ T9 D3 L
    mcasp->regs->XSTAT = 0x0000ffff; + ^- I2 u4 s; C: [) [5 ~6 n
    mcasp->regs->RSTAT = 0x0000ffff; ; v/ ]9 z+ u3 R2 n

1 f  q% [/ ^; f: C/ [    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;3 T! R  G! w3 H0 {/ I9 E
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
  Q# x7 N+ d7 J    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; & R1 t  f3 t3 w1 _5 M( P" v7 H
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );2 C' r% `+ s$ j0 E

/ b$ F& Z1 s! h# t    /* Write a 0, so that no underrun occurs after releasing the state machine */
9 R9 X; \. e1 Z/ F/ l% u    mcasp->regs->XBUF5 = 0;
( r$ `( B- U# L. x! q4 Y    mcasp->regs->RBUF0 = 0;
! }8 e6 [2 i" T. h7 U' \! ]2 p9 G. }8 r  s
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
' D# M& N9 Z$ k- x0 ]9 p7 ]    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );5 |1 M6 v& o7 y( @  w& B
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
, m! X, w: w5 Y% P    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );4 i, o' n* o, C  H1 \, N

" q  S" ?8 |2 ~5 M- k    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
: @. k5 H9 \5 z+ ^3 G    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );9 b1 }4 J! C# d
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 0 R7 i; H! h; r8 `
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );! m! g9 e/ j+ V9 T
( r8 _; L& B+ {4 S, ~
    CSR = 0x0000;% F* R; b3 i" x4 Q6 ~- |9 ]
    INTC_INTMUX1 = 0x3d;( ^& u5 p6 P& {, I5 O
    ISTP = (unsigned int)vectors;
5 A4 L' d2 {2 X$ h    ICR = 0xFFF0;  ( A. u7 y9 b, @% K- H
    IER |= 0x12;  5 e, Y0 g1 \" T# |
    CSR |= 0x01;  
- [2 a* |  T1 R9 g( J% N3 f, w+ [5 ~2 F; O
8 Q# K3 U1 e" o; ^2 J) y3 B$ Y- r; W
- V- L! u. A/ W, I" b
还有就是两个输入输出函数:+ D3 }0 H1 V$ G% T1 a
void output_sample(Int32 out_data)
9 T$ k( u  b1 ^0 Z! c{
5 `7 @* k* q' X, _# g2 F3 h( `  AIC31_data.uint = out_data;  
# ^: S, r( g( e, o( [. E. [  MCASP1_XBUF5_32BIT = AIC31_data.uint;
0 M2 |, P% e. }& Z/ k}# Q( W( N3 t& {3 `3 g2 e  m$ L

1 r" X- y4 L; |7 UInt32 input_sample(void)2 W, _. G, x3 A) I
{  
) s$ R. H5 d5 M: o* Z4 o  |8 q  AIC31_data.uint = MCASP1_RBUF0_32BIT;, ?' S/ x. u3 Q  c! ?, i
  return (AIC31_data.uint);/ a5 b0 T$ _, O) x- v: y
}; ~$ Q0 i8 ]- y- r

3 g; V' e' i, H* X# P5 M2 A- p
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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