嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:; E2 h+ q; f/ u
main文件:
% d4 M- _' K, q/ ointerrupt void interrupt4(void)  
' [0 M0 n7 O) [/ [4 C0 J{
+ ?0 r) c2 G4 e/ C$ K  Uint32 sample;
1 D" s* w" t! h( B  n# {$ E& k
! y& i( X% d& j( o  sample = input_sample(); // read L + R samples from ADC* A, r; {. R' s
  output_sample(sample);   // write L + R samples to DAC
+ Z( y9 o, B" ~; O6 i  return;
6 Q& S3 O8 L  t5 ?}3 E" t4 N& s% _: i! R, I
% p# }& V# }9 W3 y! p8 c0 v7 S
int main( void )- u4 q; _1 t$ ~2 W. D& b
{, Q% y0 r: ]2 t  o0 }0 h/ @

* Z5 a0 o4 L: J6 w    /* Initialize BSL */
5 @; v6 ?2 h0 v/ U& S    EVMC6747_init( );
$ z! f( s/ s0 l9 u, U        /* Call evmc6747_intr function */
2 K, v5 m1 E4 x    aic3106_init( );
3 j5 U* l% r/ k        while(1);; G/ W' z* ]* W" ^2 I. Z; L4 ^
}
/ m+ Q5 C, F, B8 e; `
( q  B* u0 g3 }# a* v8 D& r" [$ O" L2 A0 K8 q3 Q4 g# g9 t7 g
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题/ i" V* R7 M2 l  z+ O9 Q$ R( ]. K
/* Initialize MCASP1 */
/ ], D5 Q, o& x$ j% I) L5 ?    mcasp = &MCASP_MODULE_1;
# X6 [+ Y: ~9 o% F3 ?    mcasp->regs->GBLCTL  = 0;       // Reset
4 o) v+ @% a  {* f+ V5 f0 f    mcasp->regs->RGBLCTL = 0;       // Reset RX% S8 U$ a' K$ f! p; F
    mcasp->regs->XGBLCTL = 0;       // Reset TX+ O( B: p) X/ O, y- o: ~! L
    mcasp->regs->PWRDEMU = 1;       // Free-running0 m- H8 B/ X! ?( ]7 e$ C, a
   // configure McASP0 receive registers; m5 P. l" X+ E% s/ L& k- b. x" {
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used0 c0 T: a0 q+ O8 C, J9 L
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
$ d3 w! @" u; I  R- [: x+ j- L    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
" x% B) G& D: T# r' |    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)# [" h8 M9 l8 X2 v, I
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
& O) j9 q4 ^9 _+ S4 H    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
. O1 a' b+ y8 z1 i6 s5 o9 |( o4 y    mcasp->regs->RINTCTL    = 0x00000000; // Not used
5 o: P0 F, R" j# _1 B    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256; \& e$ z$ w1 d. N0 |, h& o
% O6 T: d1 c- y2 |
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
2 B7 Q) X8 H; U! G+ B5 a2 X1 o6 J    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus) b$ S& V2 C; H4 o
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word% U  Y1 f) @3 x# S, \6 `2 x
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16+ I- ?& L- S! \4 b( `  O2 W. G2 H
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK6 Q4 h0 I- t+ k' R1 Z( b; _6 Q# M
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1- X: Z$ j6 z- H  m" k1 H9 T
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
- E9 w' C& _. H% \! A) a    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256/ a( t, N4 m; T- Q
& |, @; A2 N; u9 U9 x/ y2 N
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN' h, {- {+ o8 y$ g- w! d
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT0 s7 E7 h* o5 b8 |' P
    mcasp->regs->PFUNC      = 0;          // All MCASPs: D# O" I' p, R0 z* {% A( M
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
- r0 t1 x5 k- k  f2 _1 ?; c( T+ x$ g0 z# s$ w/ u0 W3 Z5 o
    mcasp->regs->DITCTL     = 0x00000000; // Not used
$ _& P- t# t3 p    mcasp->regs->DLBCTL     = 0x00000000; // Not used
  @# b' }1 P4 N  z1 c$ c    mcasp->regs->AMUTE      = 0x00000000; // Not used9 _  {0 G. c6 _5 ~9 M2 k; u; ~/ S
3 S* T2 G* [. W1 r. B
/* Starting sections of the McASP*/
& ~7 t' s/ _# K0 h2 u9 ]2 E9 H/ m    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; . o% s" x0 f+ F9 T- L- K
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
/ b/ v  `; \, U+ t    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 5 O6 u' T. R4 |; G
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
7 q$ {. w8 ~6 V5 ]+ |' T3 b# U( p- v- z# _& v( a  r. s+ a
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ' x( h, ^  ?+ Y+ f
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );3 U3 X1 P% ~0 q  r$ e
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ( Y! M  G, c, p
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
8 F! Q) f( Q/ \  J. t6 B9 S
1 e. k3 S& b. t/ K  a8 B' w0 U    mcasp->regs->XSTAT = 0x0000ffff;
. G: l& U+ i% @& C  U; z) w    mcasp->regs->RSTAT = 0x0000ffff;
8 V4 q' {% a: ~2 o) p2 |& x2 [
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;! x7 h. Y$ y( b, @& b
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );$ Z$ P( f3 x$ Z  E0 f) I* `& U
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
- m- K) l% Q  R: _8 T    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
& i0 p0 g" F# G. c+ V
# o4 t( u8 ]" _% ^% s) |    /* Write a 0, so that no underrun occurs after releasing the state machine */! E. W# s; W" E( F
    mcasp->regs->XBUF5 = 0;6 |9 n5 R5 L5 O" w
    mcasp->regs->RBUF0 = 0;4 y7 ~4 G6 ~. i: ]' F* h9 U7 t3 c
- I5 Z* ]5 A! A( T1 G+ x& Y
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; + X: o; i3 _% ~+ l
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
1 G" u0 j3 P& k4 K% w# C" K& u, e    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; # ]8 D% \5 B- \, e0 l& o
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );* V' F8 J. U" R8 q

9 Q6 j# i+ F* c; a  [    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
' V  {6 |! ^& i2 D* f+ r; H8 S    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );; K$ K! B; J" {# U; t; U
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
: P, ]* y8 a! S7 S0 w) q; W    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
+ z4 \4 P2 a: u/ i
" `) f, @8 J  G& v/ U5 t7 g% W    CSR = 0x0000;$ F+ q3 `6 |9 G4 \+ `( r
    INTC_INTMUX1 = 0x3d;1 J4 G: T* _" K8 Z0 J
    ISTP = (unsigned int)vectors;6 K$ X0 r. _, v. ~0 V
    ICR = 0xFFF0;  
9 d) U1 A# I$ p$ R1 {    IER |= 0x12;  
( Z( H/ B/ Z, O- A5 ^, w0 y7 L    CSR |= 0x01;  ! c) {0 }3 v1 d6 t2 }- ]6 v- U

# F2 R, U9 f3 L% T7 @
' Y+ Q' |" S3 ^  ^7 h: j. J9 O
$ h8 I0 _3 h( z8 k1 h% G还有就是两个输入输出函数:
6 l* n8 Q; M) fvoid output_sample(Int32 out_data)
+ u" M, k: x9 a4 V" m7 ]" I! G{, _6 C( g3 S5 E# `. d  C
  AIC31_data.uint = out_data;  
3 ~/ E. T6 ]% f, p6 C0 x; U" u; G. ^6 j  MCASP1_XBUF5_32BIT = AIC31_data.uint;
; E( [8 a( [: E# |$ G. I: x}/ G) f( q1 M* B

, d: \6 q. ]& J3 ZInt32 input_sample(void)+ O2 `2 y& x: P  s9 f
{  8 e0 m$ h8 ~; V
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
( K. i. S! r, x3 }  return (AIC31_data.uint);; L4 }3 Y8 o. E9 v6 W5 m: h, ~& K
}3 n* D0 E3 H6 U* V8 h% E: v
$ Z" s/ w  o3 k, M0 H5 Y

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




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