嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:$ J; ^# a! H9 j* s0 u9 p8 |1 q
main文件:
+ |7 k2 y' E4 K$ Q. ~; X9 Qinterrupt void interrupt4(void)  . t- s% p* }8 u
{
) m5 \, I! b$ x. G  Uint32 sample;
) ^$ {7 l2 t% S" `+ t% c
; ^# L2 e! z8 h/ R. w" k+ u7 b4 o  sample = input_sample(); // read L + R samples from ADC
+ k+ w. y3 k  h% n+ S+ G5 x9 y( x) b+ Y, N  output_sample(sample);   // write L + R samples to DAC
: `8 N0 X; |- U  return;! h+ T# B4 I* T' ?+ {5 s
}
7 X: L5 }  X# y- A
' H: E5 g+ R1 P6 Dint main( void )
3 i- a5 t( S9 }{
" F2 \# ]( L8 C" u4 B8 e! I9 R, C8 s  [. f0 @+ K# ^# V
    /* Initialize BSL */
8 e1 N. K7 U0 M/ o3 B, L    EVMC6747_init( );
# S" t4 U9 r0 }- h( w3 H5 i3 B) t        /* Call evmc6747_intr function */7 g; m" A8 |- @5 d
    aic3106_init( );) b$ P$ f  P  ]
        while(1);
* J5 p  Q, ~' [! B0 E8 D8 h}
! I. C9 ]! T# e6 Z- m; u+ W/ d6 h1 k. N5 F. y* i
4 P/ Q, W1 ?7 `. v+ Z) u$ w2 Y
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
$ x8 i7 x: t3 l8 |" h/* Initialize MCASP1 */
' S5 ^, k. @% D1 q    mcasp = &MCASP_MODULE_1;, A' R2 M+ i1 M; U1 P
    mcasp->regs->GBLCTL  = 0;       // Reset  \$ L3 k* }8 @( B8 C5 [3 p
    mcasp->regs->RGBLCTL = 0;       // Reset RX: D- E6 R- v: ^& P, C9 J- }
    mcasp->regs->XGBLCTL = 0;       // Reset TX
5 V- a2 r  _, O  O& v: P    mcasp->regs->PWRDEMU = 1;       // Free-running9 p. h8 e8 o, ~/ E
   // configure McASP0 receive registers1 W4 l9 c6 f: Y# w' C
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
7 j: f6 b. Q+ T6 J) n    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 u5 A6 m5 \4 g, v    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word; j5 u+ Z0 w2 _- R
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
( O  e0 x. G$ y; {1 Y    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
( W: {+ J0 K) {7 m6 \% k    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
) k9 E- z7 ^" \    mcasp->regs->RINTCTL    = 0x00000000; // Not used
* F3 A. i% S9 F' {- M    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2565 f8 o, X2 E4 L1 v
6 |  ]( X  V7 C6 e2 r
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used# `) k6 `0 P. h( Z. v* b4 T* u/ U. A5 N
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus7 Y5 A7 b. z1 r# G# d" F+ C' W
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
) O# j, D* z$ v6 @    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
. ~/ f5 c: {! V. F* T$ p    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
0 E+ F3 s& L1 a  h. D/ k" C    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1& B0 J1 e( f2 r+ D8 W) R: ]8 }
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
5 x7 B( e9 ^2 I, `7 y$ y    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256& e  c) X  K' U$ \
/ \8 S$ N6 V: ]3 A
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
: r' O1 M0 N- y    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT0 v/ c, b7 b: w, X" A
    mcasp->regs->PFUNC      = 0;          // All MCASPs
# D8 y4 F" P) _( Y/ {; [6 D    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
7 ?' E% y0 Q. w" |7 j& D8 z1 H1 g3 g6 H. ^) b. y
    mcasp->regs->DITCTL     = 0x00000000; // Not used
6 M7 y5 \7 f' v2 W7 j6 D    mcasp->regs->DLBCTL     = 0x00000000; // Not used2 T8 V: [3 _6 J  p! G
    mcasp->regs->AMUTE      = 0x00000000; // Not used8 D) h/ E4 o. T, q' a) c. s! A# E

1 R6 Z" w1 |& n/ |3 q, t/* Starting sections of the McASP*/  z8 J1 U) e* X3 [* E5 e) s" `
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
$ Y1 y5 A2 L& Z# C7 g* o6 A    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
) s/ ~. i$ Y, e2 k    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ) u. @+ G% o) M
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );# K4 r% `  _6 x0 x
4 X% O3 u/ T! B# \6 f" p
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
: @8 b" L* b. F6 l0 ]' o2 V: g$ o    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );% d' F! b% G7 U; B
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
2 m6 r& a+ Z7 O' J. F- r. ?8 }1 z  u    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );+ |  k. L: m7 i! b& Q

( F+ p$ [1 T% v/ k; u    mcasp->regs->XSTAT = 0x0000ffff; ) q& _2 g% ]9 S& ^: I
    mcasp->regs->RSTAT = 0x0000ffff; 6 x5 Q/ S$ {% N) U* L8 ?

( X5 o& }0 A4 B' f3 y4 q    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
  O. M4 ]2 B& z2 i9 u! T- Q* G9 @    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
3 u6 L# ^8 i! F! R6 l    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; " i$ \8 s9 m7 L) X5 Z* a
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );) V, Q* O( P" Q; x' m' U: m

8 T0 c1 a& n. }0 S' n    /* Write a 0, so that no underrun occurs after releasing the state machine */
8 Y) r( K0 N) t+ T    mcasp->regs->XBUF5 = 0;+ }4 x1 t" o4 O) |
    mcasp->regs->RBUF0 = 0;
8 P# s4 Q; E2 G6 ~2 {7 m- j
8 u2 R4 z! R5 Q0 m1 q+ o    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
  X$ q7 M/ p( e! S    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
4 _# ^8 W# ^; l6 ^; m4 `    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
6 @6 \" P4 M$ S( c2 O: t+ c    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );! D# ~) Q& l+ L4 p% Z; e

! Q) a# j8 W, K- N$ E    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
# F1 o! D5 X4 B- z8 d- ~    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );) b7 c5 m  I5 ^: s$ H0 c
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 0 D# Y& u. \* g2 k% T; C
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
" X( n& t9 D$ l& C9 B3 c4 |- J* ~$ S* _9 p
    CSR = 0x0000;
+ C# H" o: ?! a2 [) ~    INTC_INTMUX1 = 0x3d;
0 d4 p4 k4 q: J' y8 @& n3 \- N    ISTP = (unsigned int)vectors;& X* v, q) Y5 D# r
    ICR = 0xFFF0;  
# ~  e& ~' R2 Q$ w1 D, r    IER |= 0x12;  6 }, d, ^7 t1 x" q9 g' |7 T2 A
    CSR |= 0x01;  
) d% g1 A& s8 z( I. T5 b1 B1 E* b2 ?0 s- m' U+ @
5 c% T9 |6 @+ O0 B7 e7 T
9 n! R, S( c. F. j: N. B! K
还有就是两个输入输出函数:
- D* R) l- N' r6 T- u8 ovoid output_sample(Int32 out_data)
* c* e( Y9 B: X% R+ ^# R{
, ]# r5 P6 O: i5 R# Q' I* Q. D  AIC31_data.uint = out_data;  1 B1 n0 |0 V- w9 A. r
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
) X0 W3 ^+ h& i' }3 O4 u: [: _}  v: t1 ~  w' s0 l

& E3 O0 Z0 Y  sInt32 input_sample(void)1 J6 b# R- I$ ^9 M9 L
{  * S8 G- R+ C  K1 F
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
* J0 a5 I: H& `2 x# E) b) v/ n  return (AIC31_data.uint);
  v% e( y' x5 O& U5 K1 B6 w}
% J# X5 e6 U7 q2 ]! ~. A
; V7 J2 U* T5 K2 h; v# Q- C- y
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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