嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
9 c+ z" h: x7 Q& R/ ymain文件:+ l/ t4 p* J4 \
interrupt void interrupt4(void)  
/ P' _' V$ _% B5 I8 J& d{
, o; M5 P$ w2 Z# E  Uint32 sample;& U& d7 B, T2 @5 y( S7 U

) j) K* X3 r/ r' F" _2 ^  sample = input_sample(); // read L + R samples from ADC3 o% Q  v& f( T* C
  output_sample(sample);   // write L + R samples to DAC ' c- q9 z+ \+ [5 P: a8 `
  return;
, ?  j( ]% p% q$ K0 l& M; f}8 h, F$ ~/ s/ s/ H- X7 U0 W5 F
( _1 J3 ]1 u' `8 v2 Z
int main( void )
6 {1 m$ y* ]8 M" ]' C{
4 m0 j& P; S7 i; G) g
& r' c7 L4 s; }+ P" G    /* Initialize BSL */4 f: w8 W! h- A+ W7 J4 v1 O% Q
    EVMC6747_init( );
- E# m6 w5 E. G) {$ g        /* Call evmc6747_intr function */- X: A( b2 P: d! p9 \! A
    aic3106_init( );
% o. B$ c% Z* x2 n$ f9 j" x8 Z        while(1);
- ]* t: P( p# {6 ?" g/ i. R. u  i}0 \; s# k! Z& M- P, }: U) {5 u

3 b" W, l0 Q) x4 V" u0 ^3 H% n
3 B+ I, l: E- u0 S0 daic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题4 z; b; s: E, A8 W/ t$ ]4 Q) ]. l+ e
/* Initialize MCASP1 */
  Y9 D, B1 l% d* ~: ~    mcasp = &MCASP_MODULE_1;
9 I' ]3 F: J* a# h    mcasp->regs->GBLCTL  = 0;       // Reset) W1 S- @2 ?* j2 f. O6 n, t
    mcasp->regs->RGBLCTL = 0;       // Reset RX
: b% a9 p; O+ l* M7 V6 A    mcasp->regs->XGBLCTL = 0;       // Reset TX
* ?, m8 K% }) {, d1 c3 h$ S    mcasp->regs->PWRDEMU = 1;       // Free-running9 |; J1 B9 K, P. |5 L7 V
   // configure McASP0 receive registers
/ }  Y$ U5 D. v" g! U% c    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
+ Z" j" M# Y, q5 {2 B1 `2 R" c1 F    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus' Q" f" h; c, }) }
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word) [: n$ U7 g8 z* A
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
) z. f8 E4 Q  \! X1 y1 s  w    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
1 f( }& h: r& c6 }# v. k    mcasp->regs->RTDM       = 0x00000003; // Slots 0,14 u/ @7 d: _9 }, ^! |
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
( m. U; N+ n7 D' r  T  e7 P0 g+ T  l    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2562 I2 G3 _0 `% [7 _$ R) c5 `* ?
6 [& D# ^/ B3 N/ v
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used/ }% t' K& K* Y9 |
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus, q' Z7 @. E4 _. \% Z8 d- w
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word" O; z; X4 F0 q+ q" G6 m( w% t
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
1 v, H" w6 |- p, Y    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
' L3 {2 Q6 K/ ^- J    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
+ s# V, F" f6 k$ g2 d    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit( m" U  k6 Z+ k0 u: @
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# x* c* j! J+ B0 \& B4 D# y! Q. r
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
( s0 J& H. H  a5 q) i6 |    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
: |0 }7 L8 y9 z8 v' F) |2 w    mcasp->regs->PFUNC      = 0;          // All MCASPs
; j. p7 v' u" @  v  m/ o$ I    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
3 b. I4 ^# u7 O$ N
  o  K/ s4 R% D+ B6 s    mcasp->regs->DITCTL     = 0x00000000; // Not used
- F( C; R! z0 w5 X2 x4 V    mcasp->regs->DLBCTL     = 0x00000000; // Not used
, M: M$ A0 u* x8 ~, h# |    mcasp->regs->AMUTE      = 0x00000000; // Not used
$ `* g0 i( W5 C$ S, d; A9 ^  ^1 q0 n, c$ f( \1 E
/* Starting sections of the McASP*/" ~5 x6 }/ \/ o* g& C& g5 O; u
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ) _6 K  x  t0 `( m) m, M
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  3 y! E0 e: J4 v4 g2 }/ p7 L
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; . S7 i* ], d2 D/ |
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );: o3 ~$ ~7 n8 }0 q; r5 I# A

1 H  K4 r, D% J1 x$ N2 h    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;   r* }8 w+ \- Y6 s$ R, O) h& |% r
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
9 }; B3 Q5 E) Q5 w1 b% l    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; " o) X5 c# h0 u. T5 l: n! q5 a
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
1 X) H3 _! t5 C6 u, _2 J9 Y; v& V' t+ _, B
    mcasp->regs->XSTAT = 0x0000ffff; ) G. {1 F+ \9 g, _" q
    mcasp->regs->RSTAT = 0x0000ffff;
0 A$ K% s, ^( g3 s0 S$ P/ N) L
5 o' z4 j9 W7 S' C. G: H    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
% C) [3 {9 Y* }1 t% \    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
8 N: z7 F8 l8 f1 f    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; : g! c$ l% ]* w
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
4 v- v6 t5 R! D' w$ P
( y) X( c) G% H9 ]1 e5 B; \    /* Write a 0, so that no underrun occurs after releasing the state machine */4 l: C* o4 r+ W: P
    mcasp->regs->XBUF5 = 0;' M! }- d( @# k# g
    mcasp->regs->RBUF0 = 0;; K$ T' R4 b5 F  v: H+ H

6 k7 M% Y4 `* V0 N% l    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 6 S8 r& D  I' U) \8 o
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
) [) A1 ~6 A# ?! p) C    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
; v! |" d+ F. ~* }' A; q; i    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );0 o* S' d2 {7 O/ C* d
, z  k/ L) r* p- ~  P9 ?, }
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; , c9 V( `' J- f4 {( Z/ l# i; n2 V
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );& u! V' ~( G. ]9 X! ?
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
2 ?1 q. f9 @! Q! S# Q    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
2 v$ f& \* U1 q7 v0 j5 k( r: n! B3 Z5 I
    CSR = 0x0000;, `9 x6 b3 o' k
    INTC_INTMUX1 = 0x3d;# g7 m( m9 B2 F' K
    ISTP = (unsigned int)vectors;+ E3 `! z' L% K2 S
    ICR = 0xFFF0;  * s$ u6 d' |1 J6 U; i' V
    IER |= 0x12;  
* k, `) C& I9 }0 s$ c; @    CSR |= 0x01;  
" S8 ~- }+ h9 _0 @0 v9 A
6 e8 S' g7 c2 o
7 O7 a& ]5 B6 I5 Q5 g2 U( l' X* T; I/ I+ f5 e2 I2 h0 ?' J
还有就是两个输入输出函数:' B  Z! L5 V& S+ z5 I+ X
void output_sample(Int32 out_data)* A2 i) ]9 _' m
{
( _4 I, c5 f# p5 d4 C" @* \: p! Y  AIC31_data.uint = out_data;  & x. a& f9 O; D8 I4 K. y
  MCASP1_XBUF5_32BIT = AIC31_data.uint;2 P& s! ?, N9 C  D# D
}- a$ |2 B) s# t4 D% w/ H

  ]: C- a# H' m, f1 QInt32 input_sample(void)
/ o9 Q6 q5 ]" Q* |: Y+ r. m% W8 K{  ) V" N4 a' }, f4 ]; Y# h: ]  V( J% ^
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
5 M. R- X# F: ?9 _1 e  return (AIC31_data.uint);# A" ?& Z7 J5 v# @
}9 S3 p6 ]" G. N7 b5 H5 M5 `7 S8 g
" B2 y: \! Q4 ?1 ~! N3 _7 M! `

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




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