嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:7 K  z% p. V4 [" z
main文件:
. u  F6 S! M  _interrupt void interrupt4(void)  1 ^% o/ U4 U$ _9 N$ a) q
{, j/ ~% f, z( ?" ^7 z
  Uint32 sample;
. j( m: q& d: a7 |8 ^9 @. S$ P: P9 X
, l' d$ c! F+ o( f; D7 J/ g  sample = input_sample(); // read L + R samples from ADC. x8 ^! J9 s4 n$ ^
  output_sample(sample);   // write L + R samples to DAC 1 Q6 S: I, Z+ {" A, h# d, X
  return;% n' V' C' |: n+ t2 s* Q  K; f  I+ ]* ]% H
}' B) a+ ]( p6 [6 z& O! _

  Y8 d  |, M; o7 J. m5 Iint main( void )8 b  s# e4 R3 l* Z
{) g4 a/ v3 B. t. n  H+ i* e
9 [' ~+ ?0 W  _& U5 `5 }
    /* Initialize BSL */
/ a$ n" K9 `! M4 y: h    EVMC6747_init( );
6 R$ _1 j: Y! Q9 e        /* Call evmc6747_intr function */( O7 P- `4 S3 O5 H1 E9 R* O% k
    aic3106_init( );# E" N* q$ k7 d0 j- X
        while(1);# G' g' D# S8 W1 Y2 L
}# Q6 t1 n1 l$ e! \. R

) v" r# G$ h* C8 ?7 x3 f' m1 r" n% T/ P  L) O2 S; F7 ?: t
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题$ I' ^. K. G' r' Y! w: Z3 r6 j5 q
/* Initialize MCASP1 */( l9 y8 g* n2 d( G
    mcasp = &MCASP_MODULE_1;
3 G7 P* B- J. P( ^3 e    mcasp->regs->GBLCTL  = 0;       // Reset9 m, R; m' C) i" x
    mcasp->regs->RGBLCTL = 0;       // Reset RX
% n: Q1 F0 C4 K$ d4 x: K    mcasp->regs->XGBLCTL = 0;       // Reset TX: K9 p0 a! x& H& d4 O9 `
    mcasp->regs->PWRDEMU = 1;       // Free-running
& ?+ o- i+ i) O5 X0 o3 T7 G   // configure McASP0 receive registers9 M4 a/ G. M0 ~  `7 D
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
2 ]) g+ K) W- m    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
5 t8 X2 K. o9 V  i. ~7 R    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word1 _6 S2 c5 c) o3 B( @' I
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)7 ^0 `' ]. @* X7 U2 R+ y+ A
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
" Q# G3 o5 `! n' M7 ~    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
9 A# u9 J5 G" N3 Q7 v2 L) f# a    mcasp->regs->RINTCTL    = 0x00000000; // Not used
7 [/ G+ Q8 Y, }3 I, A    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: I$ e$ K( l( ?& C% k. n# x, ^* Q9 v+ N
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used% ]3 C# m" Y1 s, N# V! W' y7 H% p1 w
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 y! v6 a$ W8 e" x* k, u    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word' I6 P$ d1 k9 z$ `  \; L
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
( O) [0 |* O# Z" |    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK# F; Q  V: q4 T. A* W
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1! D1 m7 B' q2 D
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit( s1 T/ w$ U1 C' _# F
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256) c& b8 S0 p/ B

& |: W* B0 t+ T    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN: i' {* a9 ~# J$ E1 i7 R
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT6 a2 r0 }6 [: {  V6 e
    mcasp->regs->PFUNC      = 0;          // All MCASPs* c4 [1 R# f! [+ B/ o; ]- R
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1# ?- u5 x: t( G6 g9 P& R1 S

8 J9 P+ j* M0 A    mcasp->regs->DITCTL     = 0x00000000; // Not used3 F: Q3 X8 h, e2 @7 i7 q
    mcasp->regs->DLBCTL     = 0x00000000; // Not used1 K5 Z1 L3 _6 x5 I: u4 s. u
    mcasp->regs->AMUTE      = 0x00000000; // Not used
1 D7 J- v9 a9 G+ q$ R, g
6 w. x2 m5 p4 M: {  d/* Starting sections of the McASP*/
% d4 m5 e# e/ R    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
& j, p/ I! a! M    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
2 D8 u) |  h( ~- @    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 7 _- ~2 a: g" C; H" \/ x- b% y
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
7 |2 h! g2 }/ T6 n; r1 a8 U. c+ X* b5 b; h0 D4 ~9 o
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; / W! M9 W4 S( b9 ?! T( Q+ I" y2 H8 y" ?: q
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
4 r2 a# m4 r7 A0 z, {* v( `    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 6 b; v" i  n9 [- I
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );& I  e# ^+ H% w9 _# Y- P8 n

. E5 r; d% _6 a. \0 Q/ e    mcasp->regs->XSTAT = 0x0000ffff; 9 T/ P0 W% m; e
    mcasp->regs->RSTAT = 0x0000ffff;
" Y# z# k4 s8 w/ U( d: r/ N; ]6 Q$ d% _! ^' r1 D
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;1 D  U+ m. v( j% Q. @
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
: H. K) X) O- m7 ?' u    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
$ n6 U! j5 f: E: ~9 Y    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
) i) T0 i$ y. R- ]+ x* ^4 P/ X% C; U4 t/ `8 h+ ?
    /* Write a 0, so that no underrun occurs after releasing the state machine */
8 ~6 f! {6 @0 {3 q    mcasp->regs->XBUF5 = 0;
7 @& w% N+ j# O5 e- j# @1 m    mcasp->regs->RBUF0 = 0;& A; Z4 w* E- C0 \1 j7 s% X
- y+ A" }( @5 ?; w
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
7 ]9 P3 I4 @& Z5 R% \5 V' b    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );/ C) y3 v- E6 `, T; `! @
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 4 y; Z; Z6 j# j( D, B7 A  I
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );( s4 a: p9 \/ L5 j" C

. @) G( z2 z; s/ C( K* ]. i    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
3 {7 y9 z! c  i; v7 ^1 ?    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );1 _1 X% I, @& H
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
! J% P* k- I+ E    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );/ E& [6 m- I) h

  K, i  w( v' l' U/ @0 Q    CSR = 0x0000;; D: w( z7 {2 \; x
    INTC_INTMUX1 = 0x3d;9 G0 T2 S' D( g/ W) i8 }4 @1 @
    ISTP = (unsigned int)vectors;
( [& t/ p2 ]% o% {    ICR = 0xFFF0;  
+ Y, Y2 o4 a/ o. F    IER |= 0x12;  ) \, K* j. \8 d( G0 x, S( S
    CSR |= 0x01;  
  G& w+ k* @% ^1 L/ V# }- b
. _/ k2 x  C0 N5 J; z7 o( e8 P3 _9 G, W
1 J% w' C# V6 a$ M) @' H/ l. @
还有就是两个输入输出函数:
4 a( n, t3 y  o4 @5 z8 Dvoid output_sample(Int32 out_data)
" [' D% K- T" |( a" `{
! r9 x6 M0 m/ l, x' A  AIC31_data.uint = out_data;  
7 I6 h! q- j# w4 k) q5 f3 k  MCASP1_XBUF5_32BIT = AIC31_data.uint;: Q: I  \: w9 z+ M& W2 {
}: H* \7 [9 I. p6 y4 t3 q
% e% ^! G$ F3 a- J8 k1 N$ L
Int32 input_sample(void)3 ^/ N. q2 r; w" ?
{  ; E* z) m) E8 ~. a7 m
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
8 m$ O2 N. R3 r1 q& H  return (AIC31_data.uint);
- m' ]! a6 B' S! G( u6 J}& N& U3 L9 K/ r6 J

# q+ ?$ U! e" w2 T7 |$ J. Z% }
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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