嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:2 x3 L" Z; {# V6 p/ e* `
main文件:6 e1 k# U  a5 o8 D; n. [- F' E
interrupt void interrupt4(void)  
1 B1 p: v8 `& V  M{
( `: X- Q( [5 q1 C+ w0 T& m; `  Uint32 sample;& ]) ]! M' }! K/ n# m2 i

. m5 o1 c& G0 A% C! @  sample = input_sample(); // read L + R samples from ADC
, R) j# p4 b* |: [3 w7 P" G- ~  output_sample(sample);   // write L + R samples to DAC % w0 T- D& q; ]: R6 M( f$ X
  return;4 f' l: O1 o% t7 z
}
" K% O+ W, b1 w# K4 O, u
3 ?) f3 L. g/ O  aint main( void )
3 D$ n$ p5 S. x- b5 E{, ^8 g  d* {; e4 W3 W
  c8 U; V$ a/ B2 i5 o6 Y/ G
    /* Initialize BSL */( {! M  y/ d/ W% O( w5 L
    EVMC6747_init( );" f9 H3 t% x4 i% D$ Y4 P, ?( P
        /* Call evmc6747_intr function */- K9 h4 S- m1 C( Q: c7 Z3 k8 {1 s: m
    aic3106_init( );
/ C3 l7 y6 q- ~/ x7 |: Z        while(1);
% s9 [9 _6 y4 J}+ E- g* Y6 _* L* q  r# n

2 {6 s( @( r; J, \( d2 r
& u- R/ R3 ]2 r' ]/ g1 taic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题+ U/ ]+ g% Z/ F" z) Q( Z
/* Initialize MCASP1 */5 w3 u) n# M2 `
    mcasp = &MCASP_MODULE_1;
3 d- t, e" ^! i! n$ B    mcasp->regs->GBLCTL  = 0;       // Reset
, v4 s/ Q" L8 `* X# L8 \    mcasp->regs->RGBLCTL = 0;       // Reset RX3 q0 `, G8 p1 D! h3 U" {" [2 r
    mcasp->regs->XGBLCTL = 0;       // Reset TX1 x7 m. Y2 F2 Q( a% |
    mcasp->regs->PWRDEMU = 1;       // Free-running
7 C/ E  E+ V7 |& K" P   // configure McASP0 receive registers5 `  ]( X3 @, j7 }
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
) Z) f6 |9 W6 U" |6 d    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 Y4 S. c' |0 C6 d) A8 K( ^: ?    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word. ~; S% M/ v, P; n' ?
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
/ V. N! b, o. t; l  d* T    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
% ?2 O0 Z$ h8 K    mcasp->regs->RTDM       = 0x00000003; // Slots 0,17 b3 y5 \/ o% j9 |, t- X& J! p7 N
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
( m" G1 k5 L  b: B/ g7 N    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2569 w: E) e! n! Z1 {" j1 m2 T

+ N. `4 C# J6 w5 c    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used" k5 q  z; ?6 s
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus2 t- p3 }3 s8 f" x9 }
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
6 ]# C1 j# C  O, I# J: P( q! K    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
' W0 k; t0 O  a9 Y2 I7 m) S    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
0 t( w4 F% \+ Q    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
' g; E0 h9 u* k/ A# x  C    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit, z: `' o- F/ C/ ]
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256: A" w9 C. F/ z, B1 w+ o

4 D: p3 d$ u) A; t    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
( ?- C! g2 M+ ~+ U6 r    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
% T9 L2 n2 R& A    mcasp->regs->PFUNC      = 0;          // All MCASPs
/ M2 `* d/ n- }3 R, q7 _5 ]    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX18 ]# l: y/ o) b+ B. J/ o! K7 @

8 u7 [8 x$ S! P4 S9 P, B0 R* C    mcasp->regs->DITCTL     = 0x00000000; // Not used
) R& L- e* p9 f; z    mcasp->regs->DLBCTL     = 0x00000000; // Not used) g4 m2 D7 ~9 g) \
    mcasp->regs->AMUTE      = 0x00000000; // Not used3 f. A" b5 p8 m, u" y" x6 p$ @

/ m6 K+ v1 G7 M- q! w6 V/* Starting sections of the McASP*/
+ g& c1 ~0 ?8 [) u/ N" K# J    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; . G3 d, _) r- m) V( }4 x
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
. n8 _; @1 ?, r/ L+ j    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; # b! I% |! R( |7 \  u6 @6 y
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
3 t! p: U5 L1 h9 l; L
4 f  x! l: `8 }' K    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; / _- i9 N" e5 k$ Z
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
; [, p$ E. {; v, r% V. W$ N  [    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 8 w4 U) z7 q/ g
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
3 ^8 c. u9 |! T9 E+ M# l2 X2 [! m2 A
- @" k: U/ p/ J1 w$ A& _    mcasp->regs->XSTAT = 0x0000ffff; : ~" q- c/ ~3 @
    mcasp->regs->RSTAT = 0x0000ffff;
. ]! P$ j5 D3 x& B, _) k9 ?" J. S  H5 b' U
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
. g1 r& C( l1 ]* n9 o0 |. {    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );0 d0 [* W+ I) u# J5 X! n
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
/ ?. |2 R' X8 z6 L    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );0 o/ M+ v/ {0 n- h! I

1 f4 V( F$ w/ I" j. h6 G" O    /* Write a 0, so that no underrun occurs after releasing the state machine */' Y, u* |' L) @$ r$ P
    mcasp->regs->XBUF5 = 0;# }/ f. E& W: m# y# o* r2 i$ O
    mcasp->regs->RBUF0 = 0;
, T% V5 S, y5 E" C5 L5 l8 q/ w. N' m0 {& \0 Q: U. C- x
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; % K4 M. ^$ j; q, q) n
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
# }1 t2 n. F- E    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ' V2 o7 F0 n( f
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
- _, C* d/ |9 o% E) A7 o  A$ Q/ M1 G; f! u
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
+ L# E, h1 `& {9 |6 l- y    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
' d9 M, ~3 ?  h2 J( o    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
) s/ N' T9 G9 H7 g9 Z+ n    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
' N! |) s) _6 _# I3 E- x+ j' s$ q/ v7 }9 N
    CSR = 0x0000;
0 O$ y5 d8 j- k! h# @: Y    INTC_INTMUX1 = 0x3d;, m/ y0 i* ~8 l
    ISTP = (unsigned int)vectors;" \" t4 A8 B1 Y$ N! N. H, T- Y' _
    ICR = 0xFFF0;  
! _- B5 t' `# p/ t    IER |= 0x12;  
1 K9 C% a/ e6 @2 i9 X) M* ]    CSR |= 0x01;  ) P) T! B5 e- a# v3 r% A  u) c$ z: z

( Y: _) T$ R! O4 A( a# _
- z. {2 q/ w( K
1 X3 c1 u6 B& \& L3 k还有就是两个输入输出函数:
, z: [5 s# P7 p5 p- `void output_sample(Int32 out_data)& h2 \# I- m. j3 y: r/ |
{
! \  S7 P' r1 i) w  AIC31_data.uint = out_data;  ' P' ?% @7 b4 ?, D, o! R
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
1 T/ k* t; p, c4 c}
5 @5 I, |4 X" M8 I) J
% A0 O- m( K- L2 j7 s; z7 jInt32 input_sample(void)
1 t1 L* g. N% u, ?7 U{  8 C# r3 p' `, Y4 q) q2 x
  AIC31_data.uint = MCASP1_RBUF0_32BIT;/ X$ R% n$ y; }7 J9 G+ @+ K9 O  t
  return (AIC31_data.uint);/ z4 S0 N$ F; L% d5 |. y
}( O. @" d- G' h8 R2 Y
# O4 {! X- w7 G' c# T

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




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