嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
  O5 g3 O; O9 J8 P; h9 rmain文件:
2 y: B, {/ f' [0 ~3 g1 w& cinterrupt void interrupt4(void)  
8 ?+ l& @( W. j: P, e( f3 {, a{; w/ J: ~3 A2 @6 o+ c
  Uint32 sample;
1 H; u# X! g6 z, z) h7 s1 G
4 `, {* k. B$ K2 f' Y( q  sample = input_sample(); // read L + R samples from ADC3 \& `3 X9 K7 {. T
  output_sample(sample);   // write L + R samples to DAC " u) p3 b- T/ W5 G0 f* b
  return;
9 O" Q2 |& [" f: {* e5 K$ O, y}3 Y$ \" m. p5 T* x  x+ [

) z9 m1 ~% q9 A; f' pint main( void )6 I7 n2 ~# ^7 i
{" ^9 T/ R1 ~/ }( w5 \# q* S  a- ^

( D4 A) M* q! t    /* Initialize BSL */
1 Y# ]% F2 F/ k6 U    EVMC6747_init( );
: X" d* J( w) C" k( X, A' l6 P        /* Call evmc6747_intr function */. n" b/ }- |8 b" `6 b1 j! e3 |
    aic3106_init( );
; y5 F& Y) `& t) X3 i9 L        while(1);: _& f4 U& w, C1 M, L) H
}
9 M8 s/ Q% W3 M
7 {/ e: s) i  }2 o+ E  Y
1 [& N6 U  d7 A5 s6 Faic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题. l& t! K* \, v3 X4 r
/* Initialize MCASP1 */
+ ]6 {& _2 N8 R+ A    mcasp = &MCASP_MODULE_1;; u  G  C% q( Z' a2 N
    mcasp->regs->GBLCTL  = 0;       // Reset
, t4 P) x. ]8 d. I9 l    mcasp->regs->RGBLCTL = 0;       // Reset RX  `$ I: a6 c+ }( |! L
    mcasp->regs->XGBLCTL = 0;       // Reset TX" N( h0 V! b- ?9 t; ]
    mcasp->regs->PWRDEMU = 1;       // Free-running
* o, y; M9 e3 i9 f( S* W   // configure McASP0 receive registers
% a4 L7 e; m3 t% X. j    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used9 B1 l/ e% q! L$ E% i; x( Y
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; G& F# P9 c$ Q- i, j& ]' `' F    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
) g0 l- k$ C. n  n7 h2 L  h9 z    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
6 f, s  r5 O1 M8 S+ \    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
& q# {- L' y* \4 E$ R# |    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
$ g: V4 T7 f5 d$ R  U# F; ^    mcasp->regs->RINTCTL    = 0x00000000; // Not used# L4 {% @& K5 u4 d& j
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: J6 @! \. Y$ ?
! \  N& A  e. D    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
2 |1 ?' U  c$ M  N& v+ p    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus5 D- M* {6 m& f# j  R
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
* B" c0 I5 F1 s/ b* x    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16  W- Z8 i7 t  K
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK$ q$ `# X* c2 d/ s% E4 E, r1 I
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
) t) }9 m4 c+ D- T3 I7 r    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit% X: b0 c- o9 O! r. _' R# p
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 G5 \8 T9 W5 l2 r3 X4 k
3 j  \+ I7 m& b    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN* |6 @6 ^+ \- a4 k
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
) Y: y; w9 Q& N" D0 O+ K% ~    mcasp->regs->PFUNC      = 0;          // All MCASPs/ b' m: U- ]5 |
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
) I; @6 _- x; b5 \
3 x8 \: I  O1 F8 ]2 V$ d    mcasp->regs->DITCTL     = 0x00000000; // Not used
: y% ?% i  l; S" k    mcasp->regs->DLBCTL     = 0x00000000; // Not used( K) z5 z/ I7 o' m) [$ R: ]5 |
    mcasp->regs->AMUTE      = 0x00000000; // Not used9 j, U( q; Y/ b5 O* d
) T, Y2 p+ z* c  Z
/* Starting sections of the McASP*/& A* ~% E& |6 U3 q# G' d+ P$ h, ]/ Z
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
% s* m% b3 m2 x    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  4 @  H8 ]8 p! m' }$ q
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ( J+ w7 Y1 S2 E1 t8 r: e
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
! r6 {6 \6 F% b! k0 B' m
8 L- {$ w4 n3 `2 q- b  i    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; : v! d- }" H" r* X
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );- o2 s, j' F1 h. E. B' G  |6 m
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
& F. x0 [3 @7 {) D( P8 o6 Y    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
8 u0 \1 i  u" k/ J6 ~3 m# Y+ V' l7 B! A' l9 }! z1 ~; F2 l
    mcasp->regs->XSTAT = 0x0000ffff; # |% D0 S$ I( v
    mcasp->regs->RSTAT = 0x0000ffff;
, h7 F3 p2 f2 C( D3 k
" {! E) y. e, g" o$ @    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;2 N9 W+ ~9 e! V6 @) r  W
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );) C  B8 D; d* l
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
( f; K) z: K* m    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );1 c- P. e! U, F* e: @6 S3 p

% \0 A# k7 W+ n: ~, T) }* g    /* Write a 0, so that no underrun occurs after releasing the state machine */4 y9 b( K' ~( W) I4 |
    mcasp->regs->XBUF5 = 0;/ i% q9 a/ T. e3 E
    mcasp->regs->RBUF0 = 0;
% x8 R2 o! C3 q3 Q# o- y3 N
9 Z1 _5 D2 [) ?' d5 W, W8 V    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; " x* Y: k7 F. x1 n9 x+ j, O+ u
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );! _8 n& ^$ i2 [( l. N6 ~
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; # P; g6 X; R( h# I3 D
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );7 E3 f/ [1 B0 Y# N' U
. h& K5 ?( u' e5 ]
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; , U$ F% u8 Q; O
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
1 x+ p0 B7 q% B! j3 Q) S    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 1 Q. `) C* O1 {3 g5 _! P0 p4 p
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
$ G1 n9 e7 ^, \7 F% \  R" S* i% t# U! \9 }' [7 h
    CSR = 0x0000;
$ H8 W3 g! [! \& Y6 W4 s    INTC_INTMUX1 = 0x3d;- E& s( r  z7 D8 t/ X  `
    ISTP = (unsigned int)vectors;
5 Z- N! V) s$ b# L8 L0 q    ICR = 0xFFF0;  4 P; I& k  X# q& u& `
    IER |= 0x12;  
/ `4 x4 U- R: R6 k    CSR |= 0x01;  - {9 r& |0 O) M# Q0 N  f' D* y

6 O$ j' W/ q" Y8 x5 i0 m7 \8 E
% i# {8 Y1 g1 P2 G: |, H4 ?7 ^8 D/ H: x
# c" X  y3 v' f还有就是两个输入输出函数:
* j; a! g9 k2 \* H6 {6 Hvoid output_sample(Int32 out_data)2 Q0 O  S1 b/ B4 [% P0 k+ l
{8 d) D- ~+ M$ A3 x% [( A
  AIC31_data.uint = out_data;  
; S; Z; p( s6 h2 a- u1 d  MCASP1_XBUF5_32BIT = AIC31_data.uint;
" g. ^( R2 A' R" W4 l}
- h  U# l2 ~; h) I) D2 E6 h, a% C: U
Int32 input_sample(void)
3 |, A: ]6 S5 |) {{  
1 e/ K3 T; U" {7 m  AIC31_data.uint = MCASP1_RBUF0_32BIT;
  i' C" j: D  p  return (AIC31_data.uint);
! d0 c& R4 P2 ~5 A6 R}4 ^- `& w( T0 n8 d9 w' u7 {' ~
5 p* ]/ X9 i9 N/ a: I7 K6 s  h- I

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




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