嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
) }5 o1 a* H* A. U( c. b3 Hmain文件:
+ V- M& I1 u# x" S$ v3 A0 Rinterrupt void interrupt4(void)  & [6 v& q. ~& n4 {# f: v: U
{
- b8 i) B5 z9 l) `8 Q  b& x  Uint32 sample;
( E. I( }7 s1 P% J- Q
( ^1 j" g" ]6 K( a5 X7 c  sample = input_sample(); // read L + R samples from ADC% y4 r, R. g; J/ }0 A. r* J1 P
  output_sample(sample);   // write L + R samples to DAC $ D( L7 |/ I1 S! f* j  F  K+ r. Q
  return;
4 R% _% g* w# F0 Q- O}
6 |3 ]9 W) Q# _8 a! H1 O6 U6 J0 j$ p) V2 q
int main( void )
. b0 o: l  j4 Q* B  |' k{
" K% k$ I' E5 T( ^5 T' n/ J& v- d5 L
    /* Initialize BSL */- R/ x: Q) U4 q" Q5 z8 D7 l4 X
    EVMC6747_init( );
# B' }8 w! z5 |0 T6 i1 ]7 H+ }        /* Call evmc6747_intr function */# ?' ~4 l8 B! B& r/ d! g, d% g
    aic3106_init( );! y1 l2 j' D1 a, C" X4 W( Q
        while(1);3 N" g# [4 V: D/ V+ W/ `$ [1 _
}* W3 p* y  n  c0 r+ r. P) B

5 K) p# n" g2 S) \. h2 |, R
3 X" G! O4 m5 f4 I2 yaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题2 L4 V- G$ E( N# Y" b: X- X2 h
/* Initialize MCASP1 */4 {3 q% c7 d) ~9 p' @
    mcasp = &MCASP_MODULE_1;8 C# A  j! g: \- {7 U. e6 Q
    mcasp->regs->GBLCTL  = 0;       // Reset" _# s. {7 p1 B3 O1 n3 x3 e8 U1 |
    mcasp->regs->RGBLCTL = 0;       // Reset RX
' X4 t! P. @% H4 h    mcasp->regs->XGBLCTL = 0;       // Reset TX
' a+ E; E" ~7 n/ I* J    mcasp->regs->PWRDEMU = 1;       // Free-running
1 b: Z  y1 O1 S   // configure McASP0 receive registers& a* U6 v) r/ c5 n3 ~
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
! t& t2 e9 N# s6 }, h; H5 @    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus1 ?$ h6 n8 J& m/ d  _- c
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word# i$ q( o  ]/ R. @6 |0 W- s% J  l8 F
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)5 N1 X! w; o1 S2 t( a+ X
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)% T5 z4 c: a8 i, K- p6 I4 c3 [* [' N$ B
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
+ p) O4 x$ t7 k; D7 r, `+ i/ e    mcasp->regs->RINTCTL    = 0x00000000; // Not used
/ l+ k3 O1 p/ p. r1 y6 k) z6 Z    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2562 C0 S7 y- M& c) t' D
& K5 Q9 J" L" b. B" I2 Q7 h
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used' D" {' P9 Y8 i3 D
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
) O  [, p3 B! p% E# H1 F    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word$ Z6 M+ n0 \, Y) d
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
4 I9 x6 a! _; b7 f$ u8 `    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
& Z! [( O$ q! [! O5 v* B0 z    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1, _0 ~4 T3 H# Z- D7 H, {6 `3 a, {6 z
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit6 d& Y# [* d7 W3 e+ L
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
- H  ]4 d; l' ?4 S: {: J2 u
$ _( q$ Q' A6 l! w; s* ]2 v" a    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
7 w9 v  p5 J4 p/ _! e( ^    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
1 G6 b/ Q& L7 }2 i$ X' e' K    mcasp->regs->PFUNC      = 0;          // All MCASPs
8 F( z; K3 c! G6 S4 C    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1+ U  B0 @) B# h; X9 h$ f
4 A) f5 [7 J. H7 W( t% g; s
    mcasp->regs->DITCTL     = 0x00000000; // Not used
6 D/ c: h: A, O8 r- c4 G    mcasp->regs->DLBCTL     = 0x00000000; // Not used
+ w3 k8 R' K% }    mcasp->regs->AMUTE      = 0x00000000; // Not used
$ T1 @, ^+ G. K% h# \) y9 e  y. p6 p- B6 T
/* Starting sections of the McASP*/
0 ^6 V8 d, s  _6 e8 E% \3 R    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
1 Z& u: l6 ]' ^( p5 J+ P    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
; C2 q& \3 Y! @' j% Q! s7 \    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 2 N. y% h+ x2 Z3 M/ U+ T
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );3 P8 P2 E7 b: @$ J8 u* c2 G

; f) Z. ^8 ~3 Z# I    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ) K& G( z3 D* d$ H7 n) O" ^
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );1 C  b6 Q# e2 U% S7 w
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; % T! i" j4 U4 f8 d
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
5 z9 \3 M3 F+ S% [; I, f; W  i7 m
  j  c/ Z3 M8 D- O0 [    mcasp->regs->XSTAT = 0x0000ffff; - ~7 w. y5 x6 U
    mcasp->regs->RSTAT = 0x0000ffff;
% M0 b, i) e* [5 W9 m  U* H6 k' f$ ^$ |  O' b7 t% O8 m; _6 H
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
# `7 ^) s3 o+ ]0 e9 ?. Q    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
, k8 }& @* ?' F9 j( q- E    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ' M2 }7 H  q+ n6 u2 Z
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
( `6 n1 U. E1 |3 d
* ~8 t3 `9 `+ o4 c: L, ?    /* Write a 0, so that no underrun occurs after releasing the state machine */  b- N- {! c/ [9 W2 ~3 g
    mcasp->regs->XBUF5 = 0;, b; @5 @8 T' e" U( w' \8 |' O# L* J
    mcasp->regs->RBUF0 = 0;
: h/ Z8 J0 ^- d: f1 n$ r4 a4 ~
% j  y$ p% |' `5 c5 F+ A; L    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ) ]1 d* G& u8 l6 r# m5 }8 y
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
7 b/ k" C0 p+ D: L    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
9 g" U& Y6 `$ s" N/ C    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );8 p( u8 D; e# Q: m' U% l3 ^5 S
2 r/ Z4 t+ G0 l0 O7 s. Z& E  v7 c
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; % J/ H; ~% p% e
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );) ?  l1 w& F, }. O4 v
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 1 B" _3 n) _* I. N# j0 A
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );# y* M# X, h: i2 @  U
( N+ ]5 h' C5 h$ Z9 k8 S5 S0 V
    CSR = 0x0000;
6 p- W( K) p8 P& |9 W3 Y! t) D) n    INTC_INTMUX1 = 0x3d;/ H; A8 p) v# u+ g6 i0 ?+ O3 A8 n* V
    ISTP = (unsigned int)vectors;0 R. N  b* `5 }! r3 o  B
    ICR = 0xFFF0;  , x# [( D" |$ S& M% u: D, ~4 K% [
    IER |= 0x12;  5 g8 W1 p) V- s' C; |6 [' b; }& G; p8 A
    CSR |= 0x01;  
2 v+ y2 l& A* ^( p3 k" w0 l
+ K4 W( s6 W$ I; `5 w& W% r  Y6 n% x) m$ y
! h7 Z! x/ B- z
还有就是两个输入输出函数:
8 U5 }8 Z7 n% X) evoid output_sample(Int32 out_data)# C4 U( c, s) `. S1 r; A+ Z( K( w, Y
{
$ H/ m/ T" G' j! V0 u; F7 o  AIC31_data.uint = out_data;  ( C2 g4 n0 ~8 X4 B2 N
  MCASP1_XBUF5_32BIT = AIC31_data.uint;# K" }# ~- j! `  [
}
' o# J3 N& O6 h5 E- o
8 J2 K0 ]( X; O6 BInt32 input_sample(void)
+ E0 v& p9 c. |7 p% }3 S8 \{  
9 R& h2 M# M1 s% a# {/ V' W  AIC31_data.uint = MCASP1_RBUF0_32BIT;
& b- {4 Y5 m: n; x  return (AIC31_data.uint);' A' T3 K2 m$ G+ g. c' W2 y
}7 k' W" B! O; M4 [9 E1 A
7 @0 Y1 b2 e" [. Y$ e2 i* b' |

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




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