嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:7 R$ l" g' B+ `( z  R, g
main文件:) C. P1 {7 o! H
interrupt void interrupt4(void)  1 y6 Y! f+ W' m2 q1 j. V6 }
{4 o' \/ a) F3 t$ o, e# j, F
  Uint32 sample;& @7 q0 Y% |8 t) @) L: i) G: n
# j5 Q2 g$ a' K1 I/ Y0 Y7 \4 O- C
  sample = input_sample(); // read L + R samples from ADC/ b$ y; D/ R) B# Y- j. q1 I+ f
  output_sample(sample);   // write L + R samples to DAC 7 I# }, _9 L* t- g! y" e* c8 S
  return;: v/ u) O& u' O/ d  r8 \
}
* v" M" ]6 m  x  }4 C* L1 f  o4 F3 C) T' Z
int main( void )
: q) B! `, \) v% I1 u  D{) L6 y; w9 B$ y

. k) A, r" U0 `5 ?4 [/ c    /* Initialize BSL */. ^- N% Q0 b. t& C+ k
    EVMC6747_init( );9 z- v( M% y% z8 L9 o1 V
        /* Call evmc6747_intr function */
8 X' {* S; t2 g( Z    aic3106_init( );
$ ?' F! _. N' q2 q5 O        while(1);
1 |6 y" Q& g) q$ O* f+ h}
1 `2 e. h  {4 z. z8 Z; C
0 h& K: k( h; U  ^/ I  M& f' Y: s9 p; w6 \
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
% O" V/ I7 E* ?! G+ I/ y/* Initialize MCASP1 */7 j( l5 p/ d( g, y4 x+ a' [
    mcasp = &MCASP_MODULE_1;- R8 U8 S) v' K8 ^1 y
    mcasp->regs->GBLCTL  = 0;       // Reset: q% A' T0 G* B
    mcasp->regs->RGBLCTL = 0;       // Reset RX% o+ Z$ I/ \, ^0 _" G
    mcasp->regs->XGBLCTL = 0;       // Reset TX& c! {  B1 U% C! c" n
    mcasp->regs->PWRDEMU = 1;       // Free-running
# i; ]& i8 b" v+ ~   // configure McASP0 receive registers
3 ?; k  i5 l0 a4 x; L% }% r1 ]    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
8 c* ^, I, |* p1 T    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; S" ^7 M5 ~# C    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word2 x5 }+ Y1 A7 x: \
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
! S4 X. E* Q" A! ~) Q" V& v$ R# [    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
" n: M' y  n1 f* A  f8 Q& o9 N    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
& c) s/ a' d3 b    mcasp->regs->RINTCTL    = 0x00000000; // Not used* U# Y# ?! i- Q$ T* X& o
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 R* U' s, p+ m6 n  x- f
1 J: z3 x% h0 V$ C7 r% E    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used) _1 n4 J9 F6 J- p
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus) u' f, R% [5 Q
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word6 A. O" ^/ ~. }- K
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-160 g% f2 l. f$ r% j
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK* ~' C9 T8 s$ B! v, _
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,14 C/ B! Q( ]' y/ r
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit6 J: }+ n! ?7 K
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256: }: n( X  G& f' s

, L5 M8 {4 k  p+ A# O$ X% V    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
! ^6 ]+ Y8 ]* y    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
* X( F! y7 G3 A* a4 @+ w    mcasp->regs->PFUNC      = 0;          // All MCASPs
$ v. `& ?+ w7 |% P  s) {- u    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
1 e+ D3 O4 Z  g' r* `) o: l% I! W/ k7 P: o- J  y! Y
    mcasp->regs->DITCTL     = 0x00000000; // Not used
( j1 k/ A) h# z: A, U+ D& `0 A    mcasp->regs->DLBCTL     = 0x00000000; // Not used  V: L3 j/ }* Q# B9 \. N3 w+ |+ p
    mcasp->regs->AMUTE      = 0x00000000; // Not used/ O4 j( ^( n' `6 o9 ^* e3 x
) Z! H( a. X1 A$ z. h
/* Starting sections of the McASP*/
' @0 M* B( _1 l2 o+ l8 A! e    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
( k/ h! i( k1 h( G" J    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
6 k: M0 ~8 U+ i. x7 L. x  x    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 0 i( c  V* T2 k: e& Q2 Y
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
" @/ m! o/ \' Z' _0 q0 t6 G2 C3 [& z+ E% s! H8 A$ A
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 3 \) u% E* ~0 G
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );, H/ z: |. y. l2 y' g
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
+ f& E# B1 X% j* v; V/ T# h8 q    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );8 I, t7 t# }4 Q3 V
( a' ^2 E7 \( u1 N7 t3 r; S
    mcasp->regs->XSTAT = 0x0000ffff; " @3 R' C' d2 R& E4 y
    mcasp->regs->RSTAT = 0x0000ffff; & z6 R  J/ p  k. ~$ q3 T

  C& X! C  W" {1 `" h3 [9 b, P- @( u    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
* h0 x+ p' U5 D9 v2 h    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );8 e4 N* a" X, T. k" ~- R* j2 k
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
) e5 y5 u8 N* V  z' `    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
+ S  L5 ^; r2 p# ]1 ^! |. `% j3 f' \+ a! m; J
    /* Write a 0, so that no underrun occurs after releasing the state machine */
0 L- G4 Q7 D: ~; @3 t& i    mcasp->regs->XBUF5 = 0;
! |$ ?' P0 }0 f4 P7 }    mcasp->regs->RBUF0 = 0;9 O5 P, z+ H2 W* d7 F

5 @7 x8 P( J. M8 o' z' Q- `+ ?. C2 Z    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; % n6 Z" t" ]1 _# E
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
$ d" M2 x8 y; v6 F( W) E& l    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
9 g/ r! E/ q2 J2 r4 _    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );% D( L6 [7 i9 K6 m8 I- L5 @
2 o& F3 s- V% c' u6 [
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
" w" b2 ?* \) R5 x* _    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
2 P* l) A! i% M/ h6 y    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
8 i6 d' \- O, C3 g; O% _& `7 }    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
3 L! b. L0 s. x8 I0 |+ m/ B0 Q. G6 b3 X% o. F& N: C
    CSR = 0x0000;. T/ R2 u+ T! \# C; p
    INTC_INTMUX1 = 0x3d;
; r7 c8 u* D; K4 E3 @' e    ISTP = (unsigned int)vectors;
6 j$ d7 x/ {' D* ~0 d6 ^- c    ICR = 0xFFF0;  3 r6 Q" E9 x( y, l# Y
    IER |= 0x12;  
' \7 f) d$ s2 F1 |8 ^- a) N    CSR |= 0x01;  4 m/ R  s' @7 [) q% ~) U" R

, s/ T! v7 \, |3 B9 O: u
2 l2 j4 x) R/ ]8 ]# r# R0 I% o, ~4 J0 Q' c! R$ T, {/ u
还有就是两个输入输出函数:6 X9 ^9 e' D1 G4 @+ u
void output_sample(Int32 out_data)
4 V3 P; W& d, ~- h4 J; J- \+ G{
0 N  p5 {9 J: B' w% j6 S  AIC31_data.uint = out_data;  ( p& V% O4 r3 s* N
  MCASP1_XBUF5_32BIT = AIC31_data.uint;) L0 i' c3 Q% Y" v2 a$ d# m  m
}
. ?8 o- J& W2 G" ^2 V  V, u& G9 C' v6 R. N+ p5 L3 B
Int32 input_sample(void): G' L8 e8 E0 [/ J; r% J
{  
5 |6 s' N5 U% C) \5 H! H  AIC31_data.uint = MCASP1_RBUF0_32BIT;) Q/ \$ c5 k5 B; O& L4 q
  return (AIC31_data.uint);
, c: X. r6 M. l: U; R+ A- r+ u}" }: I6 \. a/ z: K3 ~  @: I5 r

" _# E9 I5 [# w: ~0 t) j
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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