嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:2 d$ w6 c' T- h
main文件:, ]7 x$ H* [& \' x
interrupt void interrupt4(void)  
3 ^( a* c& |0 |7 \9 j5 C! k7 h{' P& M! y# U4 X7 |8 D. b1 L
  Uint32 sample;
/ F* \$ b7 N+ a. ]. u: I  N+ i% z4 f
& i1 A8 U  i! d! p& d4 K  sample = input_sample(); // read L + R samples from ADC, ^) Z1 @6 k8 x6 M: d7 }1 U/ _! F' o
  output_sample(sample);   // write L + R samples to DAC
9 ^. H) _7 A9 S8 g9 S/ M  return;
0 v3 o5 X& R% P1 b2 |5 r7 P; W}$ B6 x9 A9 G& e- X6 o  T* }
8 A9 H' }1 b" |
int main( void )
. p' m, k& J1 [3 c8 Q- p+ J{
& a: r9 D: T1 S9 ]/ y* b% ?7 P$ h" d" p1 o  h# ~4 }
    /* Initialize BSL */
- M, M! ^/ U7 O4 h2 F( o    EVMC6747_init( );* X. s+ \. r0 D. w5 n/ ~2 R% E
        /* Call evmc6747_intr function */
3 V. Z" @- a7 C; B    aic3106_init( );+ M. d# F6 Z+ @
        while(1);
0 x: w( K0 G& l7 N" C}
8 w0 V7 J" |, T  ]4 l2 H  U2 q
7 L6 w3 @; i! O9 g) V3 c# N
; z+ ]6 L& s; _5 M* Paic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
. Y) a2 J0 |; c4 M! b( A, T. r0 G/* Initialize MCASP1 */
3 {- Z, v: d3 s, i; W% p% Q, Z( ]    mcasp = &MCASP_MODULE_1;
# q5 h5 T# S1 A0 i/ v    mcasp->regs->GBLCTL  = 0;       // Reset
3 {. E6 [5 H2 s( ]$ [& i5 n1 h    mcasp->regs->RGBLCTL = 0;       // Reset RX& W! j$ n1 T( J7 O! {  |$ U( m
    mcasp->regs->XGBLCTL = 0;       // Reset TX0 @, c. N$ A% h" u- `' I' s) W" t; z
    mcasp->regs->PWRDEMU = 1;       // Free-running# R) R9 v/ f, H
   // configure McASP0 receive registers. a) w3 l1 w( ~$ i. E4 u
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
0 r5 z" u/ W' m- ]; b    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
' u* a' K- z; b2 B, _    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
) D% i% q( B5 q" k8 r! M1 E    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)/ {  t, k! w/ i
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)/ x" n( J4 |2 p: O1 O7 L
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,11 m; d1 E2 R) U
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
, s3 [# y5 d0 R. i    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256# Y2 {: \) v) T1 c6 }' y
( y  z  f7 d5 [: _2 t& \
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
! A9 Z1 I# t) i! H7 w    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus( H; ?9 Z$ m* d
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
' t; E. m1 r: {6 t& B# K% n    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
2 z6 Y! L4 C4 F& V+ F. s- l: O    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
% o  S; j( E# r/ n2 |8 a    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
6 y9 C. C+ _9 S. p    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
) V8 O* Y) Y9 K( {$ l    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
- {/ \! \! X' d( y) T3 B
, g3 d/ V1 C) `! ~0 A1 ?, Z    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN4 X. b& A- k" b5 A' e9 R9 o
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT/ X, d; i4 g7 M1 G
    mcasp->regs->PFUNC      = 0;          // All MCASPs3 y* z( h( K# j& B8 [$ q  v
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX14 H8 e! k, K, C/ q- G2 {! [! b
* {1 K. M9 C* O; D3 {
    mcasp->regs->DITCTL     = 0x00000000; // Not used
9 u( n9 a% C1 d# k6 g" }% b# q    mcasp->regs->DLBCTL     = 0x00000000; // Not used
  ]3 d: q4 y0 [4 x; f1 _: x    mcasp->regs->AMUTE      = 0x00000000; // Not used
/ @% U: ?6 j& l( S: v3 H5 G/ g5 n9 i6 I% S" e, z8 [; X  `5 f
/* Starting sections of the McASP*/6 p" D" T- T$ R2 \' F, o, G5 E0 M
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ' U6 j9 F- X5 Q* }
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
7 ~4 V- p. {9 J4 r/ p$ _5 I4 N    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
; C$ w$ I, w' j6 [; \' c    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );- ?0 n% \+ D1 L& E! N

& I, x  g5 E& E; L. X    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ( G9 O: }- t+ M' W, b5 U' e
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );+ {. G9 g  h  U
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
* D+ A- K8 x7 z/ j    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
$ ]9 i6 N( }5 t+ k) M: d# x. F% X$ k& v- j6 m. W  o( Z  O. S
    mcasp->regs->XSTAT = 0x0000ffff;
: e% a- F' ~# A- `6 t: B2 X    mcasp->regs->RSTAT = 0x0000ffff; 8 F- J7 A. ]2 D2 o5 ]

+ i% G. \6 f+ @  R; C1 m    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;2 X3 x! C1 x5 }$ b
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );  ~! b$ E$ o0 }( q" C: x
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; - ~( Y/ b8 q+ N1 A0 `3 Q: T
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );% v  O% n9 R* O) {( T# ^
1 r, I- M  |( M5 p9 {! Y3 l- D
    /* Write a 0, so that no underrun occurs after releasing the state machine */% G. W6 X7 M: F# z' j
    mcasp->regs->XBUF5 = 0;
% a: z5 T: i+ X    mcasp->regs->RBUF0 = 0;
) k( c# O9 H( Y/ Y, C/ X
# r* h9 E7 l" H8 b    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 8 P9 L) J0 {" A
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
# w2 F% {0 L# ]1 t    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
6 Q, \# E! s1 z# v* j    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
5 q1 L/ {9 \8 Q+ ]4 \* \' z; ~% T; C
% j% w( z3 l: Z- {" B    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 5 Y1 v" K3 b1 u  L1 y) R) |
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );  D, _& i  \+ L$ r# N8 n3 c# @3 g) d3 ~
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
" t; Q, ^/ k* m. l    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
& j2 O/ F" }* m$ {# v* Z7 `: v0 W& h. W+ ~9 A$ {' u
    CSR = 0x0000;
, }8 c: |  h  A2 I* f/ O6 h0 y    INTC_INTMUX1 = 0x3d;4 j5 Q5 {4 `5 }  @+ X, q
    ISTP = (unsigned int)vectors;
: g% d% B" C- c+ q" p    ICR = 0xFFF0;  
3 }: G) v* w2 f( E  c, e, \( o    IER |= 0x12;  2 o* C. C4 c$ j" M  d/ o5 X% b
    CSR |= 0x01;  ; E( R/ T6 M  |8 q: @' N
, q4 n) x) d5 g/ @/ Z

5 [/ C# R9 }8 U/ [$ ]3 n+ o/ t% E" d: {, o( Y  T! E: C  ?3 J
还有就是两个输入输出函数:, g8 v+ o3 Z$ _5 c. A' @* G! c
void output_sample(Int32 out_data), j: B8 W2 M$ G2 e' H/ o
{4 j) w4 i  Y& S9 Y$ g& `4 x
  AIC31_data.uint = out_data;  
# |3 ^# a/ w! B' B2 |  MCASP1_XBUF5_32BIT = AIC31_data.uint;2 Q3 F, W- Q9 f) U* W
}
! }/ V1 E# j) |; I5 Y. U, ^
! a( }5 h% Z$ Q" [- [' c6 CInt32 input_sample(void)( T- e1 B- ?. p
{  
1 @6 M8 [, z; M  AIC31_data.uint = MCASP1_RBUF0_32BIT;
0 R1 Z9 t8 Q, Q( d2 i  return (AIC31_data.uint);; S9 r. C5 m/ U8 z7 [% d7 b
}
  _" ^- y# r2 ^; K5 s$ ^# H
9 Q  }& o: C' l
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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