嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
# X8 d6 @$ j1 e7 r; x+ b. Ymain文件:$ x8 s4 {$ `# W* ~0 [* L4 I) \3 R* M
interrupt void interrupt4(void)  4 I# J5 M) r( t) j6 `" e! m
{
/ q5 G* ~6 C3 g: o* N( t: g  Uint32 sample;9 k- H: n4 S0 x+ }

6 O6 F; y. l) f  sample = input_sample(); // read L + R samples from ADC
; v# Z* m% Q! P  output_sample(sample);   // write L + R samples to DAC 5 r2 n- l+ Q0 w( G6 ~% w, T
  return;
0 C1 L  S+ X* ~* n! \}
* X! [0 W, }+ d/ x4 _$ {2 o8 O' w. _7 }" G
int main( void )3 T) J# ^$ c6 J2 t3 c: p% N# P
{
/ r% ]/ U) ~: }1 `: r$ ?" ^! Q( h  t5 K6 q
    /* Initialize BSL */
  A+ w$ n8 P6 R    EVMC6747_init( );
' ^1 p+ g( L4 u, ]  g% A        /* Call evmc6747_intr function */
/ z* _- h# H. v2 P( z* }* v% B    aic3106_init( );
% [# e" z, U  P( F8 q5 Y! V# J; F        while(1);
+ K4 v1 b3 o# q1 U4 e3 ]}! \7 h7 |9 \5 x* V( l

* }) ?4 F' s5 q6 [/ N- o" V" A) W' U+ `
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
) \, Q$ g/ o- i# J% z# t3 B/* Initialize MCASP1 */
1 {8 n3 F% [3 v8 k6 _, _9 ^    mcasp = &MCASP_MODULE_1;5 g& S" j9 p$ ]$ i, Y+ X9 c, w; l# B
    mcasp->regs->GBLCTL  = 0;       // Reset
7 Y7 V! O. n. t0 G, `    mcasp->regs->RGBLCTL = 0;       // Reset RX: M3 w; B% y+ c9 c6 `1 }: ^% {$ W
    mcasp->regs->XGBLCTL = 0;       // Reset TX" ?  x* M& R1 X" J; m7 ]- C
    mcasp->regs->PWRDEMU = 1;       // Free-running
- f1 k3 @; c: Z0 A8 P   // configure McASP0 receive registers! a$ a0 u' j8 \5 D
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used1 m9 T- }6 }* D$ K9 Z; S% {
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 m9 d- x7 e4 u/ G5 K    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
  x1 ~) r) S# c- A9 ]" ~    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side), r0 Z9 g6 F6 L; i( o
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)6 S/ A0 W6 W! k
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1! p7 ?1 T- R+ E1 _
    mcasp->regs->RINTCTL    = 0x00000000; // Not used: b3 a& c5 l1 V' a3 [1 v! M( P
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 U' A+ o; x% V- ?! }! }0 Z8 `9 t$ d# v/ u7 n1 y- x7 a' M
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used3 R' q% d- I$ T7 b& ?7 }
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus: ~1 x8 a$ C6 x$ j: t
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word' W! z" j. k- m8 R
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16( m- L6 m' S7 e8 m# E, f5 Z1 j. e8 W
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
) D4 g# C$ H1 U8 r! l) ~4 i    mcasp->regs->XTDM       = 0x00000003; // Slots 0,14 E! I( H# j* t" R
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
6 F% O1 T7 X) q9 Z; e& K# {    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256- D, v1 L: e% ?; K! @0 T2 Y& p

5 ]) ]6 V' k8 x- o& ]$ C  l! J- }    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
/ q# u; l  L. s0 v; _8 z    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
8 z9 o8 [  u+ o7 `  r1 |    mcasp->regs->PFUNC      = 0;          // All MCASPs, Z# l; e, X% `# i) R# F: d$ ?
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
- N, g) {. n+ }$ J
- A) K+ R' h1 ~. P  G7 T2 Y    mcasp->regs->DITCTL     = 0x00000000; // Not used
! M" g  t8 l1 d2 C' W! s9 K6 a    mcasp->regs->DLBCTL     = 0x00000000; // Not used
" `4 z7 ~" v$ Z& Y& E$ l    mcasp->regs->AMUTE      = 0x00000000; // Not used4 F7 {3 [, K9 G% b3 y2 K4 m2 L
0 {( F, M, ]! ~& ?% |( C
/* Starting sections of the McASP*/. E; d) f; {9 d2 V
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; / c7 ]9 u+ |4 ^5 Y: z
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
8 o; {, b5 ?+ P6 G    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 5 I" _/ ?1 }1 ~0 H
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
* f+ B" P5 I  v+ e4 f
- |" S7 {+ D, l  ]! l0 e/ H    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
, @" V6 t- M# C- r1 r% B" q8 y- ~" i    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
2 ^, n0 D9 u7 _6 x    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 5 a5 Q, s: f7 b& D1 v9 O$ C/ \
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );9 L0 i, o; J% ?( `4 c
0 J; O  y0 S! E- @, l) Z
    mcasp->regs->XSTAT = 0x0000ffff; 0 Q/ K- t, R' E. T0 R8 j
    mcasp->regs->RSTAT = 0x0000ffff; ; s+ z7 S/ _6 [& `; l
. V6 y" N  H1 i7 n2 f: J1 m
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
! }2 k8 |  D8 J* k( T7 c) I    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
) d4 f- D- c0 ?7 q    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
5 {1 v0 ?4 A* k$ _9 C    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );  i0 X, O4 m9 f4 D3 m) ^( W1 z  P5 |
7 O! h8 ?/ v. `" _
    /* Write a 0, so that no underrun occurs after releasing the state machine */
7 N2 m- O; n; U& r5 c! q3 M6 g    mcasp->regs->XBUF5 = 0;' c* C( n, i0 v3 A& R
    mcasp->regs->RBUF0 = 0;
! F- G$ W0 M& g
4 L! D& G, K! I    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 0 B, M! Q! }" X% O
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );6 g" H) ]$ |' E, p' }5 Z7 ?9 J
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
4 F% \. p" ]; n    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );' f# F+ g5 }/ q% [4 ]  i

, G* i4 |* `( f9 y6 |. C$ ^- A* W. l    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
5 R5 o' `& E* Y9 E/ Z2 M    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
" O2 [1 u0 a! e* }8 O    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
0 f/ y$ j  b1 W* f- f4 }    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );% F0 }' E( J) A8 l
4 N6 S+ ?# L1 C* A5 v# ]
    CSR = 0x0000;  g" l6 i8 j6 T( @. e
    INTC_INTMUX1 = 0x3d;' d, N5 K& v0 t! _4 J8 g& j% a; g! e
    ISTP = (unsigned int)vectors;  ~, ^4 m1 f: n* ]& h
    ICR = 0xFFF0;  
( G+ P( f9 z3 z) _/ \; I( K    IER |= 0x12;  % K- N  v+ g- w+ O/ h
    CSR |= 0x01;  
9 _9 _: a( }# l4 v4 c: r( n# e) P( l* ~7 E; X! O

+ t, S& x4 K* |* `( S
: f2 z/ f1 y2 [' }' L9 W% `还有就是两个输入输出函数:
1 T* U; c. e; E: Q; K. avoid output_sample(Int32 out_data)( V9 @( [7 F1 t: [
{: o" v9 C5 f  h' i" z/ p9 x3 I
  AIC31_data.uint = out_data;  
( R2 U% ~3 }# T4 D7 G  MCASP1_XBUF5_32BIT = AIC31_data.uint;9 R: y2 K# N& v" L  z
}
* k# M; a' Z3 r5 N1 q" p4 ?2 y2 R% v' S/ F3 `* `8 Z& d9 x: h  y
Int32 input_sample(void)
8 `4 L  k0 J0 ?9 N4 j{  9 k; t: U# i9 t! j, s. ~) E
  AIC31_data.uint = MCASP1_RBUF0_32BIT;4 O6 L" b8 r" Q. [# e5 A& l
  return (AIC31_data.uint);
* p$ v! b4 R0 ^& f$ X' N}3 v3 m0 k( s5 s2 j

# [) D$ F( O4 K- h) R5 |+ ~
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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