嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
* @. n2 v  v1 L/ Fmain文件:9 c1 C( W3 x+ Q" |9 o
interrupt void interrupt4(void)  0 L4 ?) p: v1 J* S+ ?
{3 {. n; E( |* f9 d% e6 Z' F8 y" U
  Uint32 sample;
6 s2 u! l  {6 a/ Q  R! m
$ q8 T: ^. `7 S& ]9 l  sample = input_sample(); // read L + R samples from ADC+ j! Z& q. I+ W9 s: \; S( J
  output_sample(sample);   // write L + R samples to DAC 5 N& g; x( z8 Y. u6 w0 D
  return;
3 C4 j/ `! u5 a! }3 k7 e. M}5 P  F( S3 u. _: T5 _0 @7 ~

1 N! N/ V- P" R) l9 r: Vint main( void )) c9 v) x9 A9 G; s% F% c! ^
{
; l1 k- g8 d( ]$ s& g* H' o# l/ ?+ O/ L* I% @+ v; _) s( K4 T
    /* Initialize BSL */' V  a: C- G( U% P* w
    EVMC6747_init( );
4 F) E2 E/ P5 }- d        /* Call evmc6747_intr function */
2 V+ f; j& H6 N5 O2 W& h! e$ W6 O    aic3106_init( );
* t5 p+ ?( a9 I+ r' F- X        while(1);
7 ?* h- w, B, }}
* N% o0 I+ g& y9 g# i0 I  z
5 L7 ^" s0 H9 V+ x- N$ g& u" \$ ]' B2 Z) l! }$ e1 K7 ?5 A5 U  N
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题1 W) V: u1 C8 Q# d5 I; R
/* Initialize MCASP1 */
( M# ?. S: p6 y+ y- L) Q' c7 d    mcasp = &MCASP_MODULE_1;4 I8 F; s( P8 x: W( H
    mcasp->regs->GBLCTL  = 0;       // Reset
3 b8 G) f6 w% Z    mcasp->regs->RGBLCTL = 0;       // Reset RX
/ u+ ?8 Y0 ?/ q; Y9 U$ a% x' J9 X9 I    mcasp->regs->XGBLCTL = 0;       // Reset TX0 o" [/ D3 y  J" T6 K0 O! p. b+ g
    mcasp->regs->PWRDEMU = 1;       // Free-running
+ E! C) |$ D* |8 T) w6 R: M0 D) a   // configure McASP0 receive registers* \& w) I: T& B! T+ U) O; {
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used5 ^* l- [- I' j+ q+ w0 X, o4 I% Y
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 M) z* C* Z4 X% L3 t    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word& z0 z% ]( |- D, v( q- }
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
& l4 y) p' h* A5 C; C( _) `    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
# A) p' G& \' c7 u6 N) ^7 d    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1! ~0 D+ p) X$ Z* m" c8 z( p
    mcasp->regs->RINTCTL    = 0x00000000; // Not used3 T$ w# c# _1 c
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256  O0 n% j) ]" h# J7 e; Y; ]4 E/ |
* x- B- ^4 S9 H% j* @
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
: e  ]7 A1 \3 R* L    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 }+ I+ W9 g# m' x, g    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word: _, Q/ A  a% t. y( q
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
4 c7 D3 X" m4 [3 `5 I    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
* N7 x1 R2 d: u0 r    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
' N' V$ z9 H2 T    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit8 }  _! t) U- a; E2 |5 g
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2560 j$ v: g. t  n% b" G' U% M- F

1 ?/ Q4 X( P( n, e    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN. k2 M: ^: E; V
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT# Y, K% I# d, q( `# o4 u
    mcasp->regs->PFUNC      = 0;          // All MCASPs
! z  _! d8 m% e0 Q    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX15 g2 |) i/ {( f/ ]. r4 `/ y5 }, t
4 d4 @6 n! T1 t0 [7 H1 o; t" g! |7 R
    mcasp->regs->DITCTL     = 0x00000000; // Not used
( L5 R# k& S6 V1 i    mcasp->regs->DLBCTL     = 0x00000000; // Not used! C( ]: T9 k  D: n
    mcasp->regs->AMUTE      = 0x00000000; // Not used
' S: q9 p, Y/ d6 q2 m, S) L- V( Y1 P0 f- i. j0 o; y( a) {
/* Starting sections of the McASP*/3 I" O8 v' C+ n$ ^
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
3 w( p8 d/ I' b$ z& V8 c    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  5 a" Z. }$ h& ~; p
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
. @. F, ]1 v& i2 P6 J% [& L) X# n    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
' z3 S" j1 B  ]. b, E" g$ j7 C( E
3 E; Y( X+ _  J6 a    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 5 _' k9 T! y8 J$ V8 t9 R
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );1 V8 L" c% e0 D0 a
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 5 y2 C8 \0 h) Y$ g
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );/ Z$ f/ }. n: x+ O# ?# U
  l* N) R- u) D, R& k' T6 f( Z
    mcasp->regs->XSTAT = 0x0000ffff;
) e* Q, S8 T2 w, |9 |5 a    mcasp->regs->RSTAT = 0x0000ffff;
, y) |' w% Y: U  Q! X1 l, l9 r3 K& O5 Y
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;7 {# q0 J" P- }7 L+ N# W
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
3 G# @- N5 h" ~2 K7 T4 j    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
, k! n8 X& T$ X' z    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );' D4 i. _* @% U" Q5 p

4 X1 g6 \: c2 q    /* Write a 0, so that no underrun occurs after releasing the state machine */
% b. V3 g5 c5 y8 Z1 A* b# s    mcasp->regs->XBUF5 = 0;0 K+ d5 d$ E% a, L" l) w% h
    mcasp->regs->RBUF0 = 0;6 x6 g' m6 F! C6 J# d5 C. T, c0 F; l

3 |! B& A; \8 h# ^# Z8 F4 Z; R    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ' f" M6 Y7 _2 n* ~
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
" o* c  C7 W+ F) R% H# B; j% L3 U, a    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; $ c0 z  \+ p9 U# O- y( r/ L; O
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
; s- m& q1 ?0 D
, Q, Q3 T7 p$ E) @: T( @5 h" o    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ' ]4 V2 l' U* u3 o. v$ T; d9 y0 G
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );( N1 P1 D  X! l
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; # w' Z# U' ]) C$ v1 T6 I
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );' R1 l$ y) |- U! i6 D* K

$ t( X- y  H( z" L7 }    CSR = 0x0000;: {) @  r# P, }& ]! _% x
    INTC_INTMUX1 = 0x3d;
& |/ D# }+ k8 X. U( H- q' d    ISTP = (unsigned int)vectors;% H3 y7 j" M$ }& ?0 ?  _
    ICR = 0xFFF0;  # T3 v3 W0 W% J9 P' g7 O: H0 G+ e
    IER |= 0x12;  
- m2 A- H+ k  P    CSR |= 0x01;  + o1 G7 C. F* ~! h/ v! D; s$ j# {. X
+ v( o- g, v0 m4 L

, n* t' G! Y1 i( X
% s4 p! a' B0 t( C! f8 H$ ~  k还有就是两个输入输出函数:
/ p8 ~& ?, @1 b3 A) G7 J- Yvoid output_sample(Int32 out_data)
8 Q! d  N2 b! v0 Q) Q$ q, u{
6 D( b) ^2 F' O- {8 B  AIC31_data.uint = out_data;  7 D' R  R$ a" _9 Z
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
& ?) d8 R1 J( @; |}, Q. ^: U3 ]2 w% a+ @; E- O

! [9 N. R" _- IInt32 input_sample(void)5 Z0 V. k  T' I) ^3 B, J
{  
' P+ @$ @! Y0 q! Z2 V  AIC31_data.uint = MCASP1_RBUF0_32BIT;- c% Z( v) e, D% W
  return (AIC31_data.uint);
; `6 C; T$ n; `: v}, s7 v8 U  w7 h0 I& d& t7 K: t  s3 S

- d1 j. ]& ^; ~6 J
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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