嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
5 R( l, [6 w! ~# G  t5 Hmain文件:
$ }3 V/ B7 U% B# }* g' n# r" l* s% h% xinterrupt void interrupt4(void)  
, E' {  I; E5 ~+ n* [3 l' i{
7 ~. S$ k& }  K4 }  Uint32 sample;
$ W& h# H, _8 P# I+ b7 N+ Z6 X4 R' e- u( D0 _
  sample = input_sample(); // read L + R samples from ADC! c# }" R" _- @4 A) u0 J
  output_sample(sample);   // write L + R samples to DAC
# Q, I; H, O) [% \' Z( F5 v. m4 C8 s  return;
( ^* h/ y# f. [1 c+ ?3 @9 {# X}
* O( I7 r0 C' a& Y) N8 Q8 n& w* r; F- B! K4 K7 I
int main( void )
, K& d) A  l. M" p: h$ U& |{
* K* @7 E/ n: m
+ L% T% Y) ^, R- ^4 W3 v2 m    /* Initialize BSL */
: m7 ~+ K& b# A! w* i" [    EVMC6747_init( );0 W4 ?* K7 N* N0 F. P
        /* Call evmc6747_intr function */3 A" u# \8 b2 n1 m
    aic3106_init( );5 D: `. q: K& o
        while(1);) z; s, I. N$ F
}
" M2 U; _; o2 A4 _0 U2 x# n- ~% n3 _! o  l, r- @# |

5 S$ g: p- z. M$ daic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
) [% J" Q6 F& n( m/* Initialize MCASP1 */
; ]. X9 f5 b, x    mcasp = &MCASP_MODULE_1;
: P$ ?; A5 g, y5 F3 l2 U7 X    mcasp->regs->GBLCTL  = 0;       // Reset. l6 \+ S6 ~, G; e9 [9 h/ `
    mcasp->regs->RGBLCTL = 0;       // Reset RX+ r& ?4 v! n3 j
    mcasp->regs->XGBLCTL = 0;       // Reset TX. [; O, M9 {4 h! Y4 V1 ^
    mcasp->regs->PWRDEMU = 1;       // Free-running
8 }3 V- M" e3 d. F   // configure McASP0 receive registers" y, v2 G) ?$ a: o
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used- ?. p  {1 a: X/ E' V" @  V+ r
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus8 G! C9 h: ^; W
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word* o" a' a: L0 d' T
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)9 S; e. k- w! a3 P, h- S+ ^
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
3 C" q5 K- _! e    mcasp->regs->RTDM       = 0x00000003; // Slots 0,11 `; _& b6 O; z
    mcasp->regs->RINTCTL    = 0x00000000; // Not used( w$ N7 ?- m, Y
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256& p- F. b* ^  K/ {) [& I

1 S1 w/ R, r1 B5 H3 e    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used  l. R" X! M9 N
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus# P! D( C/ M& |
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word4 A* v, c9 E- q& H
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-164 c2 Y$ H8 E) f' K$ y" [  c
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK0 ?* M1 o/ E. J8 l: A3 O. `
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1. `9 P& i& \5 m) ~
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit; e9 X! L9 E7 ~4 C# w
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 Y  w) c  C% E1 V6 C% J" h( O/ ]; {4 |. A9 i+ N/ o; k
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN$ T/ m* ~- B! [; S
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT* `8 |6 r- D  X1 Z: x$ j- i
    mcasp->regs->PFUNC      = 0;          // All MCASPs0 F+ S  p+ `! s
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
& h. F7 G: O, r7 r9 }7 q
1 K! e, l& V3 i: p    mcasp->regs->DITCTL     = 0x00000000; // Not used
' }. _5 x: [6 i; P8 y. a    mcasp->regs->DLBCTL     = 0x00000000; // Not used
8 z# f( @+ `/ p7 d+ y# _    mcasp->regs->AMUTE      = 0x00000000; // Not used
3 [( ~$ O1 H6 ~) S4 Y
  e6 j' f: t  `8 k/* Starting sections of the McASP*/  }0 e; D  T6 }7 g
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
3 l# g: X& V+ X) r( J: v) B    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  - U3 U- d3 T: H3 k4 f' H" V1 K0 h
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; % @2 T0 J+ Y; |
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
& g9 \, w7 E. A8 I  ^+ x1 F
! J  b- ^- W9 M, i/ T8 Y/ L    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 0 x3 }9 G( U9 Q$ [
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );. H" C; r0 y! w0 q
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
- {* J, J5 f% n2 X    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );) M& V5 P. z  x. Y/ T5 M, R
) m' K% z! x9 e5 C0 E5 O8 V
    mcasp->regs->XSTAT = 0x0000ffff;
3 L0 r  C3 A  q4 j0 n; v    mcasp->regs->RSTAT = 0x0000ffff;
) {, l8 d/ z6 e6 x9 f8 b6 H! u0 G3 v9 T0 {) B' w* L, g' d9 n
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;7 j1 O; G' K* R# [8 L* g
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );3 e9 z5 i; Z3 {4 J# q+ K' V
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
2 H7 ^; O+ {5 _/ f& M$ p    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
( u+ P. f( ^% W& j! F: l/ [$ J$ {1 e% ^3 j; D4 c, s; V! z9 M! a: I
    /* Write a 0, so that no underrun occurs after releasing the state machine */
4 a" X: U, S! u' d3 v    mcasp->regs->XBUF5 = 0;+ \% d' l, c+ V8 d# E7 J: P$ g
    mcasp->regs->RBUF0 = 0;
$ ?- M1 z1 ?, y% {, R0 j: V" B2 b; j, a# l% Q) ^. X
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; % J* m! c# e# D9 k4 R' L8 m
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
1 `! T+ ]  x3 m    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; , N  j$ T$ `( n: `4 G  \
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );# G3 X' V$ G" a5 ]

. B( _& z$ i% t$ c$ X    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
( c+ m3 d/ \8 q& a# o% Q1 W    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
4 ?. n; n- w: K& h- Y8 L. P    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 1 f- m) L& v1 D3 O( r% i
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );/ k$ h0 Y& x# r) ~, _

; m* j% q3 r. |* S0 |    CSR = 0x0000;$ C1 p+ ?: H+ r+ `! A6 o
    INTC_INTMUX1 = 0x3d;) ~- n$ {8 g. h* M$ n
    ISTP = (unsigned int)vectors;
1 q% T2 {: O) e2 p. `9 s$ A    ICR = 0xFFF0;  
$ n, L% _! v+ W' Z1 C    IER |= 0x12;  
+ A" N* W# n/ J+ \    CSR |= 0x01;  
6 x+ J& ]4 f; C' N3 S- F$ i
9 t+ O/ e" A7 ?; @9 |$ o( B0 B- M# M2 N( n& M- x8 F2 t3 C) e& c2 m
. |6 g$ w: S. A, c* Y" ~- V# h3 z
还有就是两个输入输出函数:
, ?6 t. E- C( [; wvoid output_sample(Int32 out_data)7 T- b7 D3 P+ R/ k3 o* N
{3 m, `- h1 F$ @% I# u' U9 I6 u/ u
  AIC31_data.uint = out_data;  , R) I. d2 F( D" M% b6 A4 J5 t) g
  MCASP1_XBUF5_32BIT = AIC31_data.uint;, X& m, E/ v, N/ S8 K' b
}
" \# Y) u& @* K; p! J3 p3 d  }- O. @- Y( J! S8 T7 ]6 ]
Int32 input_sample(void): o- ?; ]  ]% \% S0 d" k  h; ]: j
{  
. u3 h8 \) h8 l+ S0 V- _( s  AIC31_data.uint = MCASP1_RBUF0_32BIT;
+ I' `* ~' {; O+ {  return (AIC31_data.uint);
+ P; \) F' z1 w  w: F3 d( C8 g}( j5 R1 K! C% j

8 `1 d; k6 }9 J2 h: x
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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