嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
- z- E1 u. p# h+ ~- k6 h+ Qmain文件:
, m* D' G/ ~: E* ]) Jinterrupt void interrupt4(void)  
4 b2 s# c0 i" Q9 [+ t( F{
9 M9 h6 s" T+ |, T* I$ d( r  Uint32 sample;
, i+ r/ C1 D" k7 e6 w, O7 A8 k& W* c5 w
  sample = input_sample(); // read L + R samples from ADC  R, e1 J, u5 z/ r2 d
  output_sample(sample);   // write L + R samples to DAC
& r, e% p9 t# v( K7 J- K* r" b  return;
$ T" E, ?8 r- ~9 T4 n$ }6 m+ Y}( a* @8 a# Z8 O6 X& C2 c$ i* G9 u

+ i: w! ^& Z5 f9 R1 [$ wint main( void )+ f9 h1 v: Y% T& |$ ]4 n
{
/ ?2 p) [+ A! Q( _' r- \! L$ @' f# v0 F+ c5 y0 }: v* \
    /* Initialize BSL */# F+ Y% }' X& T# E# H
    EVMC6747_init( );
9 U/ ?0 o) K4 P6 i+ Q* I3 @; f" F* x        /* Call evmc6747_intr function */
6 W, w+ u+ L6 H    aic3106_init( );+ q4 D" Z3 ?' q  i& S- I; r
        while(1);
# V4 ]6 x7 {4 `5 a4 D" M% p}+ G5 y$ C, k& j5 ]6 i& k  y
9 e6 l& [" a% e' E4 s) R! t% x2 Q' a- s

9 _* W* ~/ Z! b) _/ f0 caic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题- d; @. D: h- v& n$ g
/* Initialize MCASP1 */3 ^. [2 b# q: X% c5 v
    mcasp = &MCASP_MODULE_1;
: M$ ^; n. p5 k! I( d    mcasp->regs->GBLCTL  = 0;       // Reset
% ~' ~2 r  U6 y; H! Q" p    mcasp->regs->RGBLCTL = 0;       // Reset RX
* n3 M/ ^/ F7 X9 E+ W! ^7 `  n* W    mcasp->regs->XGBLCTL = 0;       // Reset TX
/ v* F+ g7 y; r, e2 Q& Z4 [& C$ T# I4 S    mcasp->regs->PWRDEMU = 1;       // Free-running
( p9 p% F% t3 \$ n+ I& Z   // configure McASP0 receive registers- x/ U3 B- C0 \) J+ d( Z+ h
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used3 V6 |$ @5 ^& E. Y: D
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. B  w/ ?5 f( L1 A! b  r    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word) r+ B, D! ~- i8 q
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)' h" X5 Q  T4 H5 ?" D
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)7 O4 b/ F4 O: n9 a
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
+ r0 W4 h7 Y3 }4 y    mcasp->regs->RINTCTL    = 0x00000000; // Not used
  h5 O" O. q; R! }" O) _+ y    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: V' d8 ^( D5 C7 }
. |) H* C$ N" q6 T  `    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used6 i# a9 l5 W! |
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
9 r1 I4 |# g  y! ?- L    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word. ~: }8 D0 t7 S" c- p2 \
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
2 c+ h4 T' Y+ z6 G- C& I( Y9 A+ p$ e    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK3 X$ X7 L2 I! d0 @- x$ S
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
$ T+ b% a# d7 G# W! N8 R    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit& i1 |3 ^9 F, Q" H4 S
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 @3 r; x7 B6 M3 b0 F, S) {" n' t0 w: E+ e# m$ }4 n! v, P3 N/ P% j
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN1 F2 W* h3 N( Q9 F/ z8 J* _: T
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
8 j" d% z% Z/ i& W9 L    mcasp->regs->PFUNC      = 0;          // All MCASPs% H6 l% I1 o- F
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX15 d) k) `4 g+ A3 k& {0 K
$ B* ]$ K# _: z5 U
    mcasp->regs->DITCTL     = 0x00000000; // Not used
2 S% }* x/ F. [1 z+ o9 J    mcasp->regs->DLBCTL     = 0x00000000; // Not used8 E( A3 Y) n4 |* W
    mcasp->regs->AMUTE      = 0x00000000; // Not used
9 K& J1 X3 }# @/ j
" L( W& t, B! ~/* Starting sections of the McASP*/: X: R+ R4 x5 \! j: t0 _
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
+ b, n, F. u& R0 x" b: l    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  - T7 Y$ \$ t9 N( q+ t2 R
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 7 @5 x- G# h0 H9 L  v( X' Z
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
& i0 J* ^( _$ P+ t! V  K
, l$ C" _& U0 N0 X7 i    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
# X9 j1 r6 |4 N# C" k7 Y4 F    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );1 b0 t* j  a& D6 x4 ?( w, w
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ( ~( F" Y! p8 [
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );6 }- A5 {: b$ g5 F- Z

% n( T; D; k+ N3 ~    mcasp->regs->XSTAT = 0x0000ffff; 9 {: W, N6 V! R* v' b: p
    mcasp->regs->RSTAT = 0x0000ffff; 8 E/ ]( r+ y  O. O
4 K7 O4 m0 P" ?
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;- o) x+ `" I( H( U; W  \4 l
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );, q9 U. J& b7 o- M  w& ^: L
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 8 p. Z, `# {( C! k
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );9 D* c1 {! E- |9 y
# A. d5 j1 A$ v  k0 S
    /* Write a 0, so that no underrun occurs after releasing the state machine */! j% J% `- A4 ~8 E: G0 B: l' Z, ~! S
    mcasp->regs->XBUF5 = 0;$ k; l8 h! i% c! k! m/ s5 N
    mcasp->regs->RBUF0 = 0;
0 c" U! Q9 b  \# O4 F6 E1 D+ |0 `; T# ?
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
; N( u) e: b9 H) {4 J- `    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
0 K0 h, k5 X- {    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; * j9 W; X4 o9 n
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
& \0 |- H" k1 M5 h, u) c( q
2 a/ K# f9 Z& e1 w& h    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
& w) g( h( z) o" y: ~) `& B    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
$ O5 e3 M& v$ L8 x& F: _3 c- k! I' z6 U    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ; G+ A7 ]5 S! Y/ s9 f2 S7 I
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );( i( a, f0 V* w
6 Y' V) o! g: n
    CSR = 0x0000;' B5 T% e5 L" W
    INTC_INTMUX1 = 0x3d;
1 l* Y; j5 W+ M& t4 W3 j    ISTP = (unsigned int)vectors;
; ~; \/ H+ k7 D1 K" g! c) s    ICR = 0xFFF0;  $ O0 q' f5 U$ K1 B# H! |7 A
    IER |= 0x12;  6 `% F3 U7 W! E6 I" A% @8 R/ \/ s% z
    CSR |= 0x01;  . C$ z3 V! G! [
; |3 ]- y  _: x

2 ~8 w* P  C, [, c; ]% k: D9 k# _6 u6 v7 k! @
还有就是两个输入输出函数:2 X. ?9 w+ |/ I& B6 H% x
void output_sample(Int32 out_data)
. t* Y5 Q6 J. [& K* I  n{! B+ w# d4 Y: P$ A# t
  AIC31_data.uint = out_data;  2 i+ N6 W, P/ _, a, R: {1 S
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
$ Y7 {" \. {% b6 n, n9 b}( r1 e$ P4 I/ K4 a! h
% P) J% s2 e' C$ P# q( \8 T. b  o
Int32 input_sample(void)' Y2 e. C! l+ M' E# j  T6 r9 A
{  
* M( U3 B9 {% S% D* I  AIC31_data.uint = MCASP1_RBUF0_32BIT;$ X5 H% K( h4 N
  return (AIC31_data.uint);2 u+ g+ a5 n. B  [2 y3 L* r. T
}. V* |; q& r0 G% |0 Q* Q

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




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