嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
: h$ l1 V' v: m7 O: Hmain文件:9 o' R: Y! f% v: t, u
interrupt void interrupt4(void)  1 t4 z# C% V3 `  P6 Q; U8 n
{
  |& {% [3 ~" ~4 ?% {  Uint32 sample;
+ \8 i4 K' T: C! F) B8 x& U3 ^) Q4 ^8 E( z, q
  sample = input_sample(); // read L + R samples from ADC
% |! e4 A- o, {1 w$ o  output_sample(sample);   // write L + R samples to DAC 3 O0 r$ O" p6 j2 H
  return;
5 b. ~- x4 w. C% w- x$ `}- c4 m" O1 H0 y5 N/ _

# |4 ~1 t- L$ w- I% Sint main( void )
' o0 ?* P/ \( c{5 N" a( M# a" ]) F' y9 e
: R( b) s  K( q6 J
    /* Initialize BSL */
& U9 d& N8 |0 s/ W' X- p% U    EVMC6747_init( );% w; p2 I) K4 o& U% d6 j& J6 c
        /* Call evmc6747_intr function */. x2 y0 @0 k' q' K8 @: n
    aic3106_init( );7 f( V3 R: ~2 J$ w- c5 r0 v6 Z$ P
        while(1);- }& K  o. _' l4 P4 d7 M
}. G) K* h+ ~) X" ~; V

  H3 |& f! |8 @4 j) ~; U; T4 ]' ~; \' b- G- C5 Y
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
2 p" f. T$ L4 l/* Initialize MCASP1 */1 }: u) n1 H1 O) a/ ~
    mcasp = &MCASP_MODULE_1;
/ \$ u  q5 `5 j- \- R    mcasp->regs->GBLCTL  = 0;       // Reset
( g9 H: A5 ~' Z) L5 q# X/ g    mcasp->regs->RGBLCTL = 0;       // Reset RX2 u9 U, b; d8 \' f( o
    mcasp->regs->XGBLCTL = 0;       // Reset TX" N2 m; G# U: z% @! S- b
    mcasp->regs->PWRDEMU = 1;       // Free-running
$ K3 R( I! U! y0 C$ v1 N) A5 K   // configure McASP0 receive registers! F9 f+ b5 a! E; B% y3 x8 S" l
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used0 I: Z& K1 x  {; S
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" `( ^5 H# @: E    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
% U8 N- E; Z: h$ ?7 ^    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
$ _1 H8 Q2 l$ g. c! b2 Q1 C    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
% }, i. O) K4 T3 O: O: X    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1: ^6 m* C0 u/ ~# L* R  O
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
7 ?, H0 ?6 K9 [4 w: m    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256. N% n6 x7 X) Y; W, X: v( K
" p% H5 P! K$ T& N' l1 l8 X$ I
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
# R2 S  l" e8 {- M6 C    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus1 y) A8 v1 b3 R& S) ^9 {5 u+ E% ~
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
1 ?1 X3 o: {4 }) B  I: I8 E3 G    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
, N) F. S; g% @( R+ ^    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK- }# p9 Q0 [! `, _
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
: n5 w! K7 l  `; ~  }: Q    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit& P& O" D4 s: {( y7 a' e1 e0 |
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 E$ \0 x7 a( ~/ }0 \0 G, N9 I9 D9 y; q, |
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN; u  k; o+ n2 {2 T& u$ Y
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT: W% i6 B, z" e- K9 \( {( M7 H
    mcasp->regs->PFUNC      = 0;          // All MCASPs' l5 F& E& H4 b6 R$ H7 Y
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1' C5 z0 m: ?; m6 w  ~, q* i
* v- g( l  g5 `" C6 Q
    mcasp->regs->DITCTL     = 0x00000000; // Not used
6 d  w. U8 C" X& Y! n    mcasp->regs->DLBCTL     = 0x00000000; // Not used
% V; h2 e' o9 `* t    mcasp->regs->AMUTE      = 0x00000000; // Not used& k/ U( k  ]1 ?- x

" K, `+ w3 z* o5 C; ?9 w/* Starting sections of the McASP*/, w- P2 D, {- m2 r" Z$ ]+ t/ |
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
* O) J7 S2 s. X& Y    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  4 t  Y- W. \8 f( S* w: Z- l
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; " E0 J: c; S& n* u
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );2 G0 f. _& H5 j
: J# e" h- F6 Z- H
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
( _# D. M/ b3 j( h    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );( {- W) S7 e; c6 A' R* S: l
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
) }3 x4 `# q4 Q1 K  S    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
! h( D( H* f. P8 ?9 F: M+ Y6 c% U8 G7 X$ g4 K/ ^
    mcasp->regs->XSTAT = 0x0000ffff; ! }  J5 J6 H3 f0 [" e
    mcasp->regs->RSTAT = 0x0000ffff;
1 V) M( Q7 W3 L& X# Q0 L* i" Q. @3 q6 d& ?& `% A; k1 E2 N
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;+ E& K: v% g# L* u8 X9 Y
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );9 }& z, Q7 M& R& w& ?
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; , ]( h8 {+ h3 J" z! u+ Z
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
2 v. f. o3 _, }# V5 J
" ?$ [2 [" W5 {& n* A8 c    /* Write a 0, so that no underrun occurs after releasing the state machine */
" l' j$ @- X0 {    mcasp->regs->XBUF5 = 0;
7 v$ _3 p6 k% k9 E9 ]$ U    mcasp->regs->RBUF0 = 0;$ c+ H. J$ c7 \+ |" y
1 h8 {9 u9 q: ]/ |1 j) z
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
& I# ^6 b5 g1 }/ {/ D0 i- X  R    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
1 ~  u) j- l& z. m! [: f9 d    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; % ]) w* E4 c7 e' m& O
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );3 C( D% {, [8 M. |6 y$ {

' d9 p* ]) W9 ^6 e1 m    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
# X3 D+ i) O5 p( W' n& X    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
# m8 N. m* p6 i  l. `8 P5 b. }6 \6 n    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; - \% R( O& G. [1 ~3 W/ _* l, l
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
  }; o: |5 X% x2 `& i5 E) t! H# U' l8 e( N; a7 \4 V! e0 M
    CSR = 0x0000;: f  s9 _- w$ A% T9 r
    INTC_INTMUX1 = 0x3d;" j' W, T0 O8 w- l8 G; O
    ISTP = (unsigned int)vectors;
  F" C. [& k" g0 F    ICR = 0xFFF0;  
  M* S' o$ Y* V+ G7 `    IER |= 0x12;  
# G- \. \3 y6 G6 S) a) p7 H9 q    CSR |= 0x01;  
3 r$ c/ Z7 ]0 O! q" D( Y
) k9 M& c9 t" Q4 L/ f8 B* B/ \' F+ R; U; S5 y% Z  R% F

7 ^- \% O! J" H, Z- x9 `还有就是两个输入输出函数:5 D: [  u5 L+ b
void output_sample(Int32 out_data)* h8 D' G# \. i6 W0 `9 p, {' J
{1 Z. E3 }. q3 k
  AIC31_data.uint = out_data;  % d: t! R2 ~9 W3 O. F. z
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
) y' J/ `3 G1 r. c  V$ y6 @+ X}
/ }# z+ r# J; R' i  j& T# v1 L( D8 ]5 W0 F6 i0 ?* X7 |& j* H
Int32 input_sample(void)
9 \$ o+ _5 f  u{  " P' V) U" v. c
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
; a0 I) q) Z: d5 Z  return (AIC31_data.uint);/ I5 w1 y$ e* {. d. @7 Y$ ~" f% {/ Q
}
- |) ^- L+ d: o  H( ?
7 k$ G9 U% Q" ^* b
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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