嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:+ e: @5 }+ f3 a% n* }
main文件:( ^) b8 D$ x  s9 B( ?6 e
interrupt void interrupt4(void)  
4 j( j* d! D# G. Y{5 x; e2 ]  n& j3 Z
  Uint32 sample;/ u7 ^  q' h/ D' x; B4 m% Z/ A

3 I% x1 a$ `  h7 Y$ D& G* z( W  sample = input_sample(); // read L + R samples from ADC/ Z. H5 p3 _$ t3 C& u; q
  output_sample(sample);   // write L + R samples to DAC / v- _4 R, ]  e" D7 {- A; |
  return;
; z" }! E; V& @  q- ^}
2 y8 o* [7 O' l2 f, ?6 }. i6 ^" f1 @
int main( void )
6 l0 |  w% h- W& W  I{" X4 B. I- p0 i& S3 q

/ p) U; V6 P8 B: \    /* Initialize BSL */
" b0 I( |4 d3 L    EVMC6747_init( );9 [$ ^7 K4 H- x* r5 G! N
        /* Call evmc6747_intr function */
9 W4 B5 B7 X0 z% G5 F    aic3106_init( );0 C  R+ w. j9 y$ d, T% [
        while(1);6 R0 r& [) F' V/ ?$ N
}
% W: s* L( q- l3 C& K8 M  R0 y4 D0 S0 W3 _( x5 j* i5 [* I

* U( m0 U9 \7 |7 M+ f: E- {aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
+ U4 `- P  Y7 H/* Initialize MCASP1 */0 Q" v2 J% I& r0 V
    mcasp = &MCASP_MODULE_1;
6 E* O1 Z4 f' T9 A    mcasp->regs->GBLCTL  = 0;       // Reset& D6 O- w# W* h6 B7 U( I; H  p
    mcasp->regs->RGBLCTL = 0;       // Reset RX
. n/ c  E3 M; f: C, Z$ j, o) G9 E    mcasp->regs->XGBLCTL = 0;       // Reset TX
: ~& c: `6 J: b' o    mcasp->regs->PWRDEMU = 1;       // Free-running* N2 O8 @5 M3 ]
   // configure McASP0 receive registers7 M3 d8 c" ?. I& [' f! T- z- ]
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used* F7 F' Y. [+ E2 q
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus9 A' a5 N" @3 z* l( V; ]5 W0 [4 e
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
6 j! [6 Y1 O# I: M    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)9 u3 I1 [6 L/ }0 C% }6 O  k
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)6 o+ }9 l% j+ N  [6 t- Q+ \4 q
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
9 e  @! o% e; K$ m    mcasp->regs->RINTCTL    = 0x00000000; // Not used
; h0 f7 a" M! H# |$ _5 I2 f) T8 A    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256( l/ N2 Q: N" Y7 |
& j- Y; U; l# S: g
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used  u( Q8 M; z0 C7 @
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus; o  q  u7 F5 B+ |
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word) P1 u0 D! X( G
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
6 @2 |4 \' a$ `& h    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK0 W: W- `2 o' _. @" y- @
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1+ s& r2 z/ b: m, B
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
1 J5 K# E* J4 s+ f% m    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256( K* d# j* |  k0 \2 H& V/ E

5 Y- _# n3 _' ~8 `5 Z5 m- [    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
* ?) {6 x& y% Y+ _. L2 Q    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT7 v$ s3 u6 N: V, y& w% M; i
    mcasp->regs->PFUNC      = 0;          // All MCASPs
8 P! l3 N* D! t4 [    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
! u1 z& }: ^5 a1 u) Q* e( s2 ~+ v$ `3 q( m; M  ~: k" ?
    mcasp->regs->DITCTL     = 0x00000000; // Not used4 y2 @- E& f5 h6 ?& F
    mcasp->regs->DLBCTL     = 0x00000000; // Not used$ S3 f+ S. A3 x: Q# z6 S
    mcasp->regs->AMUTE      = 0x00000000; // Not used7 S# u7 h% u& N" u3 ?" [) c* r# D

2 R2 r3 P% [+ L2 {* _: @/* Starting sections of the McASP*/9 j* B" @5 n- g" o1 M" A: R
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 4 k' B  b/ C# \" u+ p* \7 x
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
1 ?/ s" [3 h4 ?6 k" l" A    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
# m* z9 u* M" r: m, T    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
5 S. z6 P1 I2 p- J9 }( s3 C% X
# o" e+ c. P4 w, w7 ^8 J    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 1 t4 E, A9 r0 q8 V
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
  A3 d4 a4 y4 A    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
& }& A. F" Z- O- Q    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
" ~4 A( c1 y) v1 c- [$ h! P
1 o4 x( d! W- N0 K) A6 f& J% `    mcasp->regs->XSTAT = 0x0000ffff;
( p. c; H$ E9 S8 r  G6 B9 Z    mcasp->regs->RSTAT = 0x0000ffff; ; G7 j8 T$ U, {

: C  p! v; n: I+ q; }& h    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;+ g( R; l$ R1 U+ c
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );  O: i8 }/ W3 E0 m) U
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
4 N5 ~: L7 o5 P: l1 g  X    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
+ T0 ]- P/ {# t- v3 F8 p- D" m
    /* Write a 0, so that no underrun occurs after releasing the state machine */
: ^7 _" K/ p" c    mcasp->regs->XBUF5 = 0;* r# w! S, F1 ]
    mcasp->regs->RBUF0 = 0;
4 d5 @0 H+ b; V2 X$ N' z% Q) X: l( r7 M! Q) ~0 B% ?; L' H
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 2 I3 p7 D; S  g9 Q8 \
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
. E% y" G9 X- ^! k7 v) t6 |    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; * i& M" k9 Z& t* Q
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );, }. d3 N: x5 t

4 B% _4 e8 ?" i    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ( S' e- D5 R/ O3 u7 h2 J
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );# P, T9 q6 o8 @% R7 j' b
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
6 U! d3 W5 R4 p8 V    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );- i, u$ ^  Y3 x) f0 o2 f1 @
  \3 `0 E, g& ~" W1 w: V. ^
    CSR = 0x0000;: Z, y1 }( Q' K1 m( {7 i
    INTC_INTMUX1 = 0x3d;  F  A, k& l' r
    ISTP = (unsigned int)vectors;5 ?+ K1 ]2 m4 W& n; z9 I- g
    ICR = 0xFFF0;  # L. y, i3 Q1 a/ G" T3 h& e' V3 K+ @
    IER |= 0x12;  9 Q! n1 k4 Z0 m$ E$ C
    CSR |= 0x01;  ) v9 \: k! X) C, `9 M

8 ^  j1 a$ Z, k% I  R# L5 S% Y6 c- W  i) t: c7 P" _1 G

; U- a  M0 }9 f! g0 k: [还有就是两个输入输出函数:
6 f% {* B6 J2 d. _1 ?: b1 `void output_sample(Int32 out_data)
, h3 r% d) G/ }1 e& ~" z. j{
& H5 ^6 u# Z5 h9 l: _# H  AIC31_data.uint = out_data;  
4 t( s4 R) K- @. z' q* o4 p) Z  MCASP1_XBUF5_32BIT = AIC31_data.uint;
' j( w- G+ H0 E7 l. F2 f+ W. j0 ?+ I}
  t) `1 e5 |  J, o
3 H( w4 q  G* T5 A; {Int32 input_sample(void)
: F! T2 @$ L' j" d# L+ H8 c{  - L/ U+ q, {8 N9 [: a! D2 a% R
  AIC31_data.uint = MCASP1_RBUF0_32BIT;, y# J7 B7 I. o* F: ]5 m" r
  return (AIC31_data.uint);
" B4 ?) E3 E: L' g" k# x}
: K' X4 e  D2 ^4 J* e8 x3 z7 b6 c9 {* S# \7 l

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




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