嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
% |/ [5 S! S5 v( ]9 J) D% Xmain文件:
' P) a3 i; v2 q* d7 b+ D! tinterrupt void interrupt4(void)  - C4 @6 z' {9 I3 P  Z$ D2 o) K8 ?
{2 p" F$ Z0 I4 T7 V  f
  Uint32 sample;$ N% Q6 T, U# N. {/ S8 P

8 q3 y: t2 ]$ E  sample = input_sample(); // read L + R samples from ADC9 O& Q- n1 r( F& O: b# }8 J* g
  output_sample(sample);   // write L + R samples to DAC ; v  @* \# R8 a$ F  @
  return;
/ H* J; Z0 N0 P* }8 T& G}
/ }. _8 t1 q" q2 ]$ _& c
% ^7 k5 q. S1 _. S) a/ H) vint main( void )
, b& Q% _" m: v+ P{
% r& D' V/ ]/ Y5 j; S, a, d! t' [* y5 \6 \( b
    /* Initialize BSL */. y0 Z: V# m( l2 f2 `" v5 p
    EVMC6747_init( );
* M3 r+ E: z7 |4 ?# y! a        /* Call evmc6747_intr function */* T/ x6 t1 o0 z% e/ S
    aic3106_init( );& n2 D7 Z: M1 I' o! [  {
        while(1);
- X2 f' g$ J1 v( G}
$ n1 E+ b* D8 l9 f; @/ |' y* A4 @# D2 p3 A/ o* H+ L0 s
- z9 ^* }8 v* [
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
6 ?$ N* @" T6 A; T5 _( Q/* Initialize MCASP1 */
3 v3 V$ b5 \: ]" }8 @    mcasp = &MCASP_MODULE_1;# i5 y# p: |" g! l6 K
    mcasp->regs->GBLCTL  = 0;       // Reset& \0 B6 O  ]$ V' V) K$ i* y
    mcasp->regs->RGBLCTL = 0;       // Reset RX
, y6 w0 {: t( N1 W8 V    mcasp->regs->XGBLCTL = 0;       // Reset TX. H; B6 o  B) R% i5 [
    mcasp->regs->PWRDEMU = 1;       // Free-running
0 o" D) Z# x" p7 A' Y   // configure McASP0 receive registers
  j1 G, x: p8 L% n6 g8 K/ K    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
- M6 z% d9 F' W8 k4 J- m) s7 c+ x    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus" G4 K1 V1 k( P
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
/ \" s* u* ?% z0 j! z+ n    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)/ |$ x1 j4 N% D  g
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)7 l' R4 F+ X# A- X% Q! u
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1" Q' W- _) O8 v& h" X. s1 @
    mcasp->regs->RINTCTL    = 0x00000000; // Not used3 C9 v6 I  C0 ~* ?8 W) a6 _( J& ]
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
( t8 Q5 M- c2 w  |- d3 t7 a) H& J# i, W$ a# p! ^
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
+ T- I. f3 ]+ \0 k$ U# ~9 Z    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; e+ ]5 C- \! P6 i% T, r( O; S. A6 U7 ^    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
2 Z; b/ I" R1 x8 }8 G    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
5 u  q6 s% F$ w    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
* k8 @" N. Z! V" Y$ A) S# ?    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
* A( C. I3 v$ n    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit( t$ n( W7 G6 K$ s4 |% D" Z1 m
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* x) A) @6 ?, |3 J4 P
3 ?9 T. \, L6 ^    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
" j4 K6 |3 ~4 v* P" N% A8 E  P    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
! u/ m6 G5 u" M/ Z: {- Q" Q: b- o    mcasp->regs->PFUNC      = 0;          // All MCASPs
8 ^. c+ k- e4 ?    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
0 v, I! d' T; [; _  k) ?) K) O- m* S, E9 ^- z! n
    mcasp->regs->DITCTL     = 0x00000000; // Not used
% w* \  Y) [8 r( m    mcasp->regs->DLBCTL     = 0x00000000; // Not used* S& y! d0 g7 ?% i
    mcasp->regs->AMUTE      = 0x00000000; // Not used
. w5 F. c( G0 x8 n7 a9 I
* s0 ]- g3 C7 [  a/ L( Z! z3 G/* Starting sections of the McASP*/' y0 o) G9 a9 X7 X2 z
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; . l( A4 z4 T# h* E4 |9 h
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
0 d3 R# m  d9 a$ a4 `% ~7 j- x    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
2 g: b9 S3 O; X3 U) m    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
# s# A% k& u' S% n( S! M
0 \2 a2 J8 T- l  I    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 5 N0 e" o' d/ {+ d8 q" y' W' o8 w% R
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
$ u7 B, A9 N; u5 J0 B- l* U  s6 r! K  v    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
3 Z: m* l8 [; ?$ p    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );2 `, }) l' ?& V( R

* @7 q8 G- ?4 l6 ]' h- n    mcasp->regs->XSTAT = 0x0000ffff; 4 N$ ^: ?( t9 X; N# r
    mcasp->regs->RSTAT = 0x0000ffff;
6 ], ~! _! V# ]/ G2 c) ~7 J0 b. E6 K+ M7 j, E
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;! h9 W7 S3 o! L$ v
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
7 _  M6 B% |" G# Y    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ( h7 J5 i9 E% {
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
; g* g! S! d7 u
$ u6 ]- X7 F6 k& ]! ~1 x$ K& N    /* Write a 0, so that no underrun occurs after releasing the state machine */; n" e, T" V1 n" O2 r
    mcasp->regs->XBUF5 = 0;+ R, T& z1 `8 n7 \, \% Z6 d4 g- f$ w3 R
    mcasp->regs->RBUF0 = 0;
% }, k" c! B7 Q8 U) X; G7 F7 p3 E7 i1 `  E# R0 F' C* R9 p& S' j
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; - y" U. ?& C/ A- M
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
- S+ i( ~* K8 ?2 A. Q  w( R! T    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
' d7 X: ]1 {% g0 D    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
2 D4 S  J- u: `: x6 ^% j! t$ {: B4 F2 J  m' O4 [$ l6 G% l6 J
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 5 Q& X. Z. g3 _; A6 ?0 E5 e  A) g9 J
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
1 V" H$ f/ e. X2 I    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
0 N$ n/ T6 V* m, J    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
# M5 d& P0 v; }2 o* F
: `, Y1 V  f2 A0 v' ~    CSR = 0x0000;0 S# o- K. P# c9 U" Q3 t5 q
    INTC_INTMUX1 = 0x3d;
5 Z  p4 i: H2 T    ISTP = (unsigned int)vectors;/ l$ B; X) G  D
    ICR = 0xFFF0;  " `4 e- J- w! K! F& Q5 ]* g
    IER |= 0x12;  
' v( f2 _2 X8 Q3 E    CSR |= 0x01;  
2 k6 z8 _2 `7 Z$ C( d% I' W7 q4 G5 Z+ b( e
& D1 ~' g- q* Q) ^+ c$ U% J

+ u2 d7 n- ~" I: k$ z还有就是两个输入输出函数:
; }; l; e9 a$ W& c  K; p" Tvoid output_sample(Int32 out_data)
- T( g; j/ g# D. g& S, ]{0 c, i! `+ ?+ O5 Y- S* Z
  AIC31_data.uint = out_data;  
; y. _: W8 R+ ?! z  MCASP1_XBUF5_32BIT = AIC31_data.uint;
# x3 U0 k  l8 v% |4 S}
7 i# N9 g- ^6 k. G3 q$ P0 }8 q
& q: M0 f' l! ~0 uInt32 input_sample(void)
/ W# ~5 F; v, K  Z4 t{  
: s  z, U2 f5 Y# a2 }  AIC31_data.uint = MCASP1_RBUF0_32BIT;. l) `" f8 a2 ?, W& I
  return (AIC31_data.uint);6 G/ T. v' v/ n
}
5 C% ]* n/ w- P9 ^( h, [+ c1 D( M, W' P4 w& b

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




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