嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:4 S! e0 _- v4 y* [
main文件:" A2 @1 l% f7 k+ n' x' c: \
interrupt void interrupt4(void)  % e! I4 l( Z: a; ?
{) \7 ?0 z3 b4 Y4 S6 }# L
  Uint32 sample;
. ]% \" m# l8 I/ g. j6 K
, A+ Y# Y: }3 Q: v, D& c! }& ^  sample = input_sample(); // read L + R samples from ADC
3 B/ U7 t0 S. f* I2 M0 l* L2 q  output_sample(sample);   // write L + R samples to DAC 8 e7 J) c9 T. E6 j4 v
  return;
) h/ _9 T0 W; q/ A" _/ h8 r3 k' @}
9 P3 k# }% W, E8 W4 V5 \8 W) K+ Z; N
int main( void ): ]; t2 E% A, e, t, C
{
9 I" F- {1 z, @. o
% P& l; A7 G- y; _! ^- \; d1 G" c8 E    /* Initialize BSL */
- N9 {4 u0 F# Z- ?; x, X    EVMC6747_init( );
/ L, q1 b' x) Z        /* Call evmc6747_intr function */
( e; A, K) p- w, \    aic3106_init( );1 w5 S" N" |, u  _
        while(1);$ m5 B, d# q' F2 H) A
}# {! b% Q  X" O# h! f8 [2 J5 q

6 a- c. v1 j# y1 Q, R- h& {4 r6 D8 }% {# e
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
7 `5 P2 G" c& N4 Z$ T3 n6 K/* Initialize MCASP1 */
, l9 U5 B$ n1 f9 [, i. A2 `- r    mcasp = &MCASP_MODULE_1;( o* S, T0 a3 ]) j5 v& V, w6 N! \
    mcasp->regs->GBLCTL  = 0;       // Reset
8 q3 n9 i7 i$ k7 ?( i1 i' U# R' h    mcasp->regs->RGBLCTL = 0;       // Reset RX% V: J5 p7 }+ H! b3 A5 R% ?
    mcasp->regs->XGBLCTL = 0;       // Reset TX
. T: w- @9 t7 Z3 S    mcasp->regs->PWRDEMU = 1;       // Free-running
5 i" h$ X, V1 S/ s- V   // configure McASP0 receive registers
1 k. A; ~3 n9 G+ j; j* j2 |7 X    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used$ r/ P6 U3 h& a4 K2 i
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus5 J: d8 c3 H7 a& T$ h
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word/ G. S4 |$ W- i' f9 v" S
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)2 \, C4 F) I+ R2 w
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
" ]5 s4 e4 n6 J7 J( E1 [$ a    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
( L$ S- O3 ^4 P5 J) U    mcasp->regs->RINTCTL    = 0x00000000; // Not used
  r  W1 D8 Q' t  @    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
( |! p( g, `( U$ ^
2 h/ o! N& M; l  y* q8 @8 }    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
3 @3 \6 _" C2 \7 g' m& R. N6 ]3 e& B    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 K) b  L+ j/ X* b: O' X    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
" h- g9 p/ l' o; r! I    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-168 d0 ]& C& V+ v9 |  J
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
/ @6 B3 m  s9 s8 z1 q# d    mcasp->regs->XTDM       = 0x00000003; // Slots 0,17 R  X3 [& }0 `1 {% k
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit* H) J1 M( W  `9 t, L6 k
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ a+ z+ S, W& y$ g! h* B1 e: I' B* n. u! ]
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
1 b( {5 ]% f* d' a6 ^' T" ]    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
2 n! u( M8 w' u0 J    mcasp->regs->PFUNC      = 0;          // All MCASPs) I1 y# j7 L5 r" l
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
) t' \: R+ p0 e4 p
; ]4 b2 h8 k6 n. S7 O& J% g0 G    mcasp->regs->DITCTL     = 0x00000000; // Not used
# D7 `. M1 n$ Z    mcasp->regs->DLBCTL     = 0x00000000; // Not used
+ H7 M% w' u* ?: W    mcasp->regs->AMUTE      = 0x00000000; // Not used" {. Z0 x& B8 p8 C8 i5 B5 k

) H* i) M5 O2 U2 D. T3 E* Y. S1 O5 D3 M/* Starting sections of the McASP*/
3 k% M1 R( c. T; S6 H5 q4 r. T3 y& b    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
& l5 }$ c# W# `5 A4 w' ^% a    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  2 G  S; L$ _9 G0 H3 r
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 4 U, i: H; G2 k' Q2 G3 \
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );) p) B9 Q* m) e2 o2 ?5 W+ A. \

- Q4 B* k" F/ |& [: @5 S  m3 X    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; , S$ J# K' [3 r! r# x
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );% E# M/ ]3 b/ r; p# `* V! J
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; , K) A2 c4 u8 a2 D: \0 ~4 A
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
: C* Z( O9 a! J  J3 d. p! R1 T6 F' O
    mcasp->regs->XSTAT = 0x0000ffff;
( y% |9 B/ u. f' v3 C. y, ~* q    mcasp->regs->RSTAT = 0x0000ffff;
, I* `2 [, ~$ w$ `8 A& f1 e
# m+ Y1 D1 l! m. G: A    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;! K( x4 y: p( W6 h' x
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
: G) |5 Y) o# Z* N    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
+ B( \3 x/ d! s* F" \# Z  g6 v* G& E    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );6 s: {& @' s% ^; H  y& N
" @) C; o: [8 r0 a
    /* Write a 0, so that no underrun occurs after releasing the state machine */6 z2 x9 G) F5 S6 H( H" C# M4 H
    mcasp->regs->XBUF5 = 0;
, t5 {7 E- o  `/ G. u* U+ Q    mcasp->regs->RBUF0 = 0;1 q4 W' |1 s7 P/ @% W* S
# p0 R+ S0 D9 m0 U$ Q5 I
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 1 q0 d* F5 m, z6 m6 [! S
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );. W  }5 X8 R8 o5 i# }
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
& S. G3 o- M9 ?# V) h& z  {+ k    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );. I0 ?+ @5 `& v0 z: i( w" E9 ~; j

+ J) I6 q, T* [( t+ F4 I/ n) o    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; * T! g; H+ W( b) E3 \6 c# w3 |2 v
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
- j- G" D% S. l5 g    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
* I6 H, y3 V* C+ `* Q    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
1 J! B! @, X  i) D7 v: n/ }* M& K/ P
4 k8 A5 m2 e6 R    CSR = 0x0000;1 K: M- ^% k7 C1 Z( h+ T
    INTC_INTMUX1 = 0x3d;
4 {" @$ e6 S" H2 C) ^9 [    ISTP = (unsigned int)vectors;" x) W! \3 Y9 U0 L# X1 i! \
    ICR = 0xFFF0;  5 ?$ z  s9 M, }9 ?% ~$ i/ u. d
    IER |= 0x12;  
3 @1 @4 b; e3 l4 e2 T    CSR |= 0x01;  ) |4 v  {4 C8 H1 Q2 Q# v

5 H* ~7 d; F1 e. U" I5 f1 S+ `
  i- h4 z. }; l- E0 g
) U  x! m; j1 N; K0 ]2 U& ^& g还有就是两个输入输出函数:7 j: J! @# o% k- ]5 l: O
void output_sample(Int32 out_data)
% ]" u3 l. @0 Q# |{
2 L$ }) g' F; Y5 f  M5 _6 Y% [+ X  AIC31_data.uint = out_data;  
* H0 }% |: P; [3 P/ O  MCASP1_XBUF5_32BIT = AIC31_data.uint;
2 W$ Y. f/ K% y5 d2 j3 u}
5 b& ~7 S% k5 l# v6 t) I
% L: F4 `% W+ ]7 i3 y# q4 BInt32 input_sample(void)
+ z- n1 a% V  M+ B7 A# c, m8 k{  
' q) U+ c5 a' {9 s  AIC31_data.uint = MCASP1_RBUF0_32BIT;
9 b: r0 X9 a1 L0 ?6 B$ t  return (AIC31_data.uint);* D- P9 A. }- s. R0 o( t
}
) `( m  ~- x$ O
! E0 h( R+ x1 y5 j$ K
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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