嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
( U* a4 _1 y3 U& `; G' K( zmain文件:& f* m5 b  \9 C* X
interrupt void interrupt4(void)  
& d: J0 ?5 C, d{( y  t5 \) c8 W. B
  Uint32 sample;
3 b1 y* H7 j5 o0 E7 p
# T& E$ u" p( C' a+ U  sample = input_sample(); // read L + R samples from ADC9 l9 A3 i, ^) Q2 i  @0 d9 z
  output_sample(sample);   // write L + R samples to DAC 0 k4 K( M" ?- H4 H. n8 Z
  return;" `- \+ k3 h9 w0 R9 @
}, W* C  ~! @  q* |( S6 r4 G
2 F- r* ~' O/ p' z* \) W
int main( void )+ ?+ ~( F4 K0 w  y; ?- t
{
' Y7 u, M: z6 \, y/ f
* U3 q- G2 h7 ]8 f7 q; q    /* Initialize BSL */1 ]: K% R9 ~. H; b* n# I3 g
    EVMC6747_init( );
5 W/ L! w/ _; m# c% T        /* Call evmc6747_intr function */
% m) k- j% O3 B3 Y  ]1 y    aic3106_init( );
. l. g/ c0 ?. _* z        while(1);% ~8 d9 ^% p$ j: O" L, V8 k1 \
}
9 W  i* V2 ?, Y; {# t2 c' r: w, [6 t

7 R2 v4 k$ d0 d( G9 J- k; m3 ]aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
. S" K( \' z  T5 I' T9 y  V/* Initialize MCASP1 */
5 h/ B* V( Z' h) w; O    mcasp = &MCASP_MODULE_1;
% s8 b3 M" j8 ~$ N    mcasp->regs->GBLCTL  = 0;       // Reset
5 p* x1 r- U) Z    mcasp->regs->RGBLCTL = 0;       // Reset RX  x2 X* ]; {9 [' t2 X  |
    mcasp->regs->XGBLCTL = 0;       // Reset TX+ i3 T, u! x" v+ l- V9 _
    mcasp->regs->PWRDEMU = 1;       // Free-running" G. \# F2 |" U4 w( ?+ s+ J
   // configure McASP0 receive registers) p6 B8 H& k( ]
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
2 G% |: \8 E  T/ x& y% y) |    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
$ A/ Q6 o' A% F$ a5 e% o9 |. {    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
$ B! O! x2 S" z$ d+ K2 \8 V/ z9 _    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
9 N% p* B: r( D4 V    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
; q- k' Q" F3 ]9 U    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1. Z9 K( X# C5 N" x. \  n- X
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
4 F$ }- }9 j( i4 K3 o' ]% y& V2 C    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# @2 g' h$ \2 k
, ?* W/ n; z5 `% b8 @5 L# e    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
0 n& R! z, O( G5 }7 c3 B    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 q7 L$ }* d9 l+ \" r" y" m7 a    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
2 v3 T% S* s2 N! [: O6 @, V    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16' ?# q8 Q- ]3 G4 d; g$ B8 E
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK9 u( [3 J2 P2 z9 j) P, X/ R* O
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,13 Q# Q. p# i. D9 V* G$ N
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
/ A- P- A* E) Y: [) [    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 O8 C5 Z5 K2 Z% y7 ?2 Z2 o
% l& a$ w0 t- m% U    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN  \5 V0 _  N; N- l
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
6 L5 t8 a6 Y5 f    mcasp->regs->PFUNC      = 0;          // All MCASPs# x" o: C# [9 ]2 d7 T; p1 P6 I0 }
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1& F' W9 T" w" `! U8 P
: z' v8 j% E0 H
    mcasp->regs->DITCTL     = 0x00000000; // Not used
! b$ L8 C/ I( V0 N2 \6 B4 ?7 T$ S) v    mcasp->regs->DLBCTL     = 0x00000000; // Not used
8 v5 W2 J0 k* K. `' b" B; B! N    mcasp->regs->AMUTE      = 0x00000000; // Not used& W% G/ ~* _: I! o$ R3 J4 l) _

4 }& t. w2 w7 d& @9 T/ H/* Starting sections of the McASP*/
# b$ V2 j% M9 V- K    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; , N' ^9 r5 t; F' Q  u7 O" T( m
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
9 S; ]  B% B2 f/ M2 ~: d2 h    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
( X1 Q& {! I0 O/ ]    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );' o3 l. P8 K9 p! Q
3 I7 ~' t  T# O- n
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ; w7 @2 Q# E! _$ E) o; D
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
  I2 l) U. S8 [    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
$ ~7 _0 A: L; @' l' X4 L    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );# }) G% b- b" q- B5 o- y# @5 e
/ L1 o* d8 M( m2 B. O* h" l
    mcasp->regs->XSTAT = 0x0000ffff; 9 Z% v' |5 @& s" c
    mcasp->regs->RSTAT = 0x0000ffff;
) F2 B0 s. t6 M1 H( u
6 v5 o  w+ o/ z# T/ o" P/ n* E7 n    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
4 }# Q1 }! ~* p. J& @8 ^    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );9 c% h1 M& a' Z: m8 m+ |
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
9 B9 [  N6 p: d    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );; Q/ Z6 B. a# ?% s$ J* L6 _* L
/ z" C! F4 P) O1 A1 h5 ?0 v
    /* Write a 0, so that no underrun occurs after releasing the state machine */' O; H  I9 @% O+ g1 }4 ]& h
    mcasp->regs->XBUF5 = 0;
9 i$ @- J2 D$ C  D  j4 Y" G( d5 l" P    mcasp->regs->RBUF0 = 0;
1 v, I; N9 e6 @; U' g" {  G' X* C: E
; Q1 }# q7 ^8 ?$ p3 K5 `    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
( ?$ A$ ^+ B+ }) v/ S    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );! X; c8 O0 V2 _, ?7 o
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; : b) D! \3 Q+ {+ W5 X+ H
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
# L' e/ |2 A- A+ U. H
" S* R! @) C3 T5 c    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
+ _8 H; a, o" x2 w# z: Z6 W; `    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
/ G: s* C- g; {. K    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ( S) U+ `5 U8 w
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );$ y- i/ O8 I7 B2 C& b" B( K/ _9 L
  l/ y+ A' ~; Y+ Q# q4 f
    CSR = 0x0000;
( I: y  D) j& C4 `+ i    INTC_INTMUX1 = 0x3d;
% G8 g" J7 a' d$ d/ v+ z6 F/ a& F    ISTP = (unsigned int)vectors;
/ y$ O/ i- p" ~5 ]- S    ICR = 0xFFF0;  
0 h' N6 U  ~2 [8 L6 @- B) I# M    IER |= 0x12;  0 v5 i  R6 I/ o
    CSR |= 0x01;  * @% v, q5 Z  g) V% T3 ~/ r' j
2 A. y+ y0 P# J) m# _
* s. ^: }% T+ A- x* b. l
2 t5 L6 a* Y; r- T  `6 @3 R! i( |
还有就是两个输入输出函数:
7 V6 w) W' Y$ x$ m/ a* _, n0 Bvoid output_sample(Int32 out_data)
2 o8 n0 p/ ?& b8 c5 G% k2 R{% G$ V3 c) _8 @7 W# h! k% e4 R
  AIC31_data.uint = out_data;  , |/ V" d9 ]: p$ t# Z+ x  u* e5 u
  MCASP1_XBUF5_32BIT = AIC31_data.uint;, I" X6 _( K6 B
}( N, Y: q  G4 ]. W3 t8 ]
! q; C' ?3 {2 Q* v
Int32 input_sample(void)
3 ^+ G* B+ q7 m{  ) l& g4 H0 b& O2 ~$ Z
  AIC31_data.uint = MCASP1_RBUF0_32BIT;: ^6 E+ X) t2 H; z2 ^
  return (AIC31_data.uint);
/ W  P' e+ O- t7 ^0 C) ^}
2 ^3 I* }' n9 B% I0 R5 \+ f/ L# t: h. F' ^

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




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