嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:# m9 b, `8 s# E0 |) O
main文件:: {3 U+ ]* w' V6 C, c8 @
interrupt void interrupt4(void)  
. T. m( |) V: t9 V3 u, b& z: H! S{' o- u7 U$ _5 n& G) h% u
  Uint32 sample;$ w$ Q  H7 c6 f/ Y6 }( t5 O9 F& b! d5 v

; z# G; s7 _" Y9 `. V  sample = input_sample(); // read L + R samples from ADC
: l- k. c9 T& ^: a- D6 L' l' h  output_sample(sample);   // write L + R samples to DAC 1 H* f0 C+ r; S
  return;
2 M* D% o, C) H. `' O6 V}
  e, t3 x# c* b, F0 ?7 x+ z4 H- k1 N( [% \' }& Z. f5 O  H: _/ U
int main( void )  B; N5 l! R. v# S& K
{
8 ^$ n% i9 c6 M" m! i& X- e2 d5 O0 h& ]! z$ t/ B
    /* Initialize BSL */7 @' i% u$ k7 p, z* ~: L. s
    EVMC6747_init( );4 E" b( U( H2 v5 p" @
        /* Call evmc6747_intr function */
- a" B% h  q! T4 W# R  q4 c    aic3106_init( );
6 p; P" I1 J6 M' W, b5 I7 b" e        while(1);
! t2 J  V1 I. \" \}- m! E: X. t8 \/ z
% k" u) @( G3 N9 x6 ~' y
' j" j! M! L& H0 p& ~' O
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
- }+ t. o4 `! j+ b" D/* Initialize MCASP1 */8 @/ W. s" V9 {3 ]' b& V& e+ `
    mcasp = &MCASP_MODULE_1;5 J4 I/ }6 i5 {% \
    mcasp->regs->GBLCTL  = 0;       // Reset* ^$ ~, A+ x# R( P
    mcasp->regs->RGBLCTL = 0;       // Reset RX
9 r. s; q# U& {* w1 T  S    mcasp->regs->XGBLCTL = 0;       // Reset TX
; N3 v# R& x* ?* R  Q' g    mcasp->regs->PWRDEMU = 1;       // Free-running4 Z" U" `- N# M( ~% H, Q$ ^
   // configure McASP0 receive registers# Z: W  C6 ^- j* W3 E& x. ]
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
" P, p9 R. v# N& W# s    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus% i( d% h2 k9 l
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word' Y7 X, h# B; R
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
/ Y1 q7 K/ A/ b% H  l    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)" n$ x* {5 n7 f7 J
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,10 c- W0 D, R" j
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
6 d9 u4 A% X0 C    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256$ q$ ~4 N+ [* ^/ H$ _

* J- r; W) T% z; j' [    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
) S. k: X, K3 P" E1 ]    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus3 ^+ f3 x' k1 W7 Z  G& a, y" }4 O
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
, s: e& e" _/ u; R9 n, P    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
0 j5 ^, v5 x& B4 g+ n    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
- I0 @3 {  l9 o# E" l& p* M    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
4 d( d  j9 u5 u9 B& Q) L    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
( A6 D. O6 B# @- ]& b! c. h% y+ B    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2566 Q7 d. J2 W! y$ A, Q: I; h  S7 ~

* P2 i, ?% `: J9 R0 K2 d    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
& r$ h/ X  T4 b' k7 c    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT& }3 Y8 }# p; h0 G" S
    mcasp->regs->PFUNC      = 0;          // All MCASPs
* V8 V* q" `( O& `    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
+ P* w- B- G5 B- ~3 H& ~7 B% |. N% m& g3 `1 M3 W/ [% q" k) W
    mcasp->regs->DITCTL     = 0x00000000; // Not used6 j: a( g. Q: I, Z
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
, u0 r7 H- @1 r    mcasp->regs->AMUTE      = 0x00000000; // Not used2 O& g" K+ i6 B* a; C0 V

2 ]6 H/ f& T9 P( i/ F- Y3 y8 R$ z/* Starting sections of the McASP*/+ E  {2 q0 D5 T3 T: w
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
' M' g$ T, e+ K8 j7 a* {    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
" `# l: ?& i; O; m7 a% ~    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
, }/ @' y' L& h9 R$ [    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
. m+ b9 @2 C, V/ g
! y# p( t" {# W) P9 T: e    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; , K) @2 X0 H6 y# Y. ]0 J+ G
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
/ C* p2 K9 J2 O. K/ S. V1 e    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
, f/ y0 ?: I. Y0 j/ F    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );! J, ?  q1 m& i) d
0 _" k! P3 Q* m$ Q% f6 f) B
    mcasp->regs->XSTAT = 0x0000ffff; . s4 K" ?$ P9 w! @% h
    mcasp->regs->RSTAT = 0x0000ffff; 2 b  ~% A- [" V5 g9 w9 B
8 c; |/ O, b9 ]) _; D) X2 e
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
% ?1 m0 E% H: C( g- D. E) K    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );  A. Y# @$ {' ?% \( e: G( M
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;   ^. K* N# x/ w' ?' ]6 s8 M
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );' g  P( c0 o( Y$ E9 d" H5 l8 ?4 P
8 ~$ V9 h9 o7 ]) [
    /* Write a 0, so that no underrun occurs after releasing the state machine */
* O# H+ L6 v4 f  H* O4 _    mcasp->regs->XBUF5 = 0;- @  y4 ?+ X3 Q! y' {2 D
    mcasp->regs->RBUF0 = 0;. J& S$ S8 b6 B/ h3 Q! f- p0 P7 K
* X3 ^" W2 _& N0 I" K
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
, I# e; h/ q! d5 b8 N  e4 j& Y    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );2 i  ]& y0 C% z
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
; s% I& h1 K3 c    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
& V& K6 y4 [- C& }+ p+ Q
1 J1 K$ V. U) G    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
' e  e. P, }- C4 t9 ^; ?( S5 V" @    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
* m& Q/ G' V6 ^5 N5 M    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ; T  p8 V/ R' U! m6 h- M
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );  s1 Z( M* ?/ m- O# }, @+ S
" k7 k& S- z7 [% B8 K8 s* n
    CSR = 0x0000;
  u* e; V, O6 W& F# S" r9 O' {    INTC_INTMUX1 = 0x3d;
* ~2 e* V$ b! w" T6 E* T  C    ISTP = (unsigned int)vectors;5 L3 P1 W7 Y3 W  x: u3 y
    ICR = 0xFFF0;  4 Q- Q9 s$ M: \0 o+ Z! h
    IER |= 0x12;  
; O) O1 y- p+ L- j, o& m  h6 C& O    CSR |= 0x01;  
# N; j4 m) j7 }
1 t8 o& y6 l+ x9 |1 W% S' D4 ]+ F( h8 }+ G5 E2 w' W- A
" R5 L6 t4 B% O
还有就是两个输入输出函数:& i6 J) P8 D! |9 u
void output_sample(Int32 out_data)
0 ^! V7 B5 |3 u/ E! u5 B{
- e2 l) Y* ?3 m8 ^/ b* I+ i  AIC31_data.uint = out_data;  ; {$ d$ T" H. Z. p
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
& z, b; M1 u( u# o) g- r: |}
. V' ~- P9 ~, s: I: ]! z, ^* Q7 d1 i2 c" e- h
Int32 input_sample(void)
0 h" w: J  H9 b( z, j" ~2 N{  6 l3 Z' _" a5 q' k# Y
  AIC31_data.uint = MCASP1_RBUF0_32BIT;' W, o2 f" |' [* T/ A7 h
  return (AIC31_data.uint);/ [% C& D9 ~3 I, k4 O
}) w, W9 g! Y% k! @( J  W# M

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




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