嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
7 B( a& N  E, y+ G9 tmain文件:" S, [+ A4 ]* W% @" p& n
interrupt void interrupt4(void)  
) M1 k1 c5 z8 y2 `{
) v2 U# n' l' P( v  Uint32 sample;
' g' k0 v/ _6 m3 w  M/ S
) D/ L* D6 E) o* C) g) j  sample = input_sample(); // read L + R samples from ADC
) {  t8 {$ _. g* z  r3 w/ I  output_sample(sample);   // write L + R samples to DAC 7 ?6 l+ s$ r' @$ v
  return;
2 j8 i$ G; Q3 J0 T  H: N& ~/ M7 ^}
3 q7 N0 Q  @5 v( u$ g3 B" [4 D, c+ `, T! ^* ~
int main( void )/ [( M. e# b5 q1 \" ]% H2 y
{5 C$ W. V/ c: y+ H. p4 C" g

/ M- f9 T8 x$ R* S    /* Initialize BSL */  L/ i( v: _& |( d' h
    EVMC6747_init( );8 q! B2 ^! D+ b3 J  b9 J
        /* Call evmc6747_intr function */
  I' x0 A% Y, |0 ]  o( `: N4 z    aic3106_init( );
8 }/ p1 [$ S% o7 f8 d0 Y        while(1);" V" _2 ?! e$ W' Q1 g
}8 V- W& R* r! O6 R- u' a

# _7 d$ J, J9 h9 E3 ], U
! F7 @# `# a/ u9 l% `1 G2 Aaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题& ?$ }+ M" d* W
/* Initialize MCASP1 */, y7 {$ X3 G  v. P& p
    mcasp = &MCASP_MODULE_1;  x: _  _, U, p' {7 ^2 d+ r. `# G! h
    mcasp->regs->GBLCTL  = 0;       // Reset* O1 c: f- K! D8 w
    mcasp->regs->RGBLCTL = 0;       // Reset RX
: j1 T1 e+ t5 u& q( E    mcasp->regs->XGBLCTL = 0;       // Reset TX
3 n& {7 T/ {/ j, V9 p- L8 t+ O    mcasp->regs->PWRDEMU = 1;       // Free-running
1 V' J5 S9 O' ]   // configure McASP0 receive registers0 I: E  x  w2 ~4 \" Y1 `
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
: w8 K6 F  C! p6 K    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus+ v4 V6 F4 V4 I3 _& p# O
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word' m/ }' ?7 z$ W8 L/ O# ]
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
5 }$ [  |& t4 a, \+ G7 P    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)$ g# R( l7 Q  V1 C5 h( {6 h
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,15 @- Q1 b' F) \( h; w8 Z7 w. h( Q6 f! z
    mcasp->regs->RINTCTL    = 0x00000000; // Not used5 k" \9 w% o7 z& N4 M; t' g( J
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256! ^1 j0 K* z8 g; V# ]1 X0 }7 X' h
+ Q4 Y4 N/ C4 D) {& u' a
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used/ g2 v; P9 y! Z. Y+ Y4 l
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus1 q; P( X8 D. F* @
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
& D, e6 q( D+ ~  s" Y- {  [, I3 E    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16% {% C! g5 o1 T3 P* P( w
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
! y# V) P) A% C( d    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1/ s$ J* R4 u/ J3 O7 b- D6 F
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
, S; |2 {1 K' G- E+ n; Q" Z  b7 q    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
  \  K* x' f6 W1 J( H. K* Q; ^5 i  m( y; A. p% m
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN; H, w; R, c0 q' O* v& \2 n
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
  |" Q$ u1 Y9 b5 a+ l) w    mcasp->regs->PFUNC      = 0;          // All MCASPs8 R' H$ {7 Y! W/ y5 ~; y" d
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX14 e8 A( W! h+ p5 ]

: ]- {* G6 {: S" Q% F' n5 w6 e9 N5 x    mcasp->regs->DITCTL     = 0x00000000; // Not used
# h) J& V5 s( G    mcasp->regs->DLBCTL     = 0x00000000; // Not used
3 v: Y- p, d5 X. C    mcasp->regs->AMUTE      = 0x00000000; // Not used8 I7 \4 r7 P  c. _) L9 K5 y

. H4 M$ M7 `( C5 q0 i4 m3 i6 K  K/* Starting sections of the McASP*/
: f7 w  C( N  Z7 O# w    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; - C4 v: i$ a: ~! {# \2 H' S
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  % F% @: j4 a7 u; J* s$ I
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
' N/ [# i, G+ t0 ^* p* X+ N) Y    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );2 K+ O: L" v) `) ^
/ `" \, e. G5 J7 i4 b
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; / J1 \0 q) M7 O9 t* n
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );/ Z" x6 k; n0 i. S5 @
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
( |. L# B# B# q: P  _    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );# R" @1 ]7 g7 S1 S# f, @

0 ]+ _$ _. _+ M$ a6 q( |# z    mcasp->regs->XSTAT = 0x0000ffff; / k9 u! B" V6 H. Y8 H* Z1 x
    mcasp->regs->RSTAT = 0x0000ffff; # R9 g0 E, q6 P; x
' z$ X+ B8 T/ O# F  P! ~% R/ D  {
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;4 w  h/ _8 ?6 W" o
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
/ a4 O3 i% p) D' e5 ]2 F4 T8 K    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
4 r8 U' F! z5 j    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
+ }  V- y9 p, G  p6 c) v0 G
2 C/ U' A: Q8 e9 f; k: |    /* Write a 0, so that no underrun occurs after releasing the state machine */
/ T) a( z7 K0 O/ |0 [" H# s" r) L    mcasp->regs->XBUF5 = 0;2 ?% z6 o9 P  c4 b. r0 G. u/ u! t
    mcasp->regs->RBUF0 = 0;
& f" {0 c3 I) h/ E5 I* F6 p- _. S$ i2 m, }5 h7 W& c
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 8 L" f# V# Q" b. `) I/ X
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );0 X9 C* B4 K8 o4 E3 ~# q. Y" Q2 `
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
0 B+ {. S8 z, S/ `# ~, ]/ g    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );2 B& C9 W; A. S  F/ m
% ^5 e' l4 I! S/ P2 Z/ v
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
1 G, b! x2 D: Q- t7 a' a    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );3 k; u( u; ?8 [$ X$ Y1 c- e
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
8 L6 r. X+ O3 L: @0 ~' ?    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );: G9 g8 y( U$ Z, i. r3 `4 [: P
! a: q2 _, G6 N6 U) l4 g
    CSR = 0x0000;
" T/ f+ p4 ?( {# _( P    INTC_INTMUX1 = 0x3d;
  `2 q" Z5 Q* S7 Y1 B# \, ]! L    ISTP = (unsigned int)vectors;
. o7 J" o3 |4 {/ z0 k    ICR = 0xFFF0;  
! d0 ?1 T3 f: y$ T" B    IER |= 0x12;  3 k0 d- c" k% ], i* \
    CSR |= 0x01;  
- n* R" A: g7 q4 S0 @! V- P- R7 N% X2 f! ~% t  O

# m' `5 P" S) m: k: a
" |& K, i4 ~3 t, c( E* L还有就是两个输入输出函数:; s& M$ d6 |6 H7 d) F
void output_sample(Int32 out_data)
: _2 r4 y5 \* J. Y9 V; ?{
/ G3 [& |( t) K4 W  AIC31_data.uint = out_data;  / F2 M4 m  h! E! z# L
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
$ j' w% M& B% P$ ]# m! O* `}3 m4 o  B; O2 f5 b
: G. p" G  C, @4 e% e# ?
Int32 input_sample(void), P" [8 a0 N/ k7 c/ v, o* [
{  
7 D2 r. {5 l1 W; q: o/ V  AIC31_data.uint = MCASP1_RBUF0_32BIT;7 u  ]4 \8 f3 z+ g- ~4 u, z: P, J' Q6 o
  return (AIC31_data.uint);
$ s' p# Z: W+ s9 v}
7 h2 W% P6 z+ ^5 b; h- f" Y9 z, Q. ?% k* h

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




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