嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:- ~& H. d% H. G( _  x3 R! y
main文件:
; K9 f, ]! c8 Q* i) w8 q3 @interrupt void interrupt4(void)  0 @; u! h9 {% z" t* ~
{6 G, `9 D1 W7 t! _3 _1 V
  Uint32 sample;% L2 [5 i* `5 P: p  o
; {' a, Z( I% Q0 C! N. V2 x  b
  sample = input_sample(); // read L + R samples from ADC+ [; H& n  v: b; V9 i0 g( j
  output_sample(sample);   // write L + R samples to DAC / D4 M% k$ x; N( x
  return;
6 S" G( j+ f- G" o$ ^. _! R}* s( Q/ B- d, q1 m  I7 M, ?
; |. B% I: S$ |7 t
int main( void )
( M4 r* c5 f3 I{% x2 Y6 Y, L. q: l

4 i$ }2 s! U' S# Y2 l. ]1 c    /* Initialize BSL */+ f5 l5 w/ d, L5 \
    EVMC6747_init( );. b8 v% s6 w; q  s: u
        /* Call evmc6747_intr function */% l; v3 o  ~4 ]+ C% B& x/ O4 \! k
    aic3106_init( );+ f5 ?: x2 ^3 m/ A2 |) n
        while(1);
/ F  K) @1 m  m1 J6 q" }! t2 t}
/ I% K. b& ?9 N4 O1 Y$ l) X: E2 p0 K1 Z. a
3 C6 R) u& o( [" T6 Z* U" ?
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
0 {& f3 v) H: `+ w/* Initialize MCASP1 */
$ t9 @2 i, ^& U3 p5 r3 t    mcasp = &MCASP_MODULE_1;
) Q( i# b& ?: k1 I    mcasp->regs->GBLCTL  = 0;       // Reset8 ?( ]. H) m( ^. Y
    mcasp->regs->RGBLCTL = 0;       // Reset RX& f, o% `8 i& z4 C5 t
    mcasp->regs->XGBLCTL = 0;       // Reset TX
+ }' m: Y3 e# E    mcasp->regs->PWRDEMU = 1;       // Free-running& a) D! }  Y; v3 F1 Z. s2 v/ C
   // configure McASP0 receive registers  R( y- t/ o) ~. N6 X8 ^
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
! r+ y1 p' b: p6 C7 l* S1 f$ j- b    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus6 Z4 b+ t- u. d! P% q* r" W. A) r$ F
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
7 l9 G7 ^9 n+ E. j7 p2 b! c    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
5 D+ t& V& ~: e3 p# Z3 ]    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
$ {" ?3 J4 b5 V8 I4 w    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
4 h* `. P% |9 v( `% g    mcasp->regs->RINTCTL    = 0x00000000; // Not used# a3 v3 `' n4 L5 [9 g
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256* I- h% q! x8 H1 o+ K) }

, g) k! D, }8 I  L    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used& S# a; C' t6 o$ s/ Z3 ~' X
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus2 D& T5 U- Q. q
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
' H/ Q, j- l* v) W% M5 |    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16! @* f9 e2 K. v* Z: W0 M
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
% Y3 y' s$ K! q    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
8 \! \' X3 G, @6 f    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
$ E! `, O) i, i' j( l! k    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# M/ _7 ?8 P% J2 h5 P) n( I& S# T6 ]: [* l+ [
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
/ M" [; w: y6 o3 i% ^    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
9 ?+ ]. ?/ s, v  U    mcasp->regs->PFUNC      = 0;          // All MCASPs4 b& s& @2 G8 A, t! ?
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1  r6 X4 \, d* O2 f* E) p7 X+ `* W1 [

, X; p5 g3 n: F% T9 Q    mcasp->regs->DITCTL     = 0x00000000; // Not used5 x; I& T6 d( y
    mcasp->regs->DLBCTL     = 0x00000000; // Not used5 `" e, p2 L, z9 f  ~
    mcasp->regs->AMUTE      = 0x00000000; // Not used
; S" X6 c9 l9 M$ [! Z. [# q: P# P5 z9 J
/* Starting sections of the McASP*/
# [; c! n# d& {$ J# p1 ~    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; , b, m5 b0 W/ {- i" }
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
4 n* ?% y1 P$ W% |: ^    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 1 J) o" d" `6 B+ o
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
  r" t8 N, R. I' E8 M  ]
0 Y: w; Y3 ~/ d) N/ f    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ! o: u! R. K) \! N8 J8 O+ W
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );/ l. A! [. w3 i/ x; O
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; # @+ c- |& q. T5 [8 n0 W* W
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );4 A. o$ ~" |' e

5 Z5 \" b( [2 D9 }, `    mcasp->regs->XSTAT = 0x0000ffff;
" B) L4 p$ L* h: u% M; g" f" }    mcasp->regs->RSTAT = 0x0000ffff;
' B* I- J7 \) _3 \  ^5 i9 d0 E5 w! {/ u4 [$ I
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;+ T- v3 z3 F; d' f7 x
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
% Z7 o( [  Z3 i7 ]; R# M5 W5 u    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 3 l" T/ @% \  D4 s6 {1 g8 |' C
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );$ ?' T. y7 k* v& l

% ~# {) Y) R, |* n6 A    /* Write a 0, so that no underrun occurs after releasing the state machine */
9 I% ]* y( b5 h    mcasp->regs->XBUF5 = 0;0 o2 I( s  m: X& S# f4 E
    mcasp->regs->RBUF0 = 0;
  O% B- t( i! s  b+ s) H1 W0 M" o( D4 ~. n  u: b! k# x+ w. K
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
- k9 w) z5 x. q9 x    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );' l5 _% X7 \5 x% ]
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
  V2 x. v* p. q, H/ t/ ?    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
" f) w  }5 A+ c  L7 C; P/ `7 _1 W$ F5 \
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ! M, Q  z9 h" P& k+ k
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );4 d. D* c  A% E$ @  p4 B
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; & _' J1 ]9 p- J8 r/ L# c0 p: B
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );( G6 b9 v/ A% y& L0 c9 x* W9 V  y4 L

0 J! P3 K9 j4 N0 ?. ^    CSR = 0x0000;  F; {! ~$ b) Q% @, a
    INTC_INTMUX1 = 0x3d;  k, ~* A2 R3 k4 m
    ISTP = (unsigned int)vectors;
# m: s7 `/ G0 t% `2 W' O    ICR = 0xFFF0;  
6 I- F4 j  O$ P9 n) y6 K+ i    IER |= 0x12;  
8 S) f1 R% S- @' z* {    CSR |= 0x01;  
: e/ ~  I* _" w2 m
5 ~; R3 E7 F$ o+ s- B- @
# f* Z. N# z" O# t* _8 r; H6 _) E: i
还有就是两个输入输出函数:3 Q0 z& F# Y3 Y4 @3 L+ i
void output_sample(Int32 out_data)7 A# X, C* W$ O9 N; ?/ {7 i/ ~
{- S- K: I4 c! N% n( I9 l4 S0 c' A
  AIC31_data.uint = out_data;  
8 C& F. B3 f' W/ w2 [; e  MCASP1_XBUF5_32BIT = AIC31_data.uint;* `! }3 e  h$ r7 s9 f. H1 J. S
}2 a8 c# z; L/ }( ^8 U0 i# h

# q$ @8 L/ L- E4 {! L2 r4 DInt32 input_sample(void)# q8 S" w# |9 R) l
{  ( V" A6 E1 A! y$ ~, R& R
  AIC31_data.uint = MCASP1_RBUF0_32BIT;$ k" ?/ l" i- ^" @  _) D  G, x8 a7 L
  return (AIC31_data.uint);
$ d  d/ B2 a- a7 @}
# x; i4 i2 s0 v! R) _" ?, }5 P1 ^" C6 r% q' c1 O) R

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




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