嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
: U# G3 G# [. n) Zmain文件:% u+ X! r" C6 F, r
interrupt void interrupt4(void)  , S8 A- W. U! |4 M
{  ?& T# H7 R" N7 p% K
  Uint32 sample;
9 D0 m5 X3 x% S: B. k# L& U( O, _/ M, j* b+ g
  sample = input_sample(); // read L + R samples from ADC) p8 m' a, g" O6 t9 W; Y- f
  output_sample(sample);   // write L + R samples to DAC
+ @% i  V+ i+ m7 K" t% v1 F) K& \  return;
1 J# X8 y3 F9 f  e# n3 q( g}
/ U0 ?& U4 a+ z; k1 o( ]- ?6 `' {6 s
int main( void ). A, d$ l+ O: _  x. R6 k
{/ `. V8 K$ O) l$ s* H8 q( r8 j
/ I5 i  a2 m3 A: d" \- \' k) y+ T) {
    /* Initialize BSL */
' i7 f5 h& B% x1 V4 L    EVMC6747_init( );
# I+ `* o) R5 c$ k) W        /* Call evmc6747_intr function */
, j# R# \; K* h3 f    aic3106_init( );* d% K* G) Y0 f$ @( T
        while(1);
* r: i/ C+ S; j}' A2 k. c; ~* t, [4 i

7 N  {- l. m& ?1 [$ c7 W( y' y, E. E+ b- B) y7 T
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题" d, i% _0 N6 {+ [" U  L
/* Initialize MCASP1 */
! k/ {2 c1 ?& w+ f, j3 p# X    mcasp = &MCASP_MODULE_1;
, ~' S1 p4 Q1 [5 q3 B  A( ~( h    mcasp->regs->GBLCTL  = 0;       // Reset
. n: B2 _; w0 }! u8 T  y# f    mcasp->regs->RGBLCTL = 0;       // Reset RX
3 b7 K" [. ~6 _( ^0 [1 H) X    mcasp->regs->XGBLCTL = 0;       // Reset TX
& t6 L8 D0 K) c' g1 s3 }6 q    mcasp->regs->PWRDEMU = 1;       // Free-running) R, `& ~5 \) Z/ s$ }& f
   // configure McASP0 receive registers
" [) \* d6 E8 y7 ?9 n# I    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
& X, c2 X* q' h0 Z" t; c8 j# ~    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
' D. }5 O) C/ f' U/ \& k4 l: z    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
+ ~) z9 {% u, N+ z) r# x    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
. }, Y% m$ v# a0 ]0 P& t& o    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
* P$ C# N7 \$ U- W    mcasp->regs->RTDM       = 0x00000003; // Slots 0,11 t' O6 E0 C- p! j3 o3 F
    mcasp->regs->RINTCTL    = 0x00000000; // Not used. t5 H1 }3 V9 n7 v8 ?0 A: y# z" C
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2563 a# k2 J8 Z* R+ J, O9 d
6 B. P: z1 ~( W5 L5 e4 Y
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used7 s! E! I4 H2 N$ G9 {2 i
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus8 P0 _6 `) w2 q, i
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word3 \9 i/ o: K: x7 ?, |) f  J' p2 ^
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-169 y4 H+ y" H, n: P. T3 ?
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
7 A. I& B3 d$ X    mcasp->regs->XTDM       = 0x00000003; // Slots 0,13 w5 z# K1 K% |: F  }+ u
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
) f  e+ Z, j1 d# I7 s% `    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
; u0 r8 x) G3 C% z8 O- q  F) w9 _, R4 N4 ^
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN5 ]  P* S& i- r4 q9 u/ u1 g
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT1 o3 ~7 c$ h& B3 X
    mcasp->regs->PFUNC      = 0;          // All MCASPs  |# [; f. ~0 A5 c) _
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
9 g% W- _: l7 T) z
6 Q6 ?% K. f# ?7 q4 G9 \    mcasp->regs->DITCTL     = 0x00000000; // Not used4 b' q8 H: Q9 x+ K, _
    mcasp->regs->DLBCTL     = 0x00000000; // Not used- f6 b# r3 s- V! i
    mcasp->regs->AMUTE      = 0x00000000; // Not used: K4 U5 p8 J$ `0 K/ C
) Q+ u/ }0 v$ Q1 X, M$ `
/* Starting sections of the McASP*/
0 h) `' T) V# H3 {6 V( x% \    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
- K, [; l) c9 ]) p    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  " c0 [. A# K2 }. f" j
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;   |6 m6 W: E& \& T$ U) a3 b
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
) o% c( o: f  c8 r) U, e, }( z! D; O: c# ^7 R% Y; w, z
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
3 Z" J- z9 ?4 v9 L( {, z    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );4 {. q3 \; K% y* P  ?. f
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
- |$ X6 d9 \7 s9 I$ x* S/ T+ q    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );8 V, ?- Z' K( j$ Q3 w4 |

1 o, s8 @# }# s8 J- G' V- n    mcasp->regs->XSTAT = 0x0000ffff; , t. f/ e+ k, F! m
    mcasp->regs->RSTAT = 0x0000ffff; ! a  c- s, a8 |6 F2 p6 \
! }$ B. Z' m! O7 |- p6 H8 W
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
! K# Y1 S- o( j% M- [5 ^( I    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );/ B  M4 c- K# p0 O) D6 B+ _
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
# A- v3 h, `* j' W    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );+ r5 C  h/ _8 [" E: y' j
6 S9 f$ b( V  J, a+ t# t- T
    /* Write a 0, so that no underrun occurs after releasing the state machine */
0 e, E- W3 ]+ z& H# ^' I# M    mcasp->regs->XBUF5 = 0;
, |& @" }' D( ~/ c    mcasp->regs->RBUF0 = 0;/ Y. _0 D2 ]9 R+ J
. u9 y: J! i0 Y7 L
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
; M/ K3 @' B" I, ^# J    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
/ }9 V1 d; d; x7 q& h& \. U+ M    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; , c5 Q# w' i, b" x( O- J' w
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );; ~4 J3 Z7 n& R
/ R8 F# x! W7 L  p
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; # s. Y! p' S# P2 d( ^6 S& q0 }
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
8 G3 u. T6 c$ `7 ?1 v    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
  [  C1 G7 E# j    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
* z. G# |, q% ?$ K- G& A9 h  _' }( c  m5 {
    CSR = 0x0000;
& r2 r5 v: H7 U# E    INTC_INTMUX1 = 0x3d;2 {. H. P! I. K3 U6 z: _  |4 o
    ISTP = (unsigned int)vectors;
$ x& ^$ o( i) v2 k; c$ W5 [5 G    ICR = 0xFFF0;  
% V/ ?. Z' k' N& ?+ _) R1 p    IER |= 0x12;  # a9 ^3 U4 Y2 U! d- R0 f
    CSR |= 0x01;  
' n, p5 v4 W5 q: U5 g
4 {0 v- L) y# H; E' d2 `. L; K+ ]% ?9 ?$ D$ a

8 T. M% N0 i0 p% W还有就是两个输入输出函数:+ z4 C! A* A. n7 V; m
void output_sample(Int32 out_data)
) f: G: ~& h5 c/ Q. y) [{) n* k9 u( R+ n. v9 W- M
  AIC31_data.uint = out_data;  
( a  D1 e0 e7 F- o  MCASP1_XBUF5_32BIT = AIC31_data.uint;* o" g! h" o. I+ p) v- z' t
}
1 R% Z3 q) R- S, Z) N* T  p/ M" S$ N- \8 h+ z- x
Int32 input_sample(void)
/ C+ L0 \' q; p0 p( e$ E{  3 j# ^- P4 S* }/ {( r3 ~
  AIC31_data.uint = MCASP1_RBUF0_32BIT;1 D& B& s8 ~( y, o4 o0 s/ ^) ]
  return (AIC31_data.uint);" s/ j# g3 m# K2 g
}
- ?; Q; P+ b- {2 I/ {
2 ]- g( p2 H6 _+ N/ j
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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