嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:1 N& G- R/ |9 f+ M: g
main文件:% o4 A* P, D) x1 `' }
interrupt void interrupt4(void)  
* P( l% F- N' y6 e* k{4 o' G* M9 u6 L
  Uint32 sample;2 m) F$ h) n) g5 n) v
$ M0 _& z+ |: z1 b9 ~, v1 n5 F
  sample = input_sample(); // read L + R samples from ADC
0 B; Q' D: v; I! x; w  output_sample(sample);   // write L + R samples to DAC
- y! y( _( ?0 e& D6 _  return;
* r& C/ g, g' o' @0 F7 @}! v3 L: ]+ n7 l0 m2 M7 b2 g
5 V4 t3 t2 n; [7 f# F. _6 C
int main( void )
" Z0 C/ k1 k; y5 y1 ^; T" e( ^{6 z# d2 i: B3 e; `1 T0 Y* Y
* D" j9 V( U+ W6 f; d# G
    /* Initialize BSL */
, h+ s( q6 \0 J; K& k- e) _    EVMC6747_init( );
( c8 J0 U( T# l9 m2 e* b& R        /* Call evmc6747_intr function */
. A2 D9 N; {' j6 h, g  I    aic3106_init( );1 t7 j. S3 Y( V' }! F3 B
        while(1);4 I8 {: k* ]/ S) m9 |  X) o
}
6 a) \% m2 F$ h3 ?: N$ S! Z' n2 d& H  K* H) W$ d, h/ j. {

: n  v' @9 ~/ U" J" Gaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
) O1 i- s4 ^0 }/* Initialize MCASP1 */" s2 R; L: ]. R, ^
    mcasp = &MCASP_MODULE_1;5 G, k) W$ p, u, X+ D
    mcasp->regs->GBLCTL  = 0;       // Reset
9 F* u( P7 r+ Q8 R" {0 M2 Q; L- f. _    mcasp->regs->RGBLCTL = 0;       // Reset RX
9 m6 z  l& h* h2 N8 Y    mcasp->regs->XGBLCTL = 0;       // Reset TX' k- p' R, x# U; @
    mcasp->regs->PWRDEMU = 1;       // Free-running4 g! Y/ j9 o% X, `3 Y6 C
   // configure McASP0 receive registers% U( o6 X' W" r
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
7 v! Q  Y( b( N# L    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus! T& U% c- k. L2 h4 g7 x1 {
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word# f* p( j. ^2 k
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
9 N6 I! x7 E* z) r7 s% J    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
; `6 ~- h$ I9 F/ z& T4 ?+ ^    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
6 t% o' `3 r! I* G+ Q    mcasp->regs->RINTCTL    = 0x00000000; // Not used
$ i/ \' g, ?$ r) f6 d    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256% o5 D* K$ S& t" S7 z5 \

  J$ m+ e' V0 ]7 ?* \1 F    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used& g- t2 _$ p# h  }4 |# c" M' P. [
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus" ~0 B  X" C1 U8 `
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
, P* p1 Z) `! y2 {$ k! p) A    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
; ]4 t- ]- Q7 k1 B* s    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK$ K/ d% A! j! j- a& V$ g
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,18 q7 |; D) g4 G: K; w9 G
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit0 g: Y3 B& b1 U) N/ I5 n+ U
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256. }) @1 E2 e) ?  ~9 Q# i7 J

/ W! a7 y8 s( N* W    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN+ F# C! @6 U# o& O3 }4 g
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
4 C8 Q1 b  E9 ^1 j* j  I7 n) B& @    mcasp->regs->PFUNC      = 0;          // All MCASPs) @% t$ [; J' e+ ~
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX16 m1 m4 n4 W# o8 C' K6 t7 o& I
$ D3 U; ]+ J" ~2 P, W! F
    mcasp->regs->DITCTL     = 0x00000000; // Not used$ j. t( ]2 l& q' |" d
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
% H& q8 z! p7 `# [7 K& L" u    mcasp->regs->AMUTE      = 0x00000000; // Not used
! N4 L! z4 i: n. I5 b( H8 x& d
% t- t. H( R& b! o) S; m9 w' h) n/* Starting sections of the McASP*/& X+ j) C$ I! g. g% p
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ' z% T( ~  r+ p- e8 n) P
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  7 i2 L: ]+ r% q7 I% @) b% l
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
+ x( ^5 ~  y  x) F. y* O    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );$ S& f2 O8 h/ n( }
, n& H8 l( F! Z0 X$ g2 B" o' O
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
6 f7 v# u3 F! ?, _    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );, y% ^: v. I- M5 N4 j. ]
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 7 l- c9 A4 h; ?; a" z
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );" e; \* L+ K- d0 A' B. [& b
7 V7 X  k9 K! h4 v9 e- X
    mcasp->regs->XSTAT = 0x0000ffff;
! V; [3 E7 J! ~$ G# w& V    mcasp->regs->RSTAT = 0x0000ffff; / {+ f9 i0 O$ R4 q/ @( e* D
( F8 d) W2 ]% K, n2 f$ Y
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;4 O  X& x/ x( X& O( G+ c
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );0 v$ [' v8 g# s" @  r2 u
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
3 `% ^$ J( l7 C5 z5 I" q) u    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
6 Q" n1 u7 \; g- ], X* C8 D7 ^! {8 Z
    /* Write a 0, so that no underrun occurs after releasing the state machine */  @( I8 z7 s* c" T
    mcasp->regs->XBUF5 = 0;
7 d6 j8 ^/ ?9 a$ C    mcasp->regs->RBUF0 = 0;
" a" l+ n( |* Z5 D+ j
- o. _/ v* q" ~0 s1 G0 V    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
; `4 j1 C6 C! h' z4 [; h    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );' n' ?" S9 I5 n& d; b+ Y
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;   `8 f5 ], L0 R2 M$ i
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
! U" ^: t- Q8 ]5 J2 m9 v' x& X
2 V1 W3 ?" `9 c    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
4 F7 r$ P$ c" [7 D/ a7 O    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
" p# \1 H* y- M5 @    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
1 U# Q: F  }0 B    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );7 e# s  ^! V# C, S, v9 E5 o

4 x% X! v- E1 T2 z! W    CSR = 0x0000;9 m; B, x  r. h/ }# K+ B
    INTC_INTMUX1 = 0x3d;8 F+ g/ F1 l( R4 |! ^) N3 P
    ISTP = (unsigned int)vectors;
; w% ?. K& d( Y. I+ i    ICR = 0xFFF0;  
9 a3 Y5 {, v" e" M$ n) U    IER |= 0x12;  
" I+ g+ e0 r* d/ J4 m* T    CSR |= 0x01;  $ ?$ ^3 O$ `6 e- Y5 a" ?7 _
) \0 N6 J+ m7 x, i8 O& H
6 B3 g1 C5 D% y0 v7 z, I; z  U/ P

4 g+ P% {( Q# N6 H. V还有就是两个输入输出函数:
; m0 j  H! a7 f1 J& `3 r. W2 [  }void output_sample(Int32 out_data)& D8 v) ^/ g. x
{
& [! X& {* v. I; P& K9 Y  AIC31_data.uint = out_data;  
' L! |+ d& R3 e1 M- h0 \. i- O8 f  MCASP1_XBUF5_32BIT = AIC31_data.uint;
* @- w: X9 L" f# D2 _* t}0 F9 X3 ^8 Q4 i, a# Y8 v

$ b) D6 j) l6 w& f5 p) x" o3 ^; rInt32 input_sample(void)1 H$ X) X7 Y9 M2 t& i# U& Y1 k
{  ' P3 w' T, f" z! }
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
3 d: h- o) z. x( y5 q  return (AIC31_data.uint);+ t( K6 f3 J# w" K; r6 W
}
9 F  x# z  V6 `4 x$ k+ L4 p. L" n4 Q2 z& O0 @; a& w

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




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