嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:8 v) g7 m7 ?5 [, i3 M
main文件:7 D* P: P6 W  A8 l
interrupt void interrupt4(void)  ' b$ v8 X9 v" M4 v
{
! {: y5 n( V$ U! w* `$ V  Uint32 sample;
3 H+ C& U! U2 p7 \2 B+ q" F3 I
' U+ Z! O8 v, t4 H4 s0 Y  sample = input_sample(); // read L + R samples from ADC. |- u% e9 @1 w/ R, ^3 {' S( }7 Q+ i* F
  output_sample(sample);   // write L + R samples to DAC
% G8 P+ [. }% r% o" ]9 a+ G: {! c  return;6 ?* A9 L# W: Z# n
}
2 e; Z& Q- H3 V# p, t: p: v: l5 B0 K$ N
int main( void )1 `" `. C- s) l$ n
{
0 p6 G$ G$ @& A- @2 K: P* W( U. n0 ^; T, t+ ~# f; K! D
    /* Initialize BSL */
( D8 i# y0 N( n    EVMC6747_init( );
; k, L4 R- t9 _9 G+ _" z/ b# a        /* Call evmc6747_intr function */* D5 ~. w+ O2 X2 Y! ]
    aic3106_init( );
0 E0 w4 H7 o! H& B2 X- a& F        while(1);
+ z( z/ y/ _3 m" n: t}
  x4 @3 }; O4 m& S" K  i5 \5 m, F( @3 p5 k+ n2 c
- Y; V8 F" N( E
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
9 w$ v' x& b' ^/* Initialize MCASP1 */
9 r8 }2 Z2 t- o0 _1 W    mcasp = &MCASP_MODULE_1;
$ d4 E2 h9 S8 \& h6 L- P    mcasp->regs->GBLCTL  = 0;       // Reset8 i- M( o* C0 f: u/ Y* h! U# o
    mcasp->regs->RGBLCTL = 0;       // Reset RX6 e4 C  d6 [3 J  a# ]/ @
    mcasp->regs->XGBLCTL = 0;       // Reset TX
$ y& T- j' y+ E% Z( V    mcasp->regs->PWRDEMU = 1;       // Free-running
6 E& j) n+ ]" u4 B   // configure McASP0 receive registers
9 \, n8 H+ ?# A( w, i4 \9 P    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used  X1 F  c* p+ S$ X6 g# R# o) m7 R
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
- |3 x' i  s, f+ r    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word& h% `' _# M! l' x# C) F& b
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
# H5 {. W0 ~! m; |& w    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side); S/ z: W8 M( @6 B
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,10 ?  y' y( P( ~. U* E7 Q2 {  Z4 m
    mcasp->regs->RINTCTL    = 0x00000000; // Not used1 [! a; g+ l8 _& j
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256  j, h. a1 k& y) o7 K
3 l9 c3 I5 V1 h8 ?
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used! x5 s5 N' X/ w3 C" D. K
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% X2 u. A/ W( N. M( f1 G0 P- K! E    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
* K. d% d& N% p- [2 E    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-164 b) f" o; w* [& y
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
1 P5 j( G" W* |0 [6 }    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
( l- |: ]* q2 T, D& w- |# n9 L9 i    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
  M+ |" Q" V: p7 b    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
& J( _1 n5 {5 n* b9 Y2 [
5 B0 Z. p+ I  t    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
) Z6 t: R& o% J- Y. i- b6 ]    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT: B0 s# g. c) R5 M8 j  u6 Z
    mcasp->regs->PFUNC      = 0;          // All MCASPs4 m! R  U8 F9 M5 v, T" _( l$ y
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX14 s4 }- @1 d$ G5 p
0 M) x" X) S, X% D2 F8 ]9 G
    mcasp->regs->DITCTL     = 0x00000000; // Not used0 u1 d/ f  J3 ^+ x  D" ^8 n& ~
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
2 ~' W2 \( v" r& {+ R; b    mcasp->regs->AMUTE      = 0x00000000; // Not used
4 y/ Z- ^7 H& _
( N# C" P. u+ T/* Starting sections of the McASP*/5 V8 ^: }& P* E8 |4 {
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; " C7 [4 I/ N3 c
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  1 P# E" Y7 x0 A; E% a) E" u) Q
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 7 ~/ V. o: I! B
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );8 R4 N/ o" I" c5 `
& g. y  Q3 k. B) d) \/ w& N# W6 g0 b
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ; n  b* w5 L6 g3 s# E& m+ g* \
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );6 w9 I  b, K8 ?3 D. `
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
0 P3 Q& w% \7 S5 u. Q8 i) B2 B    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
+ f- B" J% A  Q
$ w/ y& ^  ]& T    mcasp->regs->XSTAT = 0x0000ffff;
) q4 i% x* a* d$ u/ ?2 s. N  [  J    mcasp->regs->RSTAT = 0x0000ffff;
" [: m9 w% S1 W" Z( q: b
) m0 G, P# u1 G' C# M( D    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
# G: b& P! D" X5 Y; P+ I7 d    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );) Z9 a% _% a1 @2 q* L  }# R0 ^
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
& \; o2 I) e3 x, r. Z& C# k; P8 b( ?    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );1 [' B* S  t1 u% e2 l! u% |$ ~( M+ C. y

; Y1 f1 \; @/ q+ e; f0 s  N    /* Write a 0, so that no underrun occurs after releasing the state machine */
  z, j' u5 R  l7 e$ j    mcasp->regs->XBUF5 = 0;1 {  t+ q1 G3 z' K! k: c5 z
    mcasp->regs->RBUF0 = 0;& K3 Q- J6 {7 f: ], g; R

! x6 Q- ^2 W7 h" s: J0 a" m    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
' v% @, U6 t  x& H/ u0 Y% a+ v/ q3 c    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
, W5 P. W' w6 D( Q. f- D' g    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;   ]* q, W* W) D! W5 B0 @
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );# a9 X  ^2 h  |6 i( X( r. I% ]

  T5 b6 H* u4 B4 X3 X    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
: M; L4 g, h/ I3 {) S* J$ v. E    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );/ l, i3 P  k3 g- D; j- Q: R8 |
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
( u- U/ [+ E3 s    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
) U8 S- ]! `& K8 Y" X; T+ _; S3 Q! q- K4 q5 E' q: k
    CSR = 0x0000;+ r3 I# f! p9 ?  n8 g7 d
    INTC_INTMUX1 = 0x3d;
( f* q# M7 k+ B. K: }+ A/ @: i+ h    ISTP = (unsigned int)vectors;
7 L1 [2 `. N; k" R" ~    ICR = 0xFFF0;  ; C3 |; V' J" M3 X4 b) X% F
    IER |= 0x12;  3 f- {/ y+ x; l0 y& D& V; R
    CSR |= 0x01;  5 P! p0 w& G, g/ B. V7 p

" J8 q% Z' Z/ R0 C- f- {; t& q% P3 ?& ]% ]8 K% W) @6 u( Z
0 O) D8 X1 n' p/ O
还有就是两个输入输出函数:
6 [' u% K* x6 Ovoid output_sample(Int32 out_data)' I  H0 l! n8 W6 n  g
{
( \) k6 X. z" h! N/ M  AIC31_data.uint = out_data;  , C  ]4 {8 j! A, A  ?: x' [
  MCASP1_XBUF5_32BIT = AIC31_data.uint;6 V4 Z4 B7 V. N) K, R0 t9 ]
}
3 s2 l4 U; q' _# R' W  @3 X3 c: C2 N4 w+ @2 b* C$ y- ~
Int32 input_sample(void)/ p  `# W& M" G3 M& n
{  $ J& |0 \  P3 }. H
  AIC31_data.uint = MCASP1_RBUF0_32BIT;$ \' f, _6 \2 S" y- Q0 B$ l6 G. g3 y
  return (AIC31_data.uint);8 _# g" A4 A6 \6 f
}  ]% g# v$ d, W8 ?+ a" C

6 ^1 D4 @8 y) ^( J) G4 @( v; f
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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