嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
( U3 h& _" Z% x* B  a* i! {3 l. Q+ ^main文件:
" G- P1 _4 D% k/ linterrupt void interrupt4(void)  
% ~6 b2 l6 a6 P8 ~, Y{* A5 w: E0 o0 {- l# U% P) I
  Uint32 sample;
8 W4 ^6 f' |. }! d3 ^
+ E: L" C& v5 X& X  sample = input_sample(); // read L + R samples from ADC6 m" v- q6 t5 n: b9 d
  output_sample(sample);   // write L + R samples to DAC
( C3 v* T/ B5 ^. `/ X  return;" C; Q" D( s) [9 ^3 I4 q
}
  q$ J  z  q  f+ y- {% t  ]9 n1 _- n+ \1 Q  l0 o$ _2 t. m
int main( void )
$ T$ h0 ~1 V( k1 @" u( M$ H, B& ~{
3 u+ m' c7 Y( \, B" l& O, k! J# Y3 ?; g9 m* n
    /* Initialize BSL */. _1 G% ]6 F, J! ?7 C$ L
    EVMC6747_init( );
0 X/ P& Y* f" L  p5 O# I+ C0 x        /* Call evmc6747_intr function */5 o' o8 C( K: j2 J5 L0 }3 x/ V$ @/ s
    aic3106_init( );
+ `& F, u7 B9 m/ i  C" d& u  V        while(1);
- J. V8 @) G( Q: I0 K- d4 Y- Y}
2 ~1 ?# e- n/ o! y- B* `, j* [/ p- N/ D; }9 w! x" m

2 y; E5 N" o( f" j, S- kaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
. y3 u1 |) i, y3 P& U/* Initialize MCASP1 */% Z6 ?" }9 K0 s8 ]% ?" z
    mcasp = &MCASP_MODULE_1;  w0 _' C. W3 E, [
    mcasp->regs->GBLCTL  = 0;       // Reset
1 Z1 p+ h: o. X: ~  Q    mcasp->regs->RGBLCTL = 0;       // Reset RX
0 d" d  Z/ G  O. S    mcasp->regs->XGBLCTL = 0;       // Reset TX% g) @6 l0 ?3 u+ x4 ~; m. y
    mcasp->regs->PWRDEMU = 1;       // Free-running
' x+ g8 I; d5 v. _   // configure McASP0 receive registers
) B, e) m" @- b: w' ^    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used2 y' c2 }/ F: E  r3 Y1 u
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus2 w+ a: m" P5 {8 p3 d
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word/ F3 P; Z$ o; r* m, J
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
& x% j, C* ]& s! c" V* t& l1 V    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
9 X- u1 ?3 n" d) m% L, b" [    mcasp->regs->RTDM       = 0x00000003; // Slots 0,13 u9 Q% H) t' S& ?2 S
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
# x8 F* \) b5 Y8 v3 A    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256  x3 U! q8 j1 w0 x, ?$ [% I

1 w; N9 c3 A% h1 m    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
0 j5 `3 ~6 q5 d+ [/ d2 v3 c! h: x    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus0 v0 {+ o& \! w0 R8 d% D& Q) H
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
, P1 j2 q9 `0 i  ^' _    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16: ]8 R& W8 s3 s, K# G
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
8 t# j$ t6 g, E8 a    mcasp->regs->XTDM       = 0x00000003; // Slots 0,12 R3 i+ H2 v4 @4 E$ N
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
' V' P$ Y4 F/ h5 {5 t$ n    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
- Z9 L3 M9 Y0 U# D1 k2 C
+ v: w6 K: a# Q' S: U    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
* I( B+ z: O' b7 n7 }- y0 ]  P0 J0 C    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT2 Z) U% ^0 q0 ]
    mcasp->regs->PFUNC      = 0;          // All MCASPs, S" J3 B" ]0 ^  t6 W6 x) \2 e* q: G
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX13 X6 U1 e8 C8 X3 S& m+ y5 l
* s# v/ F; J/ h2 }/ a
    mcasp->regs->DITCTL     = 0x00000000; // Not used# W! m1 O, a1 Q
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
0 ], A3 t# G2 `5 T/ ]3 ?2 y    mcasp->regs->AMUTE      = 0x00000000; // Not used
% |- i' t" J: ^/ H
$ ~- ~5 n4 }, {; l5 [# w/* Starting sections of the McASP*/+ p* c7 \5 w8 L5 }# p
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
6 A; `. a. y1 _# p    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
9 d' ?* q# O. W; p4 e% W1 _    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 6 l* `9 f6 t& S& K% x1 o
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );2 `4 o0 K- M: g+ \$ b0 W

5 O5 c) f% ^3 a% v    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
8 c9 W2 ~$ g& n3 H    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );/ \$ h' p" `1 U: ?* q" U
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
5 k' V( G6 r% E$ y. C    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );: P4 f/ R/ v: ^: q2 q' O4 R

5 P* \- t0 A* g0 J( S& I. K6 n    mcasp->regs->XSTAT = 0x0000ffff;
) v6 P$ c; [4 q/ X    mcasp->regs->RSTAT = 0x0000ffff; 7 _) q  R6 H9 S& C7 {' Z2 m

1 S# z* i1 o8 Q  {; v    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
% q# y( U- @# P  ]) h" Z" a: t    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );7 M& A& p7 i1 A/ `. G4 }; ?
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ) l- ~- d2 I6 ]; B8 @
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
) _  ~( D& T/ p! r$ _
- C! O  _5 L/ f4 k9 N    /* Write a 0, so that no underrun occurs after releasing the state machine */0 Z! {+ s2 F2 t  A" G4 b
    mcasp->regs->XBUF5 = 0;% ~5 z8 p! \% T9 o+ |( `
    mcasp->regs->RBUF0 = 0;' _: y6 g- b7 B- |6 ?5 `
) E. j1 A& p: e. }. I( K4 p0 R& V
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 7 O% k6 s( D0 P0 D7 E7 i
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );5 G/ ^2 b  [: ]
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; , ~, J9 H, v0 X
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
1 I! D, l/ [, G# a, ~+ F0 `8 F; X% a- ]! a. l% p
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; . ]* G/ w1 |$ I$ J" C6 R
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );: J7 x* j* x' a8 ^1 y" `
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
' Y9 o- `2 \$ p' |, ^9 p4 S) o* i7 i; B    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
5 d3 W% c( i1 ~, x. v* ^% z
0 _0 T( |3 t0 q    CSR = 0x0000;- F# W/ r0 E1 K7 _9 K0 C
    INTC_INTMUX1 = 0x3d;2 Q+ c3 z; v% ~2 _1 Z
    ISTP = (unsigned int)vectors;
- f8 ^/ W: B6 K! r0 f! U    ICR = 0xFFF0;  * O  u+ J( b/ i' h# j
    IER |= 0x12;  , _) W, u( _4 q+ S6 X
    CSR |= 0x01;  
: r* t( h8 a: D8 Y+ m9 a- ~* l6 s9 s6 R4 l8 Y( i9 X) {) x* N: x
; d# ~! e  x; f, u) {' a4 ^" M
) j0 j6 Z. n0 Q, c% j- P
还有就是两个输入输出函数:
7 G* {0 q, ~' R3 L, e4 W# m5 V: mvoid output_sample(Int32 out_data)
! l6 j2 k; S. t8 o$ T{" n" Q* g4 |& H( ?! ^4 X
  AIC31_data.uint = out_data;  1 ^: N- [* _0 x. s
  MCASP1_XBUF5_32BIT = AIC31_data.uint;, w# Z5 k! v: Y6 Q9 S" \9 K1 E& C( b
}( l4 Q. V! G# v% H" ?/ N

/ g/ ~* N5 f0 s  m# K! oInt32 input_sample(void)2 \8 c) [4 c! a& j' `( E; [
{  4 M  b$ X8 F5 p  Q$ {, X. a# S" Z
  AIC31_data.uint = MCASP1_RBUF0_32BIT;' {8 I3 f' v7 h, z, F; c5 D/ X
  return (AIC31_data.uint);- j) D# T. Y0 G4 J. D/ F
}) d% J; \' O3 D0 O9 v

9 `* @; H4 k& [/ }2 t1 r( C
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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