嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:4 X2 l+ Z& e, }9 K; ^7 q
main文件:" |6 d& K( m; ]2 K4 O) D
interrupt void interrupt4(void)  
  w9 [+ K7 G, ?$ ?{
" S  I2 v9 D0 U0 y( G2 r  Uint32 sample;, N* t- {) ]( C0 g; ~/ q

9 R1 ]. p! M/ p' ]  sample = input_sample(); // read L + R samples from ADC
. s+ @2 G. ]7 Y/ w; ?  output_sample(sample);   // write L + R samples to DAC
0 T1 P* d  |0 j) l0 k: a; Q, w  return;: \! @% u% z1 B8 P- i! q
}" f; M7 d/ y9 M/ B
* d0 Q& h" U4 ^
int main( void )
, E* t; f$ [0 n0 v{
" `" q1 `  ~& r3 @+ G- [. W( ?) K" W6 {, @5 H: s8 q
    /* Initialize BSL */
( S3 H: X/ R/ T$ y" j+ W    EVMC6747_init( );
+ R7 j! ?  R- ], W9 z) `        /* Call evmc6747_intr function */2 ^" }" j1 o0 z0 G8 p9 [% b5 U
    aic3106_init( );) K. }4 b, U3 F' w8 G5 c& @! l
        while(1);
" e2 U9 W4 ^/ N' f' L7 |  b}
: E5 V) G2 q! e' e) ]7 p  h* [
1 g7 g" l( B* @; m+ X8 T& G3 M7 b& e* g8 j1 H4 P& X
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题2 g8 m1 g- B! p1 Y5 A
/* Initialize MCASP1 */
6 c! e+ C8 H/ E; [    mcasp = &MCASP_MODULE_1;2 i+ n+ i4 Y7 Y6 ?8 n5 d# u
    mcasp->regs->GBLCTL  = 0;       // Reset3 ?, e' O4 _4 O$ E5 W
    mcasp->regs->RGBLCTL = 0;       // Reset RX6 ?' b! a9 Z$ `6 G% }5 S0 Z
    mcasp->regs->XGBLCTL = 0;       // Reset TX
+ b% i8 q; }- S4 N  k/ T1 t: r    mcasp->regs->PWRDEMU = 1;       // Free-running
) S# X2 h: }  a+ o   // configure McASP0 receive registers2 r2 d$ E4 I0 n# A: `& j, [
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
# Y9 J. y4 s  `* g7 V8 q+ L    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 a! v& N; j  b) u+ v    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word( ?  K( a7 m8 ^. h; O
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)3 M% u' i4 B% e; W: w
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
" z- [3 |$ o( _( n    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1) X, q+ @; O: v6 ~% }, c8 x
    mcasp->regs->RINTCTL    = 0x00000000; // Not used# f7 m% r/ Y$ q2 T4 @
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 q! h$ E& E8 J; X4 m4 f9 n4 V- G$ m4 w1 G
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
) V/ g. y2 ^/ d    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; |5 Y9 K7 G  I% @5 N$ B: p8 n    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
- C0 i) ~3 k6 x, Z    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
0 D+ b: W1 D/ T0 e; o" F# p    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
* S: [0 d) v# {    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
6 E! K- [+ L$ S8 h8 ^    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
8 r/ ^1 f8 ?, Z& H# a    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2562 a2 N5 N* k: K; ^  ~; k3 O7 b
2 [8 b0 V8 \/ G: x7 U
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN, I5 Q$ ^- }9 p- O' k: X& y$ H
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT8 O. Y/ G  I7 R, R: a5 Z
    mcasp->regs->PFUNC      = 0;          // All MCASPs
5 ]' d' c, g; [) [    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1$ ]. B4 ]/ |+ u) F

7 _3 v5 }, |& p2 B- V1 G. n/ R    mcasp->regs->DITCTL     = 0x00000000; // Not used0 i* A) Y  O9 k1 k3 A
    mcasp->regs->DLBCTL     = 0x00000000; // Not used% @* N- z( {3 g
    mcasp->regs->AMUTE      = 0x00000000; // Not used, }# S' J) v/ Q

  w+ ^4 v$ I7 n6 T8 }/* Starting sections of the McASP*/
) X6 \1 s0 Q! w1 v    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
4 H4 \2 C6 n/ V- z* [    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
; M" i, o& E3 K5 r: K    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; : Q5 C6 a! _5 T& Z' ?; j
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
; D/ n; r1 r1 e
- i* t! H5 f+ N; ~& o$ o    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ( z3 c- F- i% o$ f1 |( M0 m' R
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );: a' P/ {( X# w# H
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; * c; i/ I' U' A/ I9 \
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );) t* I* F3 D9 Z+ t
9 e& G+ A$ x( q* g* S
    mcasp->regs->XSTAT = 0x0000ffff;
: C) Q" h" N4 Z: w0 t$ S' n* I    mcasp->regs->RSTAT = 0x0000ffff; % w2 N/ u1 \# p5 i
5 y5 x8 X2 r- W& R7 f
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;- t. ?  A( ?* ?& S5 q
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
3 N6 D! W9 p5 B& {+ B5 e    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
+ @: h0 n( F$ k0 g! z" S    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
9 ]' j3 ?; s* P- ?3 h$ j/ T5 e# b. _; c* _- ^; {2 i
    /* Write a 0, so that no underrun occurs after releasing the state machine */
/ E3 ?+ q& I4 C/ u% a; m, h& c    mcasp->regs->XBUF5 = 0;
- W# e5 r3 m: r% V9 ~: z9 y+ @    mcasp->regs->RBUF0 = 0;
) [0 v" g: C; i( v/ k% o. t
+ q+ k$ |* ]1 z" x  z    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
' {) \. U1 X8 {- \    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
1 b0 ^; A+ K) a! y. z+ g& t    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; $ F5 u2 j5 h& ]& ~, X! ?! j
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );9 C7 |4 `# y( q6 C6 d$ m: w

+ l% e  t9 U7 _! g$ t    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; - M2 d' }: h  c% k5 M4 F
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
7 J! q" Z! [$ ~! u5 `    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; - L: p8 c2 H4 u
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );9 i% I$ {+ a4 E* A3 ^1 z

- z5 K. M. Z# H; \    CSR = 0x0000;) ?; A1 M6 u7 L) g" j: ~7 g
    INTC_INTMUX1 = 0x3d;, Q: a1 u) v1 o% r
    ISTP = (unsigned int)vectors;- P) d+ Q" S/ y
    ICR = 0xFFF0;  3 B4 t) Y# [. F
    IER |= 0x12;  
, Q- E* c1 g; L& O    CSR |= 0x01;  3 {; {! q9 C9 ^+ Y4 j8 _) D
1 K" m- e# v( w! [/ r4 B/ M
) {9 t1 b! Z8 G5 }6 d

+ {3 M0 [/ ~7 s: M6 D7 @9 p; m% d还有就是两个输入输出函数:
/ I% p8 u* r3 t$ F7 F$ e3 D$ V9 zvoid output_sample(Int32 out_data)
: `9 a- Y  g- R* p& w9 t{- w3 B( ^) Q( x& p  l3 j0 [
  AIC31_data.uint = out_data;  
* k, c6 n; ?( [4 ~8 }5 n  MCASP1_XBUF5_32BIT = AIC31_data.uint;6 H, Z, P' x" s5 l! B
}% R) e% O3 _$ `5 G; w( [5 }
) g. K- x4 H% A% p
Int32 input_sample(void)+ k: t% {0 D8 W7 [+ Z
{  & H5 T0 e' I: `3 J- `
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
$ O$ j) t8 L' Z  return (AIC31_data.uint);& w* W1 c& y. i, C6 b7 s
}
- C' h3 K8 m  |# ~/ b9 g/ L- _# W. g' P' J3 `! B

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




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