嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:7 J+ ]/ _, W5 U/ x
main文件:
' E! T# O% i2 ?& Yinterrupt void interrupt4(void)  1 y7 ~! U% O' L
{
$ K. u9 q5 G! s* p* _+ ]/ k! O+ U  Uint32 sample;% u* w9 u6 W3 s+ L

7 C& k2 J/ y0 ^8 b7 g1 n  sample = input_sample(); // read L + R samples from ADC
% c; r: h0 z6 e  output_sample(sample);   // write L + R samples to DAC
* E6 E: p; ?' P" P% Q  return;) M, @! C7 C( Q- O5 [
}
2 x% S4 y+ v0 c2 \
4 d, O- q2 `8 X+ s6 ?4 hint main( void )- u% [0 |2 T3 G* k# j1 E- k, W
{
7 y+ D; g0 c7 r$ A$ {
% R, g9 s2 i; K& X& i    /* Initialize BSL */
4 v4 F7 f- \7 O( N    EVMC6747_init( );" z9 `7 M# \! c8 j9 s) S, D
        /* Call evmc6747_intr function */; w3 @0 K5 ~! n+ y* q
    aic3106_init( );
  G1 B: h$ S' N/ X; @        while(1);; }7 Q* F. @! ?- A% T0 p" w
}# Q: H) a$ I% A7 f. \$ k
2 I( x3 X$ c6 q/ h3 ^: b

! P& p' R' d- B$ ^; j- R$ taic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
! `: M( u- q& F! j- ]" a& f$ b/* Initialize MCASP1 */3 p" ^  N$ A3 B* g7 }
    mcasp = &MCASP_MODULE_1;
. _. f* s6 B" B+ r8 m$ O8 @    mcasp->regs->GBLCTL  = 0;       // Reset4 e/ {  u$ P5 e3 n+ P( W
    mcasp->regs->RGBLCTL = 0;       // Reset RX6 U/ g1 j6 ?: F6 _7 c7 \
    mcasp->regs->XGBLCTL = 0;       // Reset TX
3 L, _: V' ~6 p; _    mcasp->regs->PWRDEMU = 1;       // Free-running( n( o  J1 {2 f" f. f. E" E
   // configure McASP0 receive registers
* y& c6 m1 |, K0 L5 r    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used$ b6 C' U' i, |# ?" R3 I/ r) d
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus$ f- k" y) o! [' g9 A
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word4 N( x9 O* t# Q8 M
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
; U; G$ g, T8 P; u    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
6 z1 K3 h1 R1 @6 F. A6 K" f    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
. y+ B. \' n7 i( c" W& h3 |) J4 B    mcasp->regs->RINTCTL    = 0x00000000; // Not used" E- `. W, b; X/ Y5 D( t
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! m5 @8 K" q% X! ~8 v* `
4 K! F& |/ `5 J" W: L& u  S    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used6 h9 [1 w! H; R. q& x1 G& N
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus. ]% g; _  O' q7 K+ d2 O& ]6 p
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
/ W/ J0 N3 O' _! U    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
2 y5 j2 ?  \( f    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK% B$ K$ ~8 {- W, ^0 |& _$ c: y9 y) X
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1+ Y4 b% b& L& N5 _0 B# N
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
, a1 h- C& H2 \3 k& W* p9 B6 f/ [    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2568 ~3 j9 |6 h: g2 b6 m: H5 b5 l; C

4 s! n8 [6 g3 O+ Q    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
; g. [2 ^5 \& O* N; K4 p    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
: _. Y- W3 K4 J4 ^3 W3 R# h    mcasp->regs->PFUNC      = 0;          // All MCASPs' W3 ^- ?) m; `7 r! F
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1# L3 ^$ o& m' t" m
6 B- e1 o9 J+ W
    mcasp->regs->DITCTL     = 0x00000000; // Not used& @! U, E* ]/ _0 l2 D
    mcasp->regs->DLBCTL     = 0x00000000; // Not used6 S  a: w6 N+ G! @7 |- U
    mcasp->regs->AMUTE      = 0x00000000; // Not used  @% [3 j) e5 t. _" k: T1 ~
; v! o0 [2 _9 h6 ~' _; U% Z
/* Starting sections of the McASP*/5 {/ e+ t" c0 k* q6 B. m8 G
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
: c8 |$ L5 x- q# Z    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
% j0 m6 ~4 A/ B9 \$ R0 Z    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
3 h8 c$ e/ I, F- \6 V  V5 {    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );! M6 F3 t2 T6 f- T- V% v/ p. ?
3 d6 v! g2 F! O' o. \$ o( ~
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;   }! m1 S; E  M( D: i( d! B" [  W
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );. v. P+ A" `6 [5 }9 S
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; + p9 w5 D8 @  M# d& W! o
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
, b: z. X' D1 n4 _8 ]
- y1 |4 l/ D! b5 v    mcasp->regs->XSTAT = 0x0000ffff; ! o! d) s. E5 P& o) V3 W
    mcasp->regs->RSTAT = 0x0000ffff; ! [& K0 k' K1 z
* E" a. E6 u0 o% \6 B
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;- S; a6 K# p/ V. d/ U9 ]% Q: j
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );# ?: @: ^# d! }5 l4 X
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
4 m7 c% E% X' a    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );, C* k0 B, G! [: y. r) h6 o7 w% c
, O. A$ t3 G+ W; R, ^
    /* Write a 0, so that no underrun occurs after releasing the state machine */
) A  J: \/ N6 N; _" T6 b    mcasp->regs->XBUF5 = 0;
- d+ {& f4 j) ?( N. W/ D, N0 D    mcasp->regs->RBUF0 = 0;) `1 C( Q0 g. h* D% Q/ z

- D1 G3 F: H; N4 |  l" ]    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 3 A8 S" E" ^6 b+ }: o1 d' j; @
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
7 r7 Q5 N; n0 m6 \( Q" m6 `    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
% J) `4 {- X4 m: c! Y  S+ i5 V, a    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
3 ^& ]) d4 w6 F: Z: ?1 r/ l" c" q, ?; E- B
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
' S! @6 S' ~3 ^/ c3 f: ^$ v    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
* s' S+ o& e4 _6 R3 t    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
2 d0 M- A- z8 X/ w- r. Y    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );# z9 r6 m; \8 T1 }1 ?' u
' c, p! t  B+ W  M/ I" v9 p6 K
    CSR = 0x0000;2 t% A$ F5 S4 }" J
    INTC_INTMUX1 = 0x3d;; o: C+ l) z8 P( u& @
    ISTP = (unsigned int)vectors;
, `2 ]! B( V# E: r" F    ICR = 0xFFF0;  * @8 y! _! I" b$ D$ G0 _
    IER |= 0x12;  / y  ~+ A/ ^6 b0 h: Y' o8 b
    CSR |= 0x01;  " {. M) N" j2 K! g

' J, j  S0 w4 ]- B& i5 i
# n6 \8 X9 j% M+ L# a: o
" i: [4 ~3 `) I0 @$ j" }还有就是两个输入输出函数:9 R# F6 B- W) A- j
void output_sample(Int32 out_data)
! I1 [0 I7 b, I{
: f! q' d9 M" s& y( N  u+ u  AIC31_data.uint = out_data;  4 O& q! F/ d. g; @$ n
  MCASP1_XBUF5_32BIT = AIC31_data.uint;5 T( `0 s! l# V
}/ l* k) l6 z/ j5 e' ~; n
  @) I! j  b) u  Z% f% n8 w
Int32 input_sample(void)2 }6 j0 f0 ?) g1 b( s. d! {) A7 |  P
{  
2 r+ {& |! b4 @; u3 F' |; L! y) t  AIC31_data.uint = MCASP1_RBUF0_32BIT;
* Y$ u, i8 k& {/ K+ w# R  return (AIC31_data.uint);
# m0 s1 j1 M' f4 H" m* h}% q% U: q8 ^8 ]  J+ B( U
6 s/ d9 O/ m6 P6 f) Y. W

作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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