嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:" l, G) l% j, I
main文件:2 m. Q' ?$ b( ]5 a' c
interrupt void interrupt4(void)  8 g" Y# y0 h6 ~; l& x) O9 l0 U' Y
{
: l6 d9 y0 ]6 F: Y  Uint32 sample;  [8 [5 j! H" P! n( U2 Q! j7 J1 f( o

7 T3 }) }4 b( o: d% V  sample = input_sample(); // read L + R samples from ADC+ n6 L1 w5 U, F' d
  output_sample(sample);   // write L + R samples to DAC $ u! ]7 F7 o% g) n+ C0 N, k/ s1 k
  return;
  x; Y0 S* w& y! D. u7 Y}
" y& c% E  \  `! L- B- A! {! C3 k3 Y+ U- H8 [( V
int main( void ). S* ]0 y! Q' x% D' G# [8 f+ r
{
9 q/ @, `( C) @( D& E% N% ?, I6 a& Q0 X
    /* Initialize BSL */5 B- Z# p8 d5 S5 g6 T
    EVMC6747_init( );* a$ C) V! w3 l. ]! i% X, K
        /* Call evmc6747_intr function */* i& U6 a0 _2 f
    aic3106_init( );
0 q' V7 l; ]( O        while(1);  A; r4 z- j5 z+ W* f8 r
}& e- E  v. R3 K8 n$ R
" _9 [0 m8 n! ?% V
1 `7 J. Q+ x" R3 y# [, H4 E
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
; L7 @; K$ i4 x. F/* Initialize MCASP1 */
0 Y3 m$ T& k- b- b    mcasp = &MCASP_MODULE_1;; ^' G! q4 o/ @" {' B
    mcasp->regs->GBLCTL  = 0;       // Reset+ W; @7 B6 M- k: J- }  w
    mcasp->regs->RGBLCTL = 0;       // Reset RX9 E6 M! \2 k& p9 D4 ]$ p
    mcasp->regs->XGBLCTL = 0;       // Reset TX
% x. \9 `  z5 u; w    mcasp->regs->PWRDEMU = 1;       // Free-running
8 ]9 r) v: L" Y5 @  S" z   // configure McASP0 receive registers
% {% y: Z0 }! A/ t- Q    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used1 V+ u: k0 N* \$ A  c
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
  N0 J! ]) S: B+ |+ o4 ^( Q    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
7 m9 I) R  Y- a/ x/ {    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
0 x( q/ V+ T& I: _1 h  _' [    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
7 G8 B$ j: T5 Y- y    mcasp->regs->RTDM       = 0x00000003; // Slots 0,10 B' K. u6 ~. S3 \5 J1 V
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
8 |8 `% f1 ~: R. z    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2568 t2 c0 ]. g, c9 x* P: H

$ `. g9 n: ]  x' ]    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used3 C# ^0 |& I; s! c
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus1 \5 [8 Q. C9 q- W. o& e# Q
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
+ Y( j6 @2 Z# X; j0 [) Q/ a    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
2 y4 t7 S2 p, H$ I    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
; l" }5 A" c1 }+ d    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
, g/ `  ]# K% _1 @0 f& w9 F    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
  c5 z! l. ?7 b4 Z0 K    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 T9 M! i0 {6 N- r! l* a  t! H7 {9 z, g  ^5 J
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
& Q5 d% ^5 p* q3 x  k    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
2 K& Z; B3 b5 s% E    mcasp->regs->PFUNC      = 0;          // All MCASPs3 l0 y- e7 m8 `( a1 w
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
/ z7 ~- E, b; H# T, b+ \6 b3 p5 V  }/ Y2 j7 f2 M* T
    mcasp->regs->DITCTL     = 0x00000000; // Not used; _( v% T& p7 c; n% J9 \
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
7 K( {8 _" M# F9 K4 K" G    mcasp->regs->AMUTE      = 0x00000000; // Not used1 J; D, z1 D+ z/ k: }% T9 ]

2 t# G: S) t1 ~1 u/* Starting sections of the McASP*/
6 V) P' `$ I% R5 _8 t' T    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; . {- w' {  R! U3 B' I+ s  @* P9 n' z
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
0 v$ |5 e5 `; m+ o. _7 a! \& o- ]4 |5 q    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; $ l7 `, x- P4 x% |! p1 m/ u
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
# k5 B0 x3 S. Q5 d
4 w; U* w; {2 n- o( s    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ' y7 F. j/ U) @6 F6 W, K' m3 M
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );4 l$ D4 R2 L7 c
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
2 K! T5 e- W: f+ @% G3 m$ S    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
) a" q. j9 j0 {. T( k( w. b0 c9 T2 b0 `, _
    mcasp->regs->XSTAT = 0x0000ffff;
2 }' M7 \9 _. R, I, z5 c' V    mcasp->regs->RSTAT = 0x0000ffff; * P7 y$ U- K8 ?+ h* i0 Z

7 Z) a  b' K& t; u1 t7 E    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;6 S9 z( [$ A) V4 Q7 }( i& b
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );( `9 {; n, |* D8 h' ?9 H" I7 P
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; * ]5 y, {) P- N1 ]
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
7 `$ o3 I; t( u$ Z
* J; h: ]. e" ^  ^5 J! P    /* Write a 0, so that no underrun occurs after releasing the state machine */
  [" v/ ?, I0 x& g3 g    mcasp->regs->XBUF5 = 0;
$ |  k4 i& q7 m* x    mcasp->regs->RBUF0 = 0;
- z1 A& z! |1 m: l6 E1 d
% u  K2 J* v/ W% {+ ]    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; " t  B! n) D; m% n  ^6 \
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
$ s' f% _) B2 w! J( Q    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
3 f2 t6 M7 u1 R& `2 [* N    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
' s" C- m" {: @$ O0 I. }, S
0 ^4 C5 P4 W+ }. R9 y$ i5 K2 T    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 6 g, o' ~% l# f2 n) G
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
  r; a) ^8 G6 |! R6 l  Y    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; * Q) d8 Y+ J' Y0 `6 o. x
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
5 g4 M% ~( g7 u3 R5 l0 `7 d) U0 ^- x* _5 Y" m# a: `
    CSR = 0x0000;& _+ U1 Y* ]3 H# K/ D4 ?: |# T
    INTC_INTMUX1 = 0x3d;
# n+ P! l' v( E6 ]; B, ]. Y    ISTP = (unsigned int)vectors;. e' k; w) q& x+ |
    ICR = 0xFFF0;  / k- j2 F0 ^$ p" u) i1 ~: p8 v' M
    IER |= 0x12;  
8 e, j* v5 k- A4 S; X+ E    CSR |= 0x01;  
2 K( a$ ^# a0 s+ B5 E
' \1 f/ W8 v' ^2 G* n/ x0 m7 I2 f  L) f- z( G3 `2 N

) k5 I! M5 y8 T( Q+ j  u. l, ~还有就是两个输入输出函数:7 p5 d7 z, m$ g2 M
void output_sample(Int32 out_data)
9 ]2 R" K; q& S{
2 W& X4 T' G( _8 m: x  AIC31_data.uint = out_data;  7 }1 k; F. x$ |" u/ {. P- `
  MCASP1_XBUF5_32BIT = AIC31_data.uint;3 G( t* l0 s- I3 |3 B
}
1 W3 N6 r7 _" }9 H1 P. G
" R  f6 \2 H& ?Int32 input_sample(void)1 G& c, n: [) ?) E# c
{  
) U5 A% c  E9 H* J. d" r* }  AIC31_data.uint = MCASP1_RBUF0_32BIT;  ~& e* V. L+ B0 c$ m# l
  return (AIC31_data.uint);  c: V+ q) s  d7 P1 Y1 b/ `3 K
}) d# v& v1 q3 H7 i; h; x
) p& `8 S6 a  T5 m+ n

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




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