嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:* z( y/ \+ R, C$ t
main文件:! h5 E5 j% Q( |6 A
interrupt void interrupt4(void)  
+ z+ }; `+ V8 r4 Y8 ~6 b% g{
4 b' K: N- W8 U1 v% W% Z4 l/ w  Uint32 sample;2 A7 a7 ?- J3 ^1 h
' Q, W& P2 c. |, ^
  sample = input_sample(); // read L + R samples from ADC8 f; R7 E2 N! v, _% S
  output_sample(sample);   // write L + R samples to DAC
/ s' @1 y. S) G1 J  return;
4 t# I8 o) ?! g0 j- @}: @* o7 C! Z- A$ A9 }. n
( H5 c0 w" n# w# p  P
int main( void ), R9 d3 u2 b* Y0 {9 b" J4 m
{
$ P8 j' `3 R( c. ^& t
6 V3 |; z. i" X: I* _# v% i# p1 L    /* Initialize BSL */8 H: Z2 ]! Y0 `. D
    EVMC6747_init( );5 a; [& c, V2 i
        /* Call evmc6747_intr function */
; {4 r$ l. @3 K    aic3106_init( );7 i( \) v6 ?. F; p8 F* z
        while(1);
- q- q: q$ r$ Z}1 D4 q8 L" P- l; k7 W

3 K$ O; D" `+ N) S( j8 j  e0 a0 F1 [- }# S3 \! g
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
. D/ g1 R3 V: ~( W" l4 b) b+ G/* Initialize MCASP1 */! `" |1 g4 u. }+ N
    mcasp = &MCASP_MODULE_1;5 K' y2 J" o5 ^. R- M. U
    mcasp->regs->GBLCTL  = 0;       // Reset1 q9 c: p0 V! _* c, h+ \) O
    mcasp->regs->RGBLCTL = 0;       // Reset RX' b' x! b  Z# [' U
    mcasp->regs->XGBLCTL = 0;       // Reset TX
! r. C% g6 e. I5 O    mcasp->regs->PWRDEMU = 1;       // Free-running
. @, t. r  M- }# ~9 b   // configure McASP0 receive registers
/ z: N$ @6 q2 s) c; M$ F1 |    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
9 U. D) n8 U, T& W) w9 k    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. R$ j" L1 V& j" C    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
8 r; C8 V! `- p! K4 J* M6 R5 t    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
* h- j: O2 }/ L    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)2 O2 D( P- w) |' p
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
8 O4 H; l+ g) J* N' _9 h    mcasp->regs->RINTCTL    = 0x00000000; // Not used4 Z# h; S; M$ E4 w
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256/ e4 h, F$ U* J1 u& H4 W% w) J

# j2 S1 p, T& q/ r) l    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
- v2 ~- \% l  P: L, F5 B! e2 e    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; W5 ^4 u" K  |8 y) g    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word5 E4 [, o0 C9 |; W; I
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16: s4 e. \# k) S, K3 ?0 a
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
: R4 R# ^2 }/ |( f% G, A! y8 b    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
8 T* N! c9 V- N" A: |9 J9 |    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
" I4 ]0 [& h/ Z5 n    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2566 b: l# x! l2 I9 m! w9 ?8 E. F. n3 ~

3 w: h; n! `) i- s- ~" |    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN) h0 N6 ^/ X2 v: L; }4 Z$ x
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT# H) i4 z% W: s+ e+ E8 t8 b
    mcasp->regs->PFUNC      = 0;          // All MCASPs
- v/ H  v$ P8 N! {* Q  K    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1) K( Q0 V9 _* `+ f

* o; g% Z1 i) C( M) n7 P+ p    mcasp->regs->DITCTL     = 0x00000000; // Not used- R" v! t4 c; [( P: \) `
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
( o  H, h7 u) l9 i    mcasp->regs->AMUTE      = 0x00000000; // Not used) w  p$ o9 M' h; D+ q2 e) K: J
6 k4 R5 T4 b0 E; n
/* Starting sections of the McASP*/9 \' ^, _' F3 g; x" L: N
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
. y' `: h! N+ W' @0 `    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  0 e0 v) n- d5 R3 U: A+ ]
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; " z% W; f7 n9 R+ r9 f4 O" `
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
1 y9 M# c" w( _/ e6 T9 y: f( R* Q; Z3 Q. G: R2 R
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ( [: e$ ~* d, ~& y
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
" C# ]$ p) _7 D: F7 r# Z    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; * A' s$ J" `$ g5 g, r5 e
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );' ]' A# w0 c% ?
' v/ b& [% T0 b- h4 p  J2 u/ A" X: L
    mcasp->regs->XSTAT = 0x0000ffff; " v' b9 e# c# ~2 q, @+ }
    mcasp->regs->RSTAT = 0x0000ffff;
* x( ?* e; g7 S- u2 d  P3 n
* i. w4 @. [9 Y& C    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;# s* H3 H7 C7 ?) Y; l( u
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );1 N9 Z3 T& H( W& m0 n6 ~' M
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
' N) d' a& T5 _+ t% S    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
. ~8 Y2 l( \: I1 X% y  S, P" P- L
9 `3 D9 l0 s2 d" I% s    /* Write a 0, so that no underrun occurs after releasing the state machine */
/ ^' M2 J! ~) T2 B    mcasp->regs->XBUF5 = 0;( B! K' S# Q% D, ^: K- G8 k/ K
    mcasp->regs->RBUF0 = 0;
# L1 i  @0 i8 W3 C; r# s5 P$ B5 I4 k( u3 k
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
1 ~9 R  U6 I* b    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
3 m8 |7 Q0 a+ m    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
0 K% E# C! k) Y' j8 O; a$ K    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
+ F, @; M7 J7 V8 l) C2 g6 k/ |6 u& M" j: Q! g
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; $ Y- r# o' d) d/ `$ t# Y0 h
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );. D! J  t8 K) \( t
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
6 c0 Z7 p' F3 P8 ]6 k$ x* U    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
3 U+ ]  O6 N5 n- d0 h
/ U8 H1 _5 A4 s- L, [    CSR = 0x0000;
/ f6 A9 G" k4 M    INTC_INTMUX1 = 0x3d;
6 ~9 f: ]) L9 n" J+ h$ y( A    ISTP = (unsigned int)vectors;
: q- i6 f( }% N* _: ^, r6 |    ICR = 0xFFF0;  
/ A$ J5 j' z4 W/ v8 G    IER |= 0x12;  8 G! B3 P4 A& j- ]3 `, t, q
    CSR |= 0x01;  - d8 W# Q# l  U. c; ~
) `9 m' A2 i! J( m

; N  q7 F/ s0 @# V. q3 K
; M3 k2 @( _4 J/ X, U0 }4 d( f7 C还有就是两个输入输出函数:9 F3 q0 K7 J9 {
void output_sample(Int32 out_data)
& b& Y/ o9 j* U  h6 q9 c{5 f. F- _+ I/ I- M
  AIC31_data.uint = out_data;  
  D: I$ x7 ~' J  MCASP1_XBUF5_32BIT = AIC31_data.uint;
- D. R1 t, l4 D9 f4 w}
( ?. E$ Z" \/ e/ Y
* u- X: P# W3 d" f& MInt32 input_sample(void)! C% N2 j# V  Q/ u
{  " r- j1 c6 x9 S* z
  AIC31_data.uint = MCASP1_RBUF0_32BIT;: M( ~7 V& @" H; P1 p
  return (AIC31_data.uint);
' h# G; Y5 O, K}) }. Q; A- ?0 |; B6 p

" a- Z' ?# N& e! H3 Y
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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