嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
! r* P1 @4 d  m3 f: r, p) |main文件:
  s0 @9 P$ u8 R! A" D7 jinterrupt void interrupt4(void)  
4 d" \" s+ t; W% j, S9 S  T{
1 I, V8 r9 o: q" |' L: X- c# [, l  Uint32 sample;4 w2 r- }% o5 E

! a/ L! J$ v! ?3 C  sample = input_sample(); // read L + R samples from ADC
. u- m: {- }/ T/ g  \  output_sample(sample);   // write L + R samples to DAC 6 m6 a' O, f( q, o# Q( [
  return;, T6 J+ s; D3 w  d' k5 x4 s
}
& h$ k6 G; r/ m" Q$ l! K# W& A& p; q8 d9 K: g
int main( void )' Z3 x! ~3 N3 m9 B
{# @/ e2 D8 i) a
9 K- q8 ]: p8 N. @* c+ A
    /* Initialize BSL */
& N$ T$ O/ M! K    EVMC6747_init( );' J/ a/ e! n: N# D
        /* Call evmc6747_intr function */
6 P. D8 @0 ^4 n+ J6 y4 q7 }    aic3106_init( );7 X4 i! p6 ]& p0 p! m6 G
        while(1);
" R3 J+ D  W/ F) A& k}
: R! m. @; R  c% f6 u$ ~
% O/ Q3 u8 b) E
/ d4 H0 f0 Y; U1 z$ V" daic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题. o# z7 i. ]: h3 g3 u3 V1 E5 j" w
/* Initialize MCASP1 */4 O. n) J& T; F9 o) H' k
    mcasp = &MCASP_MODULE_1;
- D3 q# c* X' [: o7 t' o, E# ~    mcasp->regs->GBLCTL  = 0;       // Reset
  F! R: }, O) f/ W- D    mcasp->regs->RGBLCTL = 0;       // Reset RX
- h6 s8 a5 \" `    mcasp->regs->XGBLCTL = 0;       // Reset TX
5 N6 q3 D4 m+ B% [' ~) n4 R; y    mcasp->regs->PWRDEMU = 1;       // Free-running& v, Q3 v& d' l& q5 X6 y4 p
   // configure McASP0 receive registers& N6 U5 t* s1 I# x4 a# U
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used6 u" M) l$ _$ \# K3 X2 ~4 y4 N
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus. ]3 V! L+ L- X
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word6 M  c) q1 p3 H8 W
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)8 Q; W# S+ _, t0 o
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
- f! l3 J! `+ e, p/ [    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1$ ]) ^6 P2 v" O6 g' r5 n
    mcasp->regs->RINTCTL    = 0x00000000; // Not used# O( I; T/ X7 F$ X& v% _+ H: a9 I( N" ]6 B
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 n* G; _' R; ^( h8 N9 M* K" b/ }0 {
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used9 R$ s* Q4 m! O" j1 K7 L/ M
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus% X" `4 g7 K0 ?/ R2 b
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word5 @5 Z4 d  f: E. `: c, S1 J
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16& I( a3 m- U( H; [5 I+ O, \
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK, `/ x# t4 w+ w8 u: S8 I/ N
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1* W4 M4 {9 h, _3 k* Y9 l' O
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit. A1 @: `" n$ g) ~
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
' Z3 ?4 w$ o( `$ ^7 E! K$ i& o
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
) j. S$ n* j5 i2 t) V    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT! {5 r/ I! F* t/ r. T
    mcasp->regs->PFUNC      = 0;          // All MCASPs) \' |) s4 r) K' p# X
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
  T( P. E! J# T5 S. d& z7 ~& ~3 l  |% {: q- B0 b
    mcasp->regs->DITCTL     = 0x00000000; // Not used! r, x0 T' L8 M) W& Z+ [
    mcasp->regs->DLBCTL     = 0x00000000; // Not used" c& O4 @8 U* \& J( G1 i. _
    mcasp->regs->AMUTE      = 0x00000000; // Not used
$ t  u# f5 y9 y& G9 ^8 Z, N/ y) X% {; P! z
/* Starting sections of the McASP*/
! f, T8 E- I' z5 t! x  R- H    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ; {: h3 K; i9 `" Q' w
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
5 D+ K2 M+ G2 _& e; h( c    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
3 k3 r8 W( \1 [  k3 L8 I# B! S5 e    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
4 b1 y; {: M0 v" E
  a8 w1 {+ O" ?1 ]' L% W6 q    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
5 E2 P( W1 [3 O0 J3 G5 r1 E1 _* N    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );1 N" H1 h4 ?$ V: g" |! _
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ) V: C$ L. Y' l
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
  F% `$ K4 Z2 A
: ?# |3 ~7 E5 U! Y1 H$ Q4 ?    mcasp->regs->XSTAT = 0x0000ffff;
3 \  P  u7 T3 o. h  a" o    mcasp->regs->RSTAT = 0x0000ffff; * ~* E2 N6 L8 X
7 f2 \8 d$ k- r, ~1 Z/ {# ~1 N5 L
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
; \* w6 j; N2 W& |1 H    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );! Q# Q, `. S2 w
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
# ^6 E1 B( ]! U6 Z3 [  c    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
9 p: b# N3 E# |% }  W" d6 A) i# N0 U  b3 Y1 h9 }5 G
    /* Write a 0, so that no underrun occurs after releasing the state machine */  I: t5 L9 n4 Y
    mcasp->regs->XBUF5 = 0;
; R$ p: r5 f9 }& g: o    mcasp->regs->RBUF0 = 0;
" b% f# p' q: z8 O! u8 C. m# R8 G6 v
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; / I( `  L! `# ^
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
6 s2 y2 o9 l# e' y* s; V5 F- ^    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
. v, z* o2 _5 k, ^    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );2 f& p* ?9 _( o( S9 t& d
6 j) {$ j: b4 ]1 L. V
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
  v# i7 G# _, ?* I9 n    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );5 C! K0 v1 p* b5 b8 h1 o
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
$ X& `% o- V( e7 e" N6 t0 h% Q    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
7 O2 p* T; E- L, u& ]& }+ B. N6 j' N# U" u9 C! c9 L
    CSR = 0x0000;
' t9 Q4 s3 w4 B- l/ p    INTC_INTMUX1 = 0x3d;
, V- ?& V0 [, \; t* }    ISTP = (unsigned int)vectors;
. m1 p- U% s# O9 {7 G% J$ j5 v) {    ICR = 0xFFF0;  
+ ^. @( A- l' H1 I    IER |= 0x12;  : ~8 }* H; \# u2 Q2 s5 P
    CSR |= 0x01;  
# q; o! R) ~) R9 |# D
3 O9 |  m, H) Z0 a3 }8 t. P5 w- l+ c3 ]* j6 ?
4 {: t" O* n: ]7 \
还有就是两个输入输出函数:' {' U- C: J- [
void output_sample(Int32 out_data)/ Z9 z# Z5 v, i# v
{
* L8 k7 o( T: v  g  AIC31_data.uint = out_data;  
, q- z) x- N1 Y! P7 N) l2 C  MCASP1_XBUF5_32BIT = AIC31_data.uint;" H, _, U, r2 I  A7 h+ r: k
}
! N& K0 ?. W1 u( o" T7 h
; R0 Q" Y; e/ P; l8 M& nInt32 input_sample(void)1 \: S% T, z5 d* d+ a4 R9 ^
{  
4 z7 \8 W0 [+ d) y  AIC31_data.uint = MCASP1_RBUF0_32BIT;0 ]$ I* Q8 [# s/ [
  return (AIC31_data.uint);" o4 d: {8 V1 Q+ d/ k
}
9 _# K2 O" o- b' z( I
5 G0 k* `, C) B, C+ w* w' F  N
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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