嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:6 o- V9 v7 ^% K6 U4 r
main文件:- Y+ q3 c( C2 E, l* q8 G9 [: d
interrupt void interrupt4(void)  
7 h1 v/ L. I0 E$ A{. R/ _; B0 [# U- L& H- J+ K
  Uint32 sample;( M7 u0 Y* {$ A9 k* k' z
; [* v3 v& k" Z* i
  sample = input_sample(); // read L + R samples from ADC5 O9 a3 F2 a! s9 p
  output_sample(sample);   // write L + R samples to DAC & a, k7 w' W0 V- x) {/ Y
  return;
) r( v- \9 A1 f9 p' r$ ]}
6 L  K2 w, ?( b5 L) I
: G/ E: F1 p4 j' I7 O$ k1 w. Uint main( void )- ]4 }# i' r8 c& o
{
$ T3 M: C0 i) _3 o
( z' U3 ~! K4 t0 z3 N) T    /* Initialize BSL */
, s8 G* E: K& m* m- f; f    EVMC6747_init( );
  P7 q& O9 H7 W2 K) O5 u        /* Call evmc6747_intr function */$ c& {  C9 j5 o
    aic3106_init( );$ s/ i2 W, |2 E' S  }7 e7 X
        while(1);4 ]& w# e& \! V+ Y' _0 o  c$ z
}
7 H9 t& n( }0 g/ @( U
/ Y8 [' `2 y6 q' d5 I3 |9 {9 O
: z8 U: x  @1 @* i4 A) X6 c" yaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
3 }# I- x+ F4 ]& N1 T8 ^: |1 Q/* Initialize MCASP1 */
2 }/ r" w& H4 L    mcasp = &MCASP_MODULE_1;
+ y) _  y$ U8 k0 g2 M& ]& {    mcasp->regs->GBLCTL  = 0;       // Reset
  K1 X2 I& F$ A    mcasp->regs->RGBLCTL = 0;       // Reset RX
# c0 h# @  z4 b, ~2 S7 U    mcasp->regs->XGBLCTL = 0;       // Reset TX, ]' i8 K1 {& v8 k+ M, D2 S# w
    mcasp->regs->PWRDEMU = 1;       // Free-running, B' S  r1 a4 L
   // configure McASP0 receive registers: y4 \2 F5 a: G" i: w( @
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used* |: N/ L, w& M0 ]& }7 y0 X
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
9 e; ^3 f7 I, e    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
% c0 d7 Y* s4 d! `. G2 c    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side). G+ D4 `8 e7 `8 W: L' m" N$ j7 X
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
8 X$ ^- u# J4 f2 H    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
+ q3 \( |0 ]) c( h: p! w0 ?    mcasp->regs->RINTCTL    = 0x00000000; // Not used
' d$ Y9 Q" n6 }7 q* ^' f    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2561 ~) X1 R0 _9 V* X: U
4 o# n5 m. v* i, d- z$ B2 `& D( J) [
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used! A( O. ~2 e7 Y( m( ~4 W# @: v
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 i8 H+ V; c' b, U9 z8 f    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
" q$ a8 n& H; H+ U* }( P    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
* S: I  X# }* _9 z7 @8 q' F. _    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK0 Q4 |9 |1 h% ^4 X7 X
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
3 \8 q( K- {$ Z2 p  `' a8 Q    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
6 W5 T' N# A" _4 `6 S, D    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# }) d# Y7 c. [6 d* p7 r  ~7 |4 v. f+ p& U1 R
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
  Q# k! d  d6 ?# Z$ w: b6 f+ n" a    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
4 Z% w9 x9 k' a; [0 E% v0 W    mcasp->regs->PFUNC      = 0;          // All MCASPs
/ q3 U4 P6 p1 a    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
2 y) h  N5 e7 p" Z# N' z
. B9 J) R& {% Z7 H% n; @    mcasp->regs->DITCTL     = 0x00000000; // Not used
! r* _5 ?9 F6 q/ g    mcasp->regs->DLBCTL     = 0x00000000; // Not used
3 v' e- H# C. l    mcasp->regs->AMUTE      = 0x00000000; // Not used( `  N  K( i+ G
& x9 c8 B* \/ T& [0 X$ L0 P
/* Starting sections of the McASP*/
8 U+ j: G/ z9 j: O$ e    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 7 |" K. K% H8 M5 Q
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  9 P5 G% E5 V4 L: N2 s7 c
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
9 j2 ^) E# L/ j' n    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );# f( B" r% [" T! j
5 I! I& _8 B7 _, Q# Y: n
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
0 h) `, B; I' I    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );; Z  B& _  L7 S# e& o7 f- Z0 ?, m
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 2 }4 _! w- j0 ]3 t0 ^: S* N" D
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
; B9 J  r9 ^  S0 E* Z. d( j$ {& N+ Z9 X  x
    mcasp->regs->XSTAT = 0x0000ffff;
, C9 z& g& m: e$ |5 O* K    mcasp->regs->RSTAT = 0x0000ffff; 7 t) x/ Y4 J- y8 b

  ^" q1 Z& l+ o/ f2 [- `, f7 x! ^    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
3 @" L" n% w3 ]    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
% Y9 ~% K1 k6 [7 x1 r* `    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 9 ?4 q: h1 f6 l" {1 t7 r* `& V
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );6 G/ k' ~  M7 B) m6 H

0 m% i& N- c! Y9 U. ?    /* Write a 0, so that no underrun occurs after releasing the state machine */
5 B8 r# W% ^0 s6 _. X    mcasp->regs->XBUF5 = 0;3 I6 q9 _, R* `6 Z
    mcasp->regs->RBUF0 = 0;, F1 f9 c1 m; U$ Q; Y$ V3 k2 H

( [8 K9 I4 J% ^& j8 F' d4 c    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ' a; J2 [6 }. _$ E. R# ]
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
( `$ ?% u) C, T- _* @1 J+ r8 }    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 1 V: I/ u2 Q# N/ I
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
- u8 }% u$ @! Y! `. ?$ s4 `. Y1 }# s5 n: y, R! Y! ]
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
! ^4 W5 u- {' s2 `    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
) e( a8 \: J, c/ W, i  a    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
  g2 C2 t) \+ a/ M6 w    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
$ t/ z- L( I  A: [2 B
3 F, T$ f8 p5 e    CSR = 0x0000;
8 m6 Z) O0 z4 S9 `: D' Y8 A    INTC_INTMUX1 = 0x3d;
2 O8 A* \' A" h' Q$ B( ?1 X, h    ISTP = (unsigned int)vectors;
" w: U% P0 i. d; ~; ~    ICR = 0xFFF0;  0 n8 p; Q" V8 x" \4 Z
    IER |= 0x12;  & k  |& G% t7 Q4 q* V" U4 A( I+ q
    CSR |= 0x01;  
1 N5 s! L/ }  i/ t" v3 C9 `
4 f/ h. f) l0 G1 f3 ]& [' ^
1 c- ]# x1 M. j" L' O' y! [) y: V/ E  Y
还有就是两个输入输出函数:9 r$ g% d: Z$ C: O
void output_sample(Int32 out_data)
* n  C9 N; I' }) {) B. k{
- W; F' j0 F) U0 w  AIC31_data.uint = out_data;  $ q2 I; |6 y- i
  MCASP1_XBUF5_32BIT = AIC31_data.uint;" @! ?3 p0 g( @
}% F( D+ W% d* Y5 N

0 {0 H, A5 Z: H6 c0 qInt32 input_sample(void)- E/ \7 ^8 G# Z# r6 B
{  
# J, P7 {" C' P3 b: `/ \  AIC31_data.uint = MCASP1_RBUF0_32BIT;0 x' O9 W3 L0 D. [6 f, r
  return (AIC31_data.uint);
: a$ u- V, {( e}2 N0 \( t9 v( S8 d3 J# H/ {
4 U# {# a& c) n

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




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