嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
2 u+ f3 m+ w9 K/ }2 D  s/ H0 bmain文件:
. a3 J7 r) g4 o( vinterrupt void interrupt4(void)  ) y. E) a" c& t7 j+ {) V6 O
{
) U- x7 @( e( G/ G. D+ {  Uint32 sample;! P9 {: `5 H$ M" A3 I  `

, j- ?0 H, v( m. U; u4 x  sample = input_sample(); // read L + R samples from ADC
$ U9 Y9 U( F2 O8 C' c0 k  output_sample(sample);   // write L + R samples to DAC - {4 g9 `2 d3 Y' S- h- R% N
  return;2 k! x- R( ?0 h( Z  g% g! Q# u
}; x/ p. O. c: p) S& K% s  s
, K1 l9 Q* _; _, T' p- f; c3 X
int main( void )
5 `( k4 N: z1 {9 `* D{
' z+ Z' V/ o" C8 E$ ?
: H- Z; ^% _; T0 H- V    /* Initialize BSL */
1 U' C3 \3 q  B+ M9 d0 n2 I$ K" X    EVMC6747_init( );
1 J2 N& K- |: y# a        /* Call evmc6747_intr function */( I) D6 K& C0 ]1 J9 s
    aic3106_init( );
5 {9 i5 ~, `" y& h+ Q+ V8 ], `0 I7 r        while(1);' R1 ]! ^& a9 S  [
}9 P. O! f6 \( g' t& D; {3 [
; i; l1 W0 q) @' m

4 I, o- |' D2 {aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
; X4 I+ d6 Q" Y" W/* Initialize MCASP1 */
- F- x1 E8 l' G5 X' Y9 `' C% R0 Y1 y    mcasp = &MCASP_MODULE_1;5 e2 D1 t0 Z2 t2 b6 F, J1 i  e
    mcasp->regs->GBLCTL  = 0;       // Reset7 f4 x4 P6 z# ~! r
    mcasp->regs->RGBLCTL = 0;       // Reset RX7 c0 g: W6 o( V; B& O
    mcasp->regs->XGBLCTL = 0;       // Reset TX
" p# f8 Q% z5 s; {* e% p    mcasp->regs->PWRDEMU = 1;       // Free-running
" O( o1 m5 E; Y, B- y( i   // configure McASP0 receive registers4 I- v6 r1 H3 x3 e0 g! S
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
: Y! x( n2 C+ q    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ B/ U5 ?: T' m! ]& Z; l# W  ?6 c7 t    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
, `5 a1 k$ c5 P  |/ o! J    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
) y( e% h: }! {$ X* S' K, g    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)) U9 c5 ?7 _3 j4 [) f$ V
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
, c/ _: ~+ f( ^' {    mcasp->regs->RINTCTL    = 0x00000000; // Not used1 z( M* y$ d! r
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256. T! n0 {, Z8 a: o' K4 ?

' m& Y5 s) l7 K5 r( S5 H    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used; N) z2 r( F+ U/ \, I' u( w: H
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus! S5 s: o- L- a% v' U1 Z
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word9 r1 U# P3 D0 b. S
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
0 s  C5 B/ x; J    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK1 q  _7 Q/ x, f' }, @
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
/ `0 L* i% R" L, ^. ]" z    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit3 Q$ \# m& s0 ]" z6 \; d$ z
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256/ Q7 ~9 z8 }3 K* ~/ K0 X

" l9 C3 z3 T5 Q7 n' C    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN, Y) `7 r  D$ D! X* ]3 W; ]
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT2 `4 G; E0 M9 j9 f4 y  ^
    mcasp->regs->PFUNC      = 0;          // All MCASPs& l) L! I$ j+ `3 K3 p* P' s
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
9 G$ a% q2 o1 {) _+ e+ a, V" N9 f. S' e, v, s% f/ }" B+ h
    mcasp->regs->DITCTL     = 0x00000000; // Not used! y# Y7 U% @* ?- C! e
    mcasp->regs->DLBCTL     = 0x00000000; // Not used2 o) w8 j- q" b+ a8 A9 p0 `# u) l  s
    mcasp->regs->AMUTE      = 0x00000000; // Not used! q' r* `  j5 H7 k/ z

2 \0 K- Y, }3 `+ U, W9 P* t7 v5 u  A3 n/* Starting sections of the McASP*// Z  C' v3 c; U
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ( I3 x! G4 \; K2 |
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
$ i9 S  U# x! r9 V# `    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
( O) q7 L, Q% j" g' d- p  t: p9 Y    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );+ h8 J0 I& L* J+ U% r# |
7 b8 K% Y' Z" j
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
; x, J: L6 d" g4 `: V" g0 \    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );- P0 P! @7 H% h2 Y' l9 D
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 5 o$ K( c' m7 p5 B4 p% v8 @
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );+ z5 j, \4 M' S& s& r* O  s
9 }. `$ B4 `. O3 S4 }  a
    mcasp->regs->XSTAT = 0x0000ffff; ' `1 s6 N0 @7 |5 j( r& v; K
    mcasp->regs->RSTAT = 0x0000ffff;
2 l- Y) ]) L8 s- d( n& Z; ~$ A: C1 e2 `% [' y
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;5 i* w; c/ L* }% C8 |, v8 R
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
5 s0 {( A+ K+ w    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 7 L0 F: Y' _  a7 b6 Q
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
$ z% s7 s1 j/ H! v5 b
) Y# }/ L% u( G5 x- @' k3 ]    /* Write a 0, so that no underrun occurs after releasing the state machine *// R+ n* Q0 B5 C8 v1 ?
    mcasp->regs->XBUF5 = 0;& I$ G0 v1 @, D, ^4 A7 G9 Q
    mcasp->regs->RBUF0 = 0;  J& K* l( N' C, |

: a5 ^7 Q- S$ p7 J1 F    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 4 C! [+ g, |5 \( n7 m
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );  A. p7 p' I' ~; c
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
* V0 `% {; B- m7 C    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
. i' V  I7 H6 C2 w" X2 H- G: T' x+ f0 h& }
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ) V; F/ Z5 Z. |% b  k8 W
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );' ]) {# a, K* C) l: i
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
0 l! O% u0 P( Q' m    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );# z! e$ u% J! P# m+ o
9 O2 `+ i0 f, B; a9 g: H
    CSR = 0x0000;
! ]) x" Y7 o' U& D& R    INTC_INTMUX1 = 0x3d;
" Y/ Y9 Y$ Q' Z0 y    ISTP = (unsigned int)vectors;! l: l* ]9 e; X
    ICR = 0xFFF0;  
. X) d1 r  J1 w7 B: B    IER |= 0x12;  
8 d7 X9 l. @* L9 O6 |$ z    CSR |= 0x01;  
$ J+ i$ R! F$ U$ j4 K3 p9 }1 O- s) u6 |

  J3 n- x7 E4 t# q# c. V. E5 \
  B* s. e, X3 e4 v4 w' @! K" S  @6 h还有就是两个输入输出函数:" ]  A3 D5 U1 ~+ ]
void output_sample(Int32 out_data)
& X* e7 e. V3 I& N4 G2 ]$ M4 V( P{
9 a1 O  o2 N" Q7 M  V  AIC31_data.uint = out_data;  
# G% B& |5 M, U+ S$ `1 w1 @0 Q/ r  MCASP1_XBUF5_32BIT = AIC31_data.uint;% F5 f0 [2 T# O
}1 w3 W+ o5 K5 L: x/ V  e5 y

+ n  j. P* }% v7 QInt32 input_sample(void)" o9 ?7 Q, ]5 T. ~. K
{  
; B3 E9 l! q/ d) q) P  R6 Q  AIC31_data.uint = MCASP1_RBUF0_32BIT;' n% [* ]/ P: U% C3 G* ]
  return (AIC31_data.uint);: n; Y" m) H9 u0 E% w6 d: l' @
}
' G7 h. B9 p' |6 n. @( E6 R6 _! `

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




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