嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:. k) z8 j; n' E  h% S
main文件:
9 c  c7 X# Y- \interrupt void interrupt4(void)  
! l' A% `! U! O9 D( p, q0 S{
$ z: \! K0 i& O4 M  Uint32 sample;
2 H! U" s: H) ]) I$ o4 f- R& ], f8 a4 q, k9 ~- |, b, M
  sample = input_sample(); // read L + R samples from ADC
5 G. e1 L" p' c( N, C3 M  S  output_sample(sample);   // write L + R samples to DAC 7 ^7 K8 b/ a, W, P7 q
  return;  W: n, P2 }% r9 m; f* D* J
}4 D  H- L/ R0 W: p" F* Q
0 `; y' o1 l; ^4 K0 b. {4 U/ t
int main( void )1 R/ Q: w) q% {& i( A
{; F( C+ p8 n( a4 W& v# h6 {) e
; ^# U$ ?  }+ P+ |
    /* Initialize BSL */, Y9 W2 \  x% l/ p4 I6 {
    EVMC6747_init( );  R2 ^7 W, w) \. }! m
        /* Call evmc6747_intr function */# v$ p8 P) q* \: g4 p
    aic3106_init( );4 j  y9 H- Q; o& L, g
        while(1);4 r, `* a9 L/ F( f& i! M
}2 }1 [8 j# h5 A0 E9 F2 L  N4 H
) {) r4 Z- q  ^0 s8 V& j# n  I

  E! i0 b* N: Maic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题' ?- V( e8 a6 L8 y2 m, C7 B2 `
/* Initialize MCASP1 */2 F2 T9 v# b* j- o' ^- l9 B: G$ f( a8 I
    mcasp = &MCASP_MODULE_1;2 s3 s2 m" j! _2 C: x. w$ T
    mcasp->regs->GBLCTL  = 0;       // Reset
: \# o$ Q' \# u/ T9 h    mcasp->regs->RGBLCTL = 0;       // Reset RX% Z  C1 O  e0 k3 ~8 }
    mcasp->regs->XGBLCTL = 0;       // Reset TX
7 c4 k- r# k( `3 u( u    mcasp->regs->PWRDEMU = 1;       // Free-running
) D, E) o! a9 \7 z. L( ^# N, K   // configure McASP0 receive registers
! \: Z0 C1 g' W' G( H7 z    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
' R- Z9 p" @& l    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
9 k9 @" S" C+ p7 ~/ J+ N# h$ F4 r* s    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word- }, a* I/ K4 u; u( U
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)/ B# W  J8 i/ @. y* O8 N; y
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
$ |; G$ O- y9 w% s    mcasp->regs->RTDM       = 0x00000003; // Slots 0,13 g0 [* y& j! M7 f2 A% p* G
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
6 }3 r3 P3 @( b    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 F% n$ o7 Y8 C" P/ ^/ m2 n$ E
) M) L/ @. J0 u" T/ G0 ~    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
% J. m5 J. k7 d. \! J    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus: \0 K0 Y7 ]+ z( l3 A. u( d  ?
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
* M5 z: \# N6 C+ a* h. h: v    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16# K4 H! g3 b! m: [1 o$ U
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
, Y( R9 y. k$ z6 b1 T8 f% {, @7 T    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1( T+ S0 s, H: I3 h
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
6 p2 B. l; k% L8 t; Y# e    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, a# S( @5 N1 L9 Y7 Y; S. M' l- R$ f" Q
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN9 U( f8 f( a  j1 X
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
6 E5 O2 N: f7 ?5 Q9 ^8 _4 H! B( H5 R    mcasp->regs->PFUNC      = 0;          // All MCASPs9 R, J9 o6 |6 U4 p
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1- P# A# M3 |% u; k0 N

* J: e6 f/ `0 Q    mcasp->regs->DITCTL     = 0x00000000; // Not used
5 S" v0 G8 l$ f- Y8 y. h0 W" [5 Y$ o    mcasp->regs->DLBCTL     = 0x00000000; // Not used9 r: h. W# ?$ l, N3 g  k3 C% m" j
    mcasp->regs->AMUTE      = 0x00000000; // Not used
$ e: `! a! q+ ^" R) H. m3 Q5 T: N3 Y* v# P, k$ q. c+ O# k3 \
/* Starting sections of the McASP*/
9 O/ c! X3 M' j0 x# t# P2 _    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; * D1 T* I5 v2 |5 {
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  7 e6 ]4 A2 w4 l* R2 O8 G
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; / y% Y! y( ?, h/ N8 T6 l
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
# ^3 i0 C7 w+ i! j# `
. y% v1 @! H0 h; T. r! H& Z, a; {    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
1 e! V/ N. Y. h0 B  r0 L5 o1 m    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
; l7 M( G. f4 m7 l/ @5 s! V    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 7 _* J8 B, i: J1 T) u  F
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
8 {' ^8 s9 ?$ y) `# ?' ^8 A& a# U0 B( ]
    mcasp->regs->XSTAT = 0x0000ffff;
6 ~$ |: ]% I* t! D2 _& ~    mcasp->regs->RSTAT = 0x0000ffff; ! j, t5 \  M* S9 l: C
5 e/ a1 ~' Z5 L3 p- w7 p( ~
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
! |, f- a. T! Q6 C2 ]- p" {% q    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
! Z; T) M: D% n    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; - s5 h' a6 m: T% b9 S
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );' o# T$ w) T& L- C* z8 h
0 g! v7 e+ }6 v8 S" {9 H
    /* Write a 0, so that no underrun occurs after releasing the state machine */
; s. H% h, \/ q  B* p  x    mcasp->regs->XBUF5 = 0;5 G% u3 x% q  g5 P4 j' f4 q
    mcasp->regs->RBUF0 = 0;1 D/ p3 `0 f' q3 e9 H: x2 z' {
( ~' D1 |/ S% {9 o/ K9 w8 l1 y: n( ~6 o+ }
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
1 W; ~' B; J+ m) T' o    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
$ X7 B) N) c5 Y7 {+ P) n, Q    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
+ B( u8 [, Y/ i1 O( f; w    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );% A9 G. ~1 Q/ e7 f6 u+ @
* G$ Y( T# R7 W- v% D
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 4 s5 m0 u$ l3 g+ t) f% Z$ J
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );) C9 G  u- O1 k; Q7 X8 O1 H7 y
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; : e7 @4 d" d0 V5 c* r9 P; e5 G' J
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
. j& T  J% ]4 g* P6 x1 t
. ], O6 q8 X: q$ X" u! J' ?    CSR = 0x0000;9 M! j0 K: m" e1 Z
    INTC_INTMUX1 = 0x3d;
+ D3 N2 E" X. X" [, K% [! |2 c( U) M    ISTP = (unsigned int)vectors;) W5 n) ?* ?" q; R" n) s& I
    ICR = 0xFFF0;  
3 _% e$ Z) t! h. o% a# E    IER |= 0x12;  
7 L; p& z, f( g4 @0 e) _    CSR |= 0x01;  0 e2 V! y6 k2 e  |( `
8 w* b. [. g" o/ h* `: ~* q

3 @4 F8 ?4 f' Z, j! ^) c1 V" [
$ ]2 I, P2 O3 i/ `还有就是两个输入输出函数:
) P: P0 g' f1 {7 P- G3 Hvoid output_sample(Int32 out_data)
4 E8 Z) v$ e* C0 f$ s{
* a3 t& I1 q/ i  AIC31_data.uint = out_data;  
7 E" B9 K! g+ U) k6 p* }  Z3 O  MCASP1_XBUF5_32BIT = AIC31_data.uint;# b& F- m' p  g( }& F( S
}4 G4 b; c% S* y' e8 y7 `( G! w

# G+ Y( r9 ]( M' ZInt32 input_sample(void), `3 y+ B! J1 @% O! H5 v* v, ~9 b
{  
! E/ [2 ?0 a& h4 z  AIC31_data.uint = MCASP1_RBUF0_32BIT;
. m. o: m1 t' k$ z' f) I  return (AIC31_data.uint);6 p1 Z7 B# n: Z( n7 ~
}9 s; O/ L+ _  |. ?& D
$ R1 t! ?0 Z. |! Z8 U

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




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