嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:+ M0 @# Z5 K+ i; n; ^
main文件:7 z/ R8 F1 J0 D: ]/ E( E% b& C
interrupt void interrupt4(void)  . t9 I4 a# \5 X/ i
{
, f! P1 y4 j/ n0 J  Uint32 sample;
8 |) e7 _! v% L. [0 D3 s! n) Y/ f6 R
  sample = input_sample(); // read L + R samples from ADC9 f0 u7 o# C" o/ c# g0 @" _" \
  output_sample(sample);   // write L + R samples to DAC & T# J3 O5 f* _6 J: k9 y0 M: y3 I
  return;
: y) G* ~3 ]' B4 H0 z" Z  K8 e}
4 o# j3 c  z+ ^% v4 k4 V. ?. {! Y8 O
int main( void )
# |# r0 e1 m1 z: L% j' V# V{7 Q" `9 U" O2 R/ v. a
/ h) L4 _+ i, ~/ F; r6 a# Y
    /* Initialize BSL */7 D0 ~' M4 N$ a4 u% W9 h
    EVMC6747_init( );
) x$ t; Y4 f( g5 ~" G* p* Y        /* Call evmc6747_intr function */
* i7 W4 e: m, _1 r" `    aic3106_init( );; o/ L5 y5 x8 w) E
        while(1);
. G+ _( D% V2 j1 ^/ b1 ]$ Y$ i) R}9 Y" e4 ?2 m6 r9 W' A* L' ?
7 A) D) W( i( A- l4 C' i

& ]% u5 U' {3 x' R6 S9 Maic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
& q3 R8 A& T! S+ S5 a( y/* Initialize MCASP1 */5 c4 W# M" ^' M1 b. k
    mcasp = &MCASP_MODULE_1;0 e1 c9 L$ q4 p" t
    mcasp->regs->GBLCTL  = 0;       // Reset
7 l! w: q3 q: C    mcasp->regs->RGBLCTL = 0;       // Reset RX
& a- I* c" d7 w+ l/ u& z. V    mcasp->regs->XGBLCTL = 0;       // Reset TX
. U7 Q& n! d. z" E    mcasp->regs->PWRDEMU = 1;       // Free-running
* B# W" j1 g+ U* D6 {: t6 c8 O4 `   // configure McASP0 receive registers. b" `% E0 R( P$ ^- R' v
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
) T: n% T5 e4 S( c. N! {    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus% Q0 K4 w+ c+ F3 W  \7 o: u  N
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
9 i; H  f5 I$ p7 P    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)& R1 S6 Q% y$ x& m
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
+ h8 x& D3 R) S# {    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
/ B2 c9 J( l1 c! |2 r  |' q    mcasp->regs->RINTCTL    = 0x00000000; // Not used- r' Y6 a" l  p1 ~7 J
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2566 S9 Y  u3 Z0 }' Q6 x2 T
! f" j: J- \; Z& `& ?- g: O9 I4 p
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used1 ~) z7 M3 c2 Z. K( Q* F
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus8 ^' r7 J0 M' B/ `( F( ]. H
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
# N5 J2 V: v1 m/ n$ ^9 C    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
  Q2 k. R) l; J7 x. ~6 S    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
1 J* v/ D3 Y* q2 `3 q, j    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
7 k4 ~$ n* \1 |; C9 h    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit- T% Z' K4 b, x9 b" L9 _2 ?3 U
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 o- \( {! h2 e8 J. V
8 K4 l( q: M3 T- K    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
5 G% b" w8 Z+ h' {8 N    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT' O! t5 D" E+ J. A/ t
    mcasp->regs->PFUNC      = 0;          // All MCASPs* ]0 O6 O) S- ]
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
9 F6 u) G6 O# g6 Y  X) y' W, E& j: E7 k; q4 O
    mcasp->regs->DITCTL     = 0x00000000; // Not used/ \" W7 K, ^3 l; g0 P, Z
    mcasp->regs->DLBCTL     = 0x00000000; // Not used' f% Q- y" w  c9 A4 y
    mcasp->regs->AMUTE      = 0x00000000; // Not used
# H* j* ^) v/ M3 g' I. ~+ y
; s& r+ W- A. X5 I1 a2 ~/* Starting sections of the McASP*/
& Z! ?0 @& `: f$ p$ Y: f    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
' l: R) D: c9 v  \& u( g  D6 k    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  % ^; k$ m8 E8 E6 Y  [0 h2 L% ?
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;   O2 C/ u& z( [0 q' j9 ^
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
+ k( Q0 K' s# K: c1 Y3 c! j
# Z7 o9 O& I; D4 u5 N* @    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 6 X# V! I6 H5 X- p
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );6 V. d4 @1 @6 q) `+ w' Z
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
* E5 ]7 Z% x8 p: A8 o$ _    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );9 k0 u7 S4 |4 [

7 F" l1 ~* o0 K! H6 V7 z$ _: u    mcasp->regs->XSTAT = 0x0000ffff; 5 S) W+ J' T; k: k( x* T- X9 @+ u$ l
    mcasp->regs->RSTAT = 0x0000ffff; 4 O9 W/ }* r3 k
6 T( i( o9 W0 J/ z
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
4 g8 @0 @, p9 f% F8 Q" E4 J    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );5 d7 W1 w1 L) W; U5 ]. r
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
  X% p; Y/ c. B. h    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );' u( I3 e. E) x& _+ ]  v

: a! S9 Z4 _" T. y( I, ^' X5 I6 f    /* Write a 0, so that no underrun occurs after releasing the state machine */
4 j; G: B: n4 t! v) ~. Y7 j  z( k    mcasp->regs->XBUF5 = 0;' @7 r. m: |: m8 ?7 j6 \! i2 F
    mcasp->regs->RBUF0 = 0;4 J, j$ b  m! R
: B5 [( y: t. G
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
  _5 u( b1 M$ g4 b& c4 @* _    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
4 m) r- |8 C3 W& D) W& |# T    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 6 x* @8 v, Y( ]8 n' U! h
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );: {3 H- `$ ^2 @+ }0 y  Q

8 V% A% \) k% a% ]    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ; z* d2 O6 V, C4 q4 }
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
5 O% ]; i7 |. H' w& T% W. D: |# t    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; + ~4 p( N; i+ T& l, ~# C8 Z9 H
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
% P6 h6 b, O+ d9 x! L; q5 E
. |+ Y/ V" B$ o' |. v$ m6 d6 U6 h1 k    CSR = 0x0000;
% Y) v3 A7 N9 L2 S4 G! S    INTC_INTMUX1 = 0x3d;
$ j( l* _0 ^) N, i0 X% T    ISTP = (unsigned int)vectors;# j) u  @; v; K' Y6 q
    ICR = 0xFFF0;  9 w: c! J- S$ G1 F7 y4 [6 x
    IER |= 0x12;  
  A3 c! H; T6 |/ V0 y. _    CSR |= 0x01;  
4 ]/ d- ]" `4 b' d3 y' B: @! h0 Q* V8 F, {5 ~- E' {0 s0 K
4 A, O* b0 J5 f# R+ p

4 {& w  t2 P8 {# O( e还有就是两个输入输出函数:
) @5 e: N. [+ b7 J$ m# A, Q$ O0 Wvoid output_sample(Int32 out_data)
: r$ B6 K! M' t9 H( }% t{
& |2 y* @+ A9 G4 p" q4 {% H" r  AIC31_data.uint = out_data;  $ R8 Z8 [; M; f+ l' ?: B
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
: q, S+ G, k' p/ m7 E9 S}
. ~# v! O4 p0 u% N; u6 ?& Y
4 e* n" A/ L, l8 OInt32 input_sample(void)
" F# o  Y. V3 O0 k{  ( \4 F9 V0 A% [( K
  AIC31_data.uint = MCASP1_RBUF0_32BIT;: D( D' C+ ^- h* k% U" Z6 ^- W7 T
  return (AIC31_data.uint);
. H) u2 x0 e5 q}
( e! V3 n- m6 }* P
  U8 O& ^  y* b- Z; F8 _4 m
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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