嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:2 P4 ~# f$ a$ y' E4 S0 w
main文件:
# p. n2 Z: e, z3 finterrupt void interrupt4(void)  ! a  E4 v0 `" J2 N1 e1 b+ [( G5 y
{' W2 _! z2 o& W8 }
  Uint32 sample;
& Q! l# \+ E( Z3 d' w9 F( j& S
& d: Z) ~& O5 w6 S" G6 a  sample = input_sample(); // read L + R samples from ADC" t" n5 H: A5 @) J/ K  R: z
  output_sample(sample);   // write L + R samples to DAC 8 r0 e  s# \+ R" X( g) c
  return;: W1 k- l) ]7 H0 _$ D: S; v6 P4 \% l
}. d( g/ Y: z$ k' ?
$ c% C6 s9 f3 k- S
int main( void )( i6 {/ z  a0 p% b4 y
{9 @' O/ U" f' s1 e( {3 E, @; ~/ H

2 w8 O. x3 c( V, }) C; K9 k1 v    /* Initialize BSL */7 o& K$ u3 X2 D4 t$ e# J
    EVMC6747_init( );% ?3 x5 x+ t1 }4 ~
        /* Call evmc6747_intr function */$ D! v  o: i5 J
    aic3106_init( );8 w4 q; l% [6 T9 O, n) n8 Z
        while(1);. s+ V3 W$ B" F7 P9 F
}
1 m0 w  ~3 z) X  z: t0 {' z% o* E" l9 K/ ~: U5 i5 P: V

# }8 j! F- |) F9 O+ O+ I% g! H% Haic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
' z4 t4 M, G& r6 S, Q/* Initialize MCASP1 */
/ q( q5 u8 A9 F$ x' R, C    mcasp = &MCASP_MODULE_1;
- N3 V- u( D) r% X    mcasp->regs->GBLCTL  = 0;       // Reset
) j0 K" `% g* h) g3 J  M; c# i3 O    mcasp->regs->RGBLCTL = 0;       // Reset RX
9 t% Y  h0 S& g. _; i9 m( F  z    mcasp->regs->XGBLCTL = 0;       // Reset TX- r! q! X% k+ }+ q- y
    mcasp->regs->PWRDEMU = 1;       // Free-running1 v' h  }; n; f0 }
   // configure McASP0 receive registers+ {. u- v1 Z. x3 e  l
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used; ?4 `9 e! E8 m  r
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus4 y1 o  [1 N. q  N1 `& p9 W
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
# L: P! ~6 z# S. U    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
2 X* j( T8 @; a; [$ c3 U! i    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)4 r' `  a8 ?% c- N( S
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,11 A7 l" [3 N4 v6 J! h0 ~) v9 e+ v9 ~' y* Y
    mcasp->regs->RINTCTL    = 0x00000000; // Not used( v; G+ ~& O- E1 c% A# e
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, z9 ~# W7 T% K9 ~( u$ M- d/ M2 u* e* X- w
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used; S2 D  t7 K3 T+ ]1 P& e# z
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% Z* @0 |9 [, h0 i    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word# F- f. J% r& G2 I. S% d
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16) ~, X$ p. V+ w+ e7 ~
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK7 N; R, O2 L* r$ i8 [4 S
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
9 {- D% G6 y+ ?    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit5 E3 u4 U- p0 x* \( k8 u. Q7 O
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: c' v3 L5 k8 y0 |+ U7 K
7 }0 P* A' N# F- g+ ^    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
7 S2 Q0 S8 u. U. j. z, V    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT: W, I* ?( {% b. J+ Q: ]
    mcasp->regs->PFUNC      = 0;          // All MCASPs1 j# o$ P. B7 t  w8 y
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1( C6 j1 ]9 T7 u% ?% ^" Z5 e

4 O$ Q& j! q6 M3 U. I5 b    mcasp->regs->DITCTL     = 0x00000000; // Not used4 P9 E, R/ Q( {/ f, T7 \
    mcasp->regs->DLBCTL     = 0x00000000; // Not used* X/ |& z: Y. o, P( b- T
    mcasp->regs->AMUTE      = 0x00000000; // Not used
0 V, H& q5 K" l( p) U5 X4 ^  @' w7 G2 k, l* l
/* Starting sections of the McASP*/
* [' C" N3 }' _: J! j" _) V    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; , V  Y# W  E  f# F! t0 H6 o
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  0 {( w, O; I! H4 Y# ~/ F2 Z
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
' s8 S( \$ U1 e6 f4 z0 f! X1 K/ f    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );2 ?7 u5 T4 N. @- L6 M
& d: o5 s( ^8 k6 h
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
* f! s& k" N* Y% Y. n; f/ o$ S    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );5 \4 k- L3 _  }  y. C) n7 ]8 L
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
# @9 B0 I9 B: U. _( V' x4 ^    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );- q8 E9 R* E5 E/ P" O% Q1 g" @5 Q
: [8 T* j, j/ f8 {
    mcasp->regs->XSTAT = 0x0000ffff; 6 G* l& w4 e' S# T, Q* n! t
    mcasp->regs->RSTAT = 0x0000ffff;
$ g7 H" Y2 ^) |# }) p; P1 h. S& o& o2 F8 \) \
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
/ Q8 o; M; c, {' E' q1 C    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );1 z7 v$ B1 k+ s1 F* h
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 5 U& r3 v' z* h6 F/ s; ?$ u, m
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );5 _: E5 x4 \7 _$ D; i

6 s3 f! j, ]$ f( Z    /* Write a 0, so that no underrun occurs after releasing the state machine */* K+ M! }) w" N
    mcasp->regs->XBUF5 = 0;2 _* v1 E, |8 X1 P' D/ {. I
    mcasp->regs->RBUF0 = 0;
+ @, L5 W! Z- |9 m4 b& u6 c- C# F5 y
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
1 u# ~  }, \0 ^, v, y# S    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );( Q6 B9 [6 e7 D% s! M
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
/ f- b* b: S0 J# t    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );" y9 S2 e; Y" ^$ {- \) c$ z
. x* C6 V1 [, }  U  j, k2 R
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; . k; y9 [# ]8 u# n
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );% t8 ~4 q2 {% p( T
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; * C$ ^6 z, [* r+ F' }. D- t; f+ u
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );$ H) h; x# M% ~

; N5 K: t7 h; r2 A) i5 A* y) I$ z* e+ O    CSR = 0x0000;
5 p; q0 h% ]" G8 ?7 R    INTC_INTMUX1 = 0x3d;
8 o6 w/ n% O* T2 H8 F    ISTP = (unsigned int)vectors;
0 z. f' _, Q  B# [" X: l0 {" L+ U    ICR = 0xFFF0;  
+ ?; x/ z6 O* ^& U1 M    IER |= 0x12;  
$ l8 h9 `4 C8 x; z    CSR |= 0x01;  
" \  P. i1 }9 Q+ t, p& G8 o. h& [! b$ M  ^- `

% O* ^- K+ k- {. N! ?& Q" s8 f& W3 m3 O% p
还有就是两个输入输出函数:% h# z! q" E" J1 W
void output_sample(Int32 out_data)$ Q% V: I1 Y8 C* M0 g% r: ?$ e7 z, Y
{9 j  S" I. ~' D1 W  T' ~( ?5 c  a
  AIC31_data.uint = out_data;  
% C( |+ ~( n+ E  MCASP1_XBUF5_32BIT = AIC31_data.uint;: O- ^) _: D# ^" t9 ?  T
}" Y- ]8 y* f2 Z% d9 c6 ?$ x. K# Z, K

' Y( O& F7 z5 ?7 c7 A' l7 H+ lInt32 input_sample(void)0 S# [! P# ]* ]$ _
{  
% b% E4 g: R' G$ x" t0 F  AIC31_data.uint = MCASP1_RBUF0_32BIT;
. p: z, I% h0 G, W  return (AIC31_data.uint);
% w. S/ \$ u8 f' V  \2 Q& h' T}
" ~4 g- ]  Y+ a5 X
/ L% |  Q. @7 G0 }/ D. g, p4 n
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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