嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:7 z9 Q0 {9 L$ U- J3 n1 m9 Q
main文件:* |0 o8 [; l, T# W8 ^
interrupt void interrupt4(void)  ! D! m9 ], g+ b. T
{
. C0 ?: e2 N: {0 M# t8 o4 q  Uint32 sample;9 M* d  v: _6 S' d

1 U$ ~5 P: H/ ~& L8 ]' s  sample = input_sample(); // read L + R samples from ADC  l% o, G( j, L# i3 A$ U
  output_sample(sample);   // write L + R samples to DAC
3 H# ~  q- R! J3 C# M  return;/ s; G# L" v& e$ j- v; O( j
}
$ r' E* E% i0 q. ~8 F% H0 W" ~5 a) h
int main( void )3 h: v& @& J9 S( Z& \* i! e# o
{/ W% n, }% L+ y$ d; O: Z6 p

2 T) n; i3 ^. j    /* Initialize BSL */2 i% l; b/ n% K  o) S8 v
    EVMC6747_init( );
' u  Z' C7 m! P5 k  K        /* Call evmc6747_intr function */
* y3 D0 u. ~. I/ O  b3 C( S    aic3106_init( );0 S9 R/ O* f8 u) O/ {3 F3 q3 V; c
        while(1);
$ v" i+ V* ?! |; E' H9 H9 _}
0 k6 c* h7 _+ h6 E
# i- o& b% x$ t3 s5 O* Z2 R: ~/ O, y6 b/ p. T2 A
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题# B1 C" s3 Z* m& E# d
/* Initialize MCASP1 */# D/ x* K  d7 g
    mcasp = &MCASP_MODULE_1;, ?, r3 k5 y, @2 M3 ?
    mcasp->regs->GBLCTL  = 0;       // Reset7 v2 [& _  D& t4 S; w* b' ]/ Y
    mcasp->regs->RGBLCTL = 0;       // Reset RX
. @: {% n* |: @; \    mcasp->regs->XGBLCTL = 0;       // Reset TX- }4 O' O, n+ s$ ^& o. `5 }
    mcasp->regs->PWRDEMU = 1;       // Free-running
( S; m/ C' l8 D" w; Z   // configure McASP0 receive registers' r7 b% Z8 Y8 r7 H& ]; z
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used% Y7 @2 K" h. M
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 c, L! F0 c$ ^- R8 n    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
3 L7 d( v$ \. F) K( Z/ V2 r$ d2 I1 c" s    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side). c$ j4 Q. X' J+ K
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)# a7 v' z) |( g
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1& f! P% D) j- D; Q9 Z9 M# s3 p
    mcasp->regs->RINTCTL    = 0x00000000; // Not used9 L; W0 i* `( N, ?
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2564 P9 a" K6 U8 Y& f5 y
+ y6 |) A  n6 B% ?5 l6 _
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used0 \9 t& M4 `# Q
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 K( U% h! Q$ Y4 A$ I7 |% h4 t3 g    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
4 d# U' v1 R# g' B! I    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-161 N6 J5 s9 v; @* Z# f: t
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
0 ?. l3 M  W1 [    mcasp->regs->XTDM       = 0x00000003; // Slots 0,18 P4 V: J2 n- f, k9 Y
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
! f/ l* b( n. d- u    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
  c" i. v7 h8 y# |5 {/ R1 X  e, ~% R  a; o8 D/ E& g# J
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
3 y% Y1 U# o4 ]! L3 k2 A( q    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
% N1 f; A' H3 k3 U- L    mcasp->regs->PFUNC      = 0;          // All MCASPs9 G) L8 b3 z# ?8 u3 y0 i
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX12 b; p2 L  `+ @7 ], k, H( y  T' M: r" R

+ r6 v9 j) E8 S. ?& i+ m    mcasp->regs->DITCTL     = 0x00000000; // Not used3 I* f# [- J  E/ q  j
    mcasp->regs->DLBCTL     = 0x00000000; // Not used+ `8 C# e% i, V/ i, H
    mcasp->regs->AMUTE      = 0x00000000; // Not used
) X5 M6 \4 z  E
! W7 y6 b$ l* O- u3 x; C. D/* Starting sections of the McASP*/
- @8 ?4 h- C& Y0 `) T    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; / |1 e! ?0 a2 H, @
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
; b( R$ o( G3 L5 e! u/ n  v    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
% k1 s6 [2 f# a' u2 _# P    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
- f. Z; P" c8 M- T6 n$ ]
8 e7 A# d: X% m& b+ L, T8 E* q    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; & Y. h" c" ~9 g( _9 y- Q
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
3 w4 t7 b) l5 l- m7 q* z    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
; k+ }/ ?3 W# O    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );2 a- f/ o; @6 ~' ~0 F( O
1 b) ]$ a( y. \- D% W5 Z' _
    mcasp->regs->XSTAT = 0x0000ffff;
2 a/ i5 _7 O, x% T" T* V3 s5 ~" G    mcasp->regs->RSTAT = 0x0000ffff;   W+ q+ x4 i! V% Q( k% U9 N
0 l! f1 [# ]! [& x1 n
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;* @! D* d; h; x$ q
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );/ Z7 ?7 K7 M5 m+ p" y+ b
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
2 q5 D1 W5 p( J. M  `    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );% Z7 Q+ h6 Y* b, T, h
8 v3 A  R% W6 a, l
    /* Write a 0, so that no underrun occurs after releasing the state machine */9 X8 a* c; B, K, K6 T
    mcasp->regs->XBUF5 = 0;
6 E6 V2 n% o* F$ P: ~    mcasp->regs->RBUF0 = 0;. |2 A! z8 C* j& r
2 u4 @9 ~& j8 ^  ?. ?
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; % @: f7 G3 g  R
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
5 j+ d7 `$ u, ^/ X- _    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 1 |9 S2 x% W; L  ~
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );. N0 V7 [; Q$ P. n& A0 T$ Z

1 f  I" Z$ F7 X5 p" q6 y3 U8 J    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; - a! n% ^8 s1 x$ P# \
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
) Q5 Y' L! X" q. h6 `& k( h    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
, y/ {/ s- o2 V* }5 d5 b' p    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );: O0 z/ |7 z  r7 q7 B5 F2 s" S6 G
: K+ z5 E+ h5 b8 ^  R
    CSR = 0x0000;
& _+ \$ d' L7 _3 v  V. h    INTC_INTMUX1 = 0x3d;
  }; |2 b3 [- e    ISTP = (unsigned int)vectors;8 ^1 m5 C& g, q, j: n2 F# i) ~4 M
    ICR = 0xFFF0;  " U7 X, F+ U, R9 z- x- u, r- q
    IER |= 0x12;  
, N7 D. s8 j/ q7 R" \4 `: g9 J; c    CSR |= 0x01;  / N5 O, q+ y7 g, r. b) ^  `2 }4 Q4 e

, f" Q7 E% q7 j2 Q
8 ~9 Z5 J8 Q' I# z" \0 Z
8 l" C0 @" y% l7 R9 e还有就是两个输入输出函数:1 a( x- S0 x0 q7 T7 O
void output_sample(Int32 out_data)
. ]" B: H1 t) d  C  t{: O" E9 O0 I: N; \$ n2 \
  AIC31_data.uint = out_data;  1 t( }" k+ W: c
  MCASP1_XBUF5_32BIT = AIC31_data.uint;) d& j6 ~& n  d, r! i) ?; H
}8 b' t: i. D7 T# Z4 G

. x7 I* G  u/ \2 i3 K8 nInt32 input_sample(void)
4 K( F: x6 W- i) S5 k{  - L, F. C+ j! P) S. z7 T8 ?9 Y! ]
  AIC31_data.uint = MCASP1_RBUF0_32BIT;/ S2 c0 W9 t  A
  return (AIC31_data.uint);5 f8 U0 p) d, q6 I4 B3 T
}- H# G( P: L7 r) L2 w/ H

4 ~- x7 K& L) V$ D7 w* f' }, F' P
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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