嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
' D. F2 Y- k8 \% z, P! o3 vmain文件:. S+ ~5 d, s: m4 B9 K9 k
interrupt void interrupt4(void)  $ s& u0 Z. ]+ X) [$ W4 h' R% p  M
{2 a8 W8 n  G" ]. o# w+ z5 Y
  Uint32 sample;
+ v* `) U$ I  ?- d8 b) j. X
* {0 n( T: T' A+ O- B0 `; B+ i  sample = input_sample(); // read L + R samples from ADC
1 z  X7 G1 n; m+ p6 v  output_sample(sample);   // write L + R samples to DAC
! `% R  f9 c& c* o) \  return;
2 z( F7 b/ H8 Z' ~& b# u8 x6 z, G}
* a  Z* z# X3 u: U& g! A- J7 Q8 `0 p8 ]  r! U& O
int main( void )
( i( [4 f! q* Q5 M3 s0 i{4 O2 X. d* [. X

* L& H$ |7 ^  |/ j; J" _2 x1 l* ]    /* Initialize BSL */3 Y' S/ ^# _3 z
    EVMC6747_init( );
, a) M/ K' s6 o8 r' s6 r        /* Call evmc6747_intr function */2 F5 L- j: g& O! L: q# {, Q# y1 P
    aic3106_init( );& b4 k0 o9 P( i" k' h" h
        while(1);& N& b/ G7 ]& h' m% P. T1 w  s# }
}
' o% }2 p! [; h  ~2 s; o) O
1 o; F8 i) G/ ~
' {7 Y4 P, @* {" U, Jaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
* i$ v  }% a2 u; j# u* I/* Initialize MCASP1 */9 z. _& F( t) r9 w  p8 L* U
    mcasp = &MCASP_MODULE_1;8 k7 P! f  |5 S7 m! o/ y
    mcasp->regs->GBLCTL  = 0;       // Reset* Q* ^9 D1 n) d: J# |" q! E& U
    mcasp->regs->RGBLCTL = 0;       // Reset RX
4 A* J3 _  _4 m/ J" M" T    mcasp->regs->XGBLCTL = 0;       // Reset TX
( H% n, y, k: G7 a9 o6 Q+ Z8 D    mcasp->regs->PWRDEMU = 1;       // Free-running
0 @$ R8 e. Z" k4 P& I4 }! A   // configure McASP0 receive registers
3 w8 \' ~+ A+ s* m0 P+ p& R  d* A0 S2 O3 q    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
# ?# Y3 i2 E2 I- Y5 R    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus6 |& c% Z% b. @2 i: p5 ]
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
% _9 J) O( q5 z- w. o2 w    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
9 m) U& ]" G+ e* i$ z# f    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
2 e% f7 h) T" O8 A    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
; G2 [! [5 Z. v) ~1 w4 \    mcasp->regs->RINTCTL    = 0x00000000; // Not used9 o, }* P# ^7 h' j9 n% z
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256# T( ?# M- Q6 q3 a, I- ?! L
/ |0 }" B4 M3 [5 t+ \
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
8 e. I2 f/ ]& `* |5 y    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus& }. r" H+ W- f( |- Q
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word$ r( W& x7 p2 m5 T1 @- V' f
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
5 Z% w: R; y% e    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
8 @( c! j6 I/ i0 I; r    mcasp->regs->XTDM       = 0x00000003; // Slots 0,15 @' ^- E9 W2 [9 S
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
, W* Z6 A# ~% v* x  E* [    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
' W2 _  u8 I4 h" v
* |  a$ a9 o9 l7 ], s0 i0 y' y    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
. C, T3 P1 f" L" ~/ ?    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT5 G. _' E/ u3 k' ?
    mcasp->regs->PFUNC      = 0;          // All MCASPs! L! D" s$ O' ~2 L8 j
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1* Y- @" B- l6 f4 c. j/ M! f# l
) ^  L" k5 e7 {% e4 q: a
    mcasp->regs->DITCTL     = 0x00000000; // Not used+ ?, K: m/ A. I2 E8 }4 d# s
    mcasp->regs->DLBCTL     = 0x00000000; // Not used' g' i1 m" [1 u
    mcasp->regs->AMUTE      = 0x00000000; // Not used- a# h- ~1 Y* L/ r: B
- A! j1 R% K) ?  h- @! a  V
/* Starting sections of the McASP*/
: i3 x) ~( L) s4 \    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; * `, \* j* d( s/ v
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
1 [7 M7 @: O. S# K. @" c! r    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; - w- I9 t! g* I# O+ k- |
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
/ J9 n. c4 M/ W  c; }* U0 \9 }; x: x% K
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
& H0 E* I: q  r    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
# |6 J$ Q* b! q( |    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; : Z+ k' {' j; B* l
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );4 g3 q7 T. r0 E/ z6 O6 }1 F# S
: V; p. {" T0 N% e5 {8 [* b
    mcasp->regs->XSTAT = 0x0000ffff;
9 F3 d8 Y; q" D. P( Y! O    mcasp->regs->RSTAT = 0x0000ffff; ) k- t* K! f' G+ Q
% R! p7 x5 h5 f3 \) Y
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;& B/ Q3 L* x- V
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );- ^# i+ S; r- j1 {) A
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
) K: V- Z+ m% {: h0 L: p( x    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
0 _# [' V: P: N6 Z, s1 u" h7 B" j5 j% O# @! S/ _" o( Z% D% y
    /* Write a 0, so that no underrun occurs after releasing the state machine */
0 d  ~% m% v- u( w- e    mcasp->regs->XBUF5 = 0;
% o0 \4 @  m# _7 y  ?) u6 E. ^+ J    mcasp->regs->RBUF0 = 0;
0 w) a! [; d* a0 J* Z9 k
5 a% y1 \% k- F8 K9 ?5 C    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
7 e: S1 s& A, ~    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );5 K, O' [1 F4 d% i4 e* W
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; , h4 s! V6 C3 r5 _: P( e' k3 x
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );3 _( _" p$ Q- q1 f; h, X

3 K% }; t' @6 d- R, o, j0 S    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; , y- B1 I, [. `( o3 x
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );( ^4 ?- y+ x  S& f
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 9 e. x: B7 r3 I( y$ u
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
2 A2 l9 T* u. x7 i
2 R9 C8 D' Y( N+ }    CSR = 0x0000;
8 m. _+ G. I  Z/ N# l    INTC_INTMUX1 = 0x3d;, p* V9 k/ M$ K( G3 q% e
    ISTP = (unsigned int)vectors;
5 s/ C2 ?7 ]: V) G, w% P    ICR = 0xFFF0;  
7 b3 ~$ R$ Z& y    IER |= 0x12;  
# X, ?) C$ P1 i* z$ \% G! S    CSR |= 0x01;  
( J7 O: T2 V- a, L2 K: T
) e; p! K# Y5 m" C6 c5 C
$ f! p8 a+ f. g2 \+ K" B7 N" u% L& L0 Q6 e* d( J* u* L& S4 P
还有就是两个输入输出函数:
) J; P* q% H' mvoid output_sample(Int32 out_data)
4 H3 O' R- q6 `$ o8 X0 t{
6 l: F* r+ o8 c3 @0 n9 y  AIC31_data.uint = out_data;  ; H, r& I' _% W* R! t$ E4 }7 c
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
/ O3 ?8 P- [: y0 e, R}  B. i* ?7 [# k. O

$ z# l9 Q9 A' N7 ?0 AInt32 input_sample(void)  T4 i2 @% v" N- M% K! ?3 a& F3 \
{  " e/ q6 m1 @. I2 ~" m0 x  N
  AIC31_data.uint = MCASP1_RBUF0_32BIT;3 U  ]) [" _+ L& G. l& Y7 J, {; k& j" G
  return (AIC31_data.uint);  A- c$ k" p1 r5 ^5 d4 L/ r
}; \7 \  E' e, Q

; D( H8 I% l( \& W6 ~4 t8 V( b' D! ?
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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