嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:4 z- W7 X3 {+ O1 @8 F# g* P
main文件:
  h7 p( U2 W' \+ J" Xinterrupt void interrupt4(void)  8 |6 O* o' F  l  J
{
5 l, s3 V, v  E9 K  Uint32 sample;; W6 R' z/ L6 F" h# o- Z
8 ~; c9 |% B8 j3 M9 m5 L
  sample = input_sample(); // read L + R samples from ADC+ g8 ~7 O# h* g) r/ _
  output_sample(sample);   // write L + R samples to DAC - [; A7 G) D+ M3 e/ p9 S
  return;& g5 K9 t" @- }7 K' }$ M- C7 t& N! Z2 g
}
3 H/ B1 I  _! U2 C. A9 ?& r" _( e9 k
int main( void )
3 {( y8 F* B& |$ ]! K" A  B{
3 L+ ]9 J9 ]3 k7 |, i$ N/ n6 u  d- F  g6 l, x
    /* Initialize BSL */
0 n) j- P8 o, t9 F8 b9 e- T2 a1 T0 s$ b    EVMC6747_init( );* k, Z. x) q& X( Q4 A0 `# O( D
        /* Call evmc6747_intr function */' A; Y( W  K2 i8 \
    aic3106_init( );1 X8 p/ W, H/ Y7 v* c
        while(1);
9 c  s" Z% r+ S}2 S& V1 Z! a) o8 n2 V2 h! K" S; Q
2 `2 S& W2 ^* d+ b

$ X' ]) ]# k" ~; M" g$ n8 h, Q0 U: \aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
6 y; c( A- @9 S. r/* Initialize MCASP1 */
( D+ m! L0 Z& U    mcasp = &MCASP_MODULE_1;# m8 ^6 o3 r+ D( B: t" {' d: K2 S% J
    mcasp->regs->GBLCTL  = 0;       // Reset
: }2 F7 }% `- I9 j3 K/ G! ~    mcasp->regs->RGBLCTL = 0;       // Reset RX& I. `. c% A$ g
    mcasp->regs->XGBLCTL = 0;       // Reset TX9 Y% B, f' c. \- N! B
    mcasp->regs->PWRDEMU = 1;       // Free-running
7 P  \+ U+ B% b6 y* R   // configure McASP0 receive registers3 m/ h- C+ c2 r4 I! ?
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used% M2 B7 b1 O5 w
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 Y8 ^# \7 S: P5 a: S9 {6 j, F. G( H    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word) o7 \0 ^  y6 a( N6 l( X0 e1 R9 a
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
$ i2 K* T# l. _5 ]3 l# L" `5 s9 m    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
' V* V! W: W$ c9 F  I5 _    mcasp->regs->RTDM       = 0x00000003; // Slots 0,17 H$ Y" v8 I. J
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
" U7 l- A7 \# T  {/ D! W    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256! Y" {& ^. j' c% U, G$ _

5 d9 q' a, n6 I; E# x1 ~    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used4 C2 r) y) U1 Z. o$ B. ^/ i7 P
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus, U+ _0 R7 i2 f" r/ N
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word1 y8 @2 I* a5 [$ b5 Z6 W; l; g
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-160 Q# c# b- }- N% n. R
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
2 `5 D- h! a; _' g    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
5 Z' _8 e1 r; o( w5 m  Q    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
! q( Z5 U  _. N3 J# s    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* B; ^  v- L* b# b( L6 b0 M# X2 x8 P- n# r- v4 W  V3 ~
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN* c4 D+ Q& ]. Z% `4 e0 e+ f% d
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT5 i$ S' E( y; @+ H: y
    mcasp->regs->PFUNC      = 0;          // All MCASPs
9 `1 q1 X0 }  B3 Q7 O    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
* e) N9 F6 b" Z; p9 [
3 N" ^9 e1 F" |" M! @! j    mcasp->regs->DITCTL     = 0x00000000; // Not used* P! V3 B; [5 T, Y2 X/ }( j* y
    mcasp->regs->DLBCTL     = 0x00000000; // Not used5 \9 k, X1 p4 p5 F" w. J, W# W3 W
    mcasp->regs->AMUTE      = 0x00000000; // Not used
! [, F: {5 D4 J& r, h
$ o8 R; x+ T7 a- e! b, [/* Starting sections of the McASP*/
: l- l' \) t$ s* i+ Z    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; $ I& L' v: _! i9 v- f
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  / I; Q% a4 M1 s0 T$ q" G* K
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 3 C7 N( A* k/ B) D- w, h/ H
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );$ ~: c) X4 u$ {# p
" B% \2 U/ _3 i  K% H, r0 g
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 7 Y( V# D* M, @# W; g
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );+ y: W3 S+ u9 \+ d6 H, C
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; " E6 t$ Z8 e# h5 s0 Q
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
' X2 y2 l: {) R, o( l5 n9 P4 c
9 G5 Z; N# W$ N! K    mcasp->regs->XSTAT = 0x0000ffff; 4 ^/ s% H+ E4 M6 R$ k4 p
    mcasp->regs->RSTAT = 0x0000ffff;
4 E6 e  \; i+ H
& r) w; z$ a4 s4 h    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
4 _- W$ F; z9 u% n, E2 k    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );$ z% r" E1 s8 ]% P% _3 u% I
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
$ g& K; A# I& X# }, ]4 L    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );9 \& a  r3 e+ b8 M8 P
' k5 B/ y/ B0 |. |+ {$ [
    /* Write a 0, so that no underrun occurs after releasing the state machine */
9 X. h; Y! ^1 b. @    mcasp->regs->XBUF5 = 0;
  e, P2 ~" e" K5 d4 r0 w    mcasp->regs->RBUF0 = 0;
/ w% }" v# O+ H/ h( N  L3 p0 `# v
! g: U4 Y6 u2 a* c    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
, H$ [7 E! Q" M) L# n$ v. B6 u    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
2 r# g' P( @: G: s    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; # _) ?( ?7 b+ R# z
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
* ~$ q" E7 J# o# }# A0 T' B9 x, K6 Q( |, h1 h
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
# I0 D1 D; l3 T: b7 r    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
3 T$ S7 ?) H6 X+ ]: O/ p- |) `    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 2 t2 p8 @) L. E( Z8 q& M( T3 e
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );. x/ L( Z0 O8 W6 r
9 |2 ^; t, R* e( l9 U7 m9 h
    CSR = 0x0000;
- ^% ~: b, l* c0 \    INTC_INTMUX1 = 0x3d;
' Z. G% \3 i( g; l* n    ISTP = (unsigned int)vectors;
8 W) w9 |9 v9 [1 L) E% f) f: o0 h    ICR = 0xFFF0;  + q& R0 c2 L9 C' `3 T% f
    IER |= 0x12;  
- Z6 @/ c; L2 K, A' U    CSR |= 0x01;  
4 j1 G  a/ w2 w7 D. t, @$ E
  ~9 T' a8 ?# r8 f3 d2 S& `; a! _  `' h7 m1 a0 M# Q/ A! n
/ g; p* Q; }  f2 O4 K8 g# \
还有就是两个输入输出函数:
( z" a) I. H( W$ b% d7 z/ Gvoid output_sample(Int32 out_data)
6 e5 V% z  H, m9 d5 e{1 G) U1 v9 o  w* U/ R" V$ m1 w
  AIC31_data.uint = out_data;  
  h. z9 N& B% x6 W& ?8 t0 C  MCASP1_XBUF5_32BIT = AIC31_data.uint;
& ^2 q6 E, K! R& z1 ]9 v6 s# [}
2 d: \+ ~- j' A# |2 j7 \  `: ^6 `+ o9 B% d: ~
Int32 input_sample(void)
1 _6 f- c+ ]# f3 G/ H' Q{  ! _0 ]7 P! x- |7 o2 `
  AIC31_data.uint = MCASP1_RBUF0_32BIT;. l; ?3 m" G; @* V# i4 d' v
  return (AIC31_data.uint);
7 @1 \, Z7 D+ X  T" F7 m}
+ q( R6 h' [; O% O$ T! |9 ^7 y
4 @% F: f/ L1 [: M3 S* y9 g- c
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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