嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
& E- k0 n. ~" U$ ymain文件:
* c1 L# {( _; s2 O0 s; P9 \# }interrupt void interrupt4(void)  & h8 w5 u% A7 o% \# i. B  {) z
{
' A! m* g  _1 v& \* P  Uint32 sample;' ~9 g2 z! [4 t+ R6 ]( H# v: x
, E  z2 I: ~& @
  sample = input_sample(); // read L + R samples from ADC
# V9 N6 q, [  ]7 H  output_sample(sample);   // write L + R samples to DAC * v5 z! K& ^9 h. K& N" x
  return;5 c. F0 ^5 L2 A5 s$ e. w2 [" \
}
# G) p. b3 r0 o: [4 a! C* g/ \2 q$ b2 V
int main( void )
1 {" I; M3 ?" R! f0 t{
! U$ R" l5 \1 R7 h, d( V7 Z: x" s* ^  \: q8 q
    /* Initialize BSL */
% B) h9 T  Y+ F    EVMC6747_init( );
6 F8 y  ?& u) H6 R& s" w        /* Call evmc6747_intr function */7 L" V5 q; y; a+ c: i
    aic3106_init( );" A" o8 N& N8 W+ @4 h( W
        while(1);3 X8 t8 a7 [" Q4 z7 M1 J( d
}
* [! V# ^5 f7 v8 l- q% y1 ]& v" p% k5 j) G$ k! m

# v/ l" e6 E! v( ^+ ^1 M" B1 V% @aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
. ~3 f2 N' \2 M7 [2 m2 U* E9 Q! M/* Initialize MCASP1 */0 s4 n1 A' |; b1 ^. G6 D
    mcasp = &MCASP_MODULE_1;6 l9 s, h% Y7 g' {
    mcasp->regs->GBLCTL  = 0;       // Reset. u- N8 L5 Y6 r& _+ k* X  x- c
    mcasp->regs->RGBLCTL = 0;       // Reset RX
0 M0 S" h- k! m; |    mcasp->regs->XGBLCTL = 0;       // Reset TX
$ M7 e! {& o: L# K    mcasp->regs->PWRDEMU = 1;       // Free-running& c. K6 {  o# W2 e3 z. Z( R
   // configure McASP0 receive registers
8 G0 ^  B! n" _/ V2 F4 L    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used  o1 d! C. p7 ]; d$ T+ T! t( P
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus7 T; X5 ?6 I$ z
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word! B) H6 D0 _- B" u
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)/ Z( t4 V2 D, G+ ~5 g
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
7 z2 H- b  l9 U( I) }4 l. Z1 p( P% h    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
9 h, b' C3 X6 z! I% _3 V    mcasp->regs->RINTCTL    = 0x00000000; // Not used
/ p- o0 }& y, f3 T+ p* b    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 d; |  `, ?0 A8 u
, c0 a7 M' w9 `" |8 _    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
6 s. n4 G: n1 q; a. {, B' z* W7 }0 \    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: G4 E1 e+ p0 ?; R$ b) P, j3 ^    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word, ^1 m) p+ ~% S3 t( j6 t' p; y8 }
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
' p7 f, ?: R8 t0 e5 s% S2 ~# k    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK5 w# E7 [7 [# P( H$ m, S
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
. V2 l8 o% f* J: v  ~% w8 K    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
* |% B* K" I1 c3 t    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: z3 M3 C7 ^' R+ a5 l: E$ U8 @) x+ O. V2 A9 G5 n
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
  f+ F% X- @+ ^  m    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
6 b: F% X$ S7 _2 n  b9 |    mcasp->regs->PFUNC      = 0;          // All MCASPs3 \! F, o2 O: r7 c5 s8 ^+ B
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1* T6 t/ c4 Y2 `3 s9 ^

) P& m& k+ X' h3 a    mcasp->regs->DITCTL     = 0x00000000; // Not used
) J% h1 C7 u! A1 c    mcasp->regs->DLBCTL     = 0x00000000; // Not used
/ X0 X, F* A. k( U5 F    mcasp->regs->AMUTE      = 0x00000000; // Not used
( n3 n8 v  Y3 \- p0 i
+ X, G# e, E8 Q( z* c- b4 J/* Starting sections of the McASP*/0 x+ }- U6 J3 U8 B: Q5 K0 d
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
( V6 X' [/ C9 M3 Q0 `    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
0 D7 I$ c% ^+ w- J    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; : s8 I5 C3 f! U
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );% Q, ^7 b! g" M( G

- ]6 I. n: e- y0 \% ^0 `& R    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
. X) X3 S5 s2 S    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );8 \; ^+ U" l) }- \: w4 u
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 2 X4 O5 l6 |+ E/ j
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );2 d* z* i6 Z# }7 |" l. Z2 t& g* q2 a

# |3 b) O3 X! I, l! N; ?) Z  `    mcasp->regs->XSTAT = 0x0000ffff; 9 [/ e( W/ y, U4 _. L
    mcasp->regs->RSTAT = 0x0000ffff; 8 {% \+ x) R9 W) J# T& `( c

1 h9 y' V2 F8 b; t2 |9 Z5 w    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;0 @9 B1 ^3 f: Y! |2 E/ p
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );- k; b1 ?5 j7 d- t2 b9 [
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 9 K; S. _$ a+ B# l# k2 ?/ J
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
0 b+ |* g$ ~/ w+ ]# y, ~( C% n( E6 ]! \
    /* Write a 0, so that no underrun occurs after releasing the state machine */
' b- W" x' @  J7 P& M0 x1 I    mcasp->regs->XBUF5 = 0;7 W/ F$ z: x; o3 x
    mcasp->regs->RBUF0 = 0;
  V: c3 F3 l: J3 S0 P% X- O+ N
, ]0 H6 D! ^/ \" ^0 k4 s0 l    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
+ {* P4 {0 E+ K* h* E/ a0 z0 I    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
0 E1 i' v  ?2 o: j. R    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
9 i% R5 m7 @# l5 |8 X1 f. Q& N    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
4 |* T( J1 i  Y# x1 |( T
- ]6 Y4 t. U% D    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 6 `. j' e$ p# G  A7 |9 ^. ^" Y' g
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );3 s$ F5 Y5 s* d! i; E; `" ~
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
2 u4 ]) J, V& Z# v" P  ^- a    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );. I6 g8 l$ I! o# E* o- t

, v  d% _' n) U# f    CSR = 0x0000;
+ x+ x" _' ]- b: g    INTC_INTMUX1 = 0x3d;. l8 y) ~3 K* {$ X
    ISTP = (unsigned int)vectors;* n5 K. ?: v6 B! p/ H
    ICR = 0xFFF0;  
; L4 K( [1 P5 R8 n8 x8 K/ s    IER |= 0x12;  4 `; {/ B3 O! L( L
    CSR |= 0x01;  
( o, X; x3 X" p: w3 a
0 X( S4 l( U. e+ m, M2 X( Z6 p  b4 L) F1 V" B6 m9 C1 {4 `
3 Q4 b1 E3 v5 K) U0 w% ^# Z. C
还有就是两个输入输出函数:
3 G9 B; N  }9 v) xvoid output_sample(Int32 out_data)% A+ e' _) V/ l% I
{3 ^. L  u4 v: Z
  AIC31_data.uint = out_data;  
6 D4 @4 v3 ~2 Y6 \- N2 q( ~9 g- ^  MCASP1_XBUF5_32BIT = AIC31_data.uint;
( M; y  }. x8 {1 Y% ^- z}. J: K% s$ z* l! g+ U, q
; E. N7 X. ^$ T$ R) S: }
Int32 input_sample(void)
4 E6 F8 _" M% ]0 y8 ~$ j{  & z# F# B; J( K- P( _' f- t$ Y
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
' o* @* z7 _  {3 s8 i  return (AIC31_data.uint);
7 T% [9 P1 W' [}
+ K. Y' m. _, y) j' n% g5 ]; G( w: T/ ~! P

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




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