嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
2 R7 S9 @- n) ^- p2 Nmain文件:4 i% f) U" O/ ~
interrupt void interrupt4(void)  9 y) f0 N$ }7 g$ C: a% b; e7 R
{
0 `: W% f) Z# S: ~  Uint32 sample;
' r+ t* n- k6 F) ~) B" c8 b* R) W- I# Y% I& E$ H2 H
  sample = input_sample(); // read L + R samples from ADC
# i, f8 J! C* W. h# @1 v  output_sample(sample);   // write L + R samples to DAC 6 X7 t/ j  b* h" [2 W
  return;2 N$ r5 g. E( J5 m
}
3 @3 g4 k8 ?  X4 H$ k* d+ H$ S+ W5 K, W; @
int main( void )
7 m% {" o; ^1 _# ?{' r7 h" l0 o8 H1 I9 r

( ^( M8 M5 ?, P% H* V. r    /* Initialize BSL */
$ @) L3 V- e- y3 W9 M5 y( `    EVMC6747_init( );
( W3 {/ A$ |5 ?, ]% P. A  h        /* Call evmc6747_intr function */
: @2 M( j! b) j6 |    aic3106_init( );. T7 g: m" A. K; ]2 M" {4 Z7 I
        while(1);
2 j0 L! F( K1 ~, A+ S5 b" M}' p; G& \# u- c0 q) [$ \- C

0 `9 Q1 x$ l: {3 y; N! N! N( v0 G$ C# b* i2 q6 w+ c, O
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题2 Z2 ^; ^. u, P' h0 M2 P' L: l
/* Initialize MCASP1 */  P2 |- b, G) j+ S
    mcasp = &MCASP_MODULE_1;
. j5 U" \) t5 V* `4 _# R" F: U    mcasp->regs->GBLCTL  = 0;       // Reset
4 ^" B( T2 W% Z2 O* t% X    mcasp->regs->RGBLCTL = 0;       // Reset RX
3 i$ d. u& P7 d( ?# j    mcasp->regs->XGBLCTL = 0;       // Reset TX; |( q* x7 O0 j  ?1 h3 y2 C- c
    mcasp->regs->PWRDEMU = 1;       // Free-running
" H5 d7 D1 a' t7 s6 P' x6 {   // configure McASP0 receive registers
- I8 K# E/ k0 Z3 o) [    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used) f; S* q9 O  t0 e+ j3 `
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. v$ R7 \* q+ v% q& |' |/ m* E$ f% t    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word) m  W0 a$ j4 z' T* x/ J* a. }
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)2 i" x9 s4 ~& L  y
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
6 m4 j: a7 s& }  @' l, d. k    mcasp->regs->RTDM       = 0x00000003; // Slots 0,14 H, [, y9 i( h3 Y' r# g
    mcasp->regs->RINTCTL    = 0x00000000; // Not used$ N' C! Y2 o( |1 g
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2561 f! X6 [- }& ~  J% N7 [# I' w
& T, o- n& J' t+ z& Z
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
& @8 P( F/ o5 @4 ?2 N+ G* r% _! V! ^    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
  H  {6 k4 [5 y9 t# T0 ^! C  G    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
9 t- l7 a1 G4 z) p7 f' ~/ f0 @    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
7 ]3 [, C  j% r$ v& g& i: d    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK- h0 ^, A7 x  L, Q  ^
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1$ t) U* X) R1 W) X& P
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
9 T" W0 ]! V" s$ S: A    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! ?# F8 d3 ~. N) m, u% ~' \% c
2 U2 ~% G( N2 x    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN/ Q! Y6 B; V$ [/ o* M2 w8 f
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT4 g/ d; [  i: f. z! N6 \9 F: A
    mcasp->regs->PFUNC      = 0;          // All MCASPs
# o1 h. k; ]6 U9 s/ _0 e    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
6 R: Z  _* q3 y, r$ D% b+ Y3 e8 U5 C2 D* r
    mcasp->regs->DITCTL     = 0x00000000; // Not used
- ^, b  Q* N" m- H5 F  n    mcasp->regs->DLBCTL     = 0x00000000; // Not used
3 q6 Y( A1 _, M) [5 K6 A    mcasp->regs->AMUTE      = 0x00000000; // Not used) Y* _& S6 {6 ~* s2 Q4 @
% K" [: z6 ^: g0 F7 T) Y
/* Starting sections of the McASP*/  d5 U) a, b7 d* [
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 7 l5 b/ x  }: I% B2 |2 l
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
5 h: I1 U, _- v: Q  I    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
! X' v/ |( j1 ]    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );4 Z0 i: K& W& D
; ~9 g  ?9 x. I; G& j
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
( H0 \% c, ^4 B* }    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );  J) B, O# d- n  Z7 @
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 3 ]6 n4 d. X1 p9 w1 B6 L- q3 a
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );% l7 W, X. [- ^! q0 _8 [! }, W) S: K

6 H9 J4 v$ ~$ A    mcasp->regs->XSTAT = 0x0000ffff;
) z& ^& j) Y9 l! W    mcasp->regs->RSTAT = 0x0000ffff; 2 `. ^: T# E5 g9 B6 n& \/ ]9 S
+ _8 m% B3 D0 g
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
; l3 G* b3 w7 r  O    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );; z* Y7 ]5 t- g+ O
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 1 F# \' A: ]8 Q/ O6 F3 V$ U$ }( q  C8 B
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );* \) _6 r. D  |% ?3 ^: r/ K

* g. M; a8 c$ L6 d    /* Write a 0, so that no underrun occurs after releasing the state machine */5 G, T9 v- J7 c$ i0 R- r/ J
    mcasp->regs->XBUF5 = 0;) Z1 k/ S6 J* Y2 ~4 H5 R
    mcasp->regs->RBUF0 = 0;2 t* H: W% G/ e
9 {6 Y# g$ C* q; ]
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
" G8 V1 O4 Y+ Z6 Q5 k6 {+ F8 z+ _  J    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );- I2 U- h5 J3 [. y4 ?% u
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; & E0 c7 l; K4 E& i
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );# R% \6 W# N& e, Y

% v. C* ?7 W: z" c0 X    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 2 a- M$ f0 w- v, G( z$ b. W" `. R
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
# Z, l: G# L* f5 v+ l/ T+ f    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 9 {4 m$ `# m: I! h# U, {
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
! r6 W  w- J0 w8 e, j* k' Y- o* x( K$ D6 @, G8 N& b2 a1 z: R) S
    CSR = 0x0000;0 P6 j+ z9 {/ N# y5 Q8 ~
    INTC_INTMUX1 = 0x3d;: }7 D2 k% @% K8 n
    ISTP = (unsigned int)vectors;6 T/ ]5 i" }- s. ~: X# D
    ICR = 0xFFF0;  . ?8 M0 Q; O. c; s# d) Q
    IER |= 0x12;  
" i) ^' P. d2 R+ U& k: h2 O- r    CSR |= 0x01;  
7 D* b  H4 k; e) G- L0 W$ M+ B
( m5 R& ]* F$ b& c0 I" s) Q* e
' W! ?2 u; `8 D( N$ j; A# x6 p3 X1 F* x+ [9 [: n
还有就是两个输入输出函数:/ z3 ]# U( H3 X4 w- ?
void output_sample(Int32 out_data)) o3 F0 `9 L8 A* f
{
3 [! ]( M; F# B: Q- i  AIC31_data.uint = out_data;  
4 a; X1 c3 Y2 Q6 B0 m8 N  MCASP1_XBUF5_32BIT = AIC31_data.uint;- |" |& {, @7 \1 ?3 m; U1 ^+ u6 g( W- U
}, B( U; _2 @, G1 C% ^

: b2 [& e( `+ TInt32 input_sample(void)
) m  l8 }: u' R7 ~! _+ [7 x& Z$ Y{  
8 c- X  N) W3 a) X  AIC31_data.uint = MCASP1_RBUF0_32BIT;
  S' R" [) P/ N2 A; ~; z: W7 x3 ^  return (AIC31_data.uint);" e1 L1 }' r: W; O* D2 ^5 }- g/ S
}! Q& {; k3 r2 ~6 Q2 ^
7 I, U; D4 a' _

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




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