嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:5 _" Z$ t9 V/ T- o' t7 R
main文件:
; ?" ]7 u0 V# c; E, F3 [0 Vinterrupt void interrupt4(void)  
4 ?" e3 b( b8 f6 b{6 f: `+ k, s+ q" F+ N
  Uint32 sample;8 V) M# u( v( p/ z0 C
5 W% ]( X3 }; t) J% I+ ]! p! a/ F- ?
  sample = input_sample(); // read L + R samples from ADC! P+ G& \2 p) X  R3 g
  output_sample(sample);   // write L + R samples to DAC
1 I8 C4 V* K, B" b  return;
# j8 e  Z; u, ]# V/ d) x& H3 U}
; |  a) h3 E3 x8 D# G" l7 R+ @) J2 u$ ^
int main( void )
3 k6 |. ?5 n6 D: }! W7 U, P{
5 D; f6 `* V4 N8 c+ A2 ^
' Y. z, s4 H8 s, K; F    /* Initialize BSL */
3 E1 G+ ?% d* ]    EVMC6747_init( );
9 g9 x# S5 ?9 {8 z" ^* z5 b) a        /* Call evmc6747_intr function */5 J/ k8 l- S% k$ D: v( |
    aic3106_init( );0 J* R; _' m( L' Z* i% I: o3 `9 Q
        while(1);
4 Q* b  R/ R0 P3 e: }  v}. z, E& G5 c1 H4 }7 P; c5 E

0 a( o( a2 T8 L  O+ v. ]/ D' R0 @. A4 M
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
; A  N, U& p. j7 Y/* Initialize MCASP1 */7 S5 A8 l2 N- D" c
    mcasp = &MCASP_MODULE_1;) ]5 b0 ~/ {4 m2 r
    mcasp->regs->GBLCTL  = 0;       // Reset
9 @1 l( q5 v- ^    mcasp->regs->RGBLCTL = 0;       // Reset RX
6 N+ M. L. }& ?& Z  ?+ B6 z1 ~0 v    mcasp->regs->XGBLCTL = 0;       // Reset TX8 I2 X# l8 c$ y7 \' P
    mcasp->regs->PWRDEMU = 1;       // Free-running
# C" J0 T9 e7 E% h* }' N   // configure McASP0 receive registers( I) u2 T: y0 o+ `% n5 W4 r3 x
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used. E4 L' w2 D3 [- x; Q" f
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus- o  u/ u; s; X+ J0 N, D' }/ c
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
2 E, i. ^- X% V# T    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
) c' [0 X; A* v3 L3 _    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)# e# u, J* q1 N0 }/ l) M4 F
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
! `& o. T2 _( C7 O7 h4 y$ j, s' s& _    mcasp->regs->RINTCTL    = 0x00000000; // Not used( [# D5 H) Z) e
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256" n+ X; f+ X9 j: T' |
* D3 {  @. L3 g6 B
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used& M( [) }- R& p% @  v" s8 R5 c4 w2 `
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ }# H! k# i% p    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word+ Q( f1 m# I8 I6 C- d; e! Q) F1 l
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16& U& O* b# _$ |  f9 W! y
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
3 U( V8 R5 k2 I6 H/ I/ o: U    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
4 [2 X; R" r  e- \0 i! N    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
: x9 ]7 @2 N/ X# Q  v) H    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
; C8 @( {  X" O% p" z. t, d$ c* i( R# d1 y: Z4 B: J2 F
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
# Q- [7 Q* V7 ?( s  w- \0 z    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT, Q8 i8 H5 a$ [0 |- u' V5 E; O0 {
    mcasp->regs->PFUNC      = 0;          // All MCASPs/ y; \- a5 Q+ y+ N* X
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
( K3 y( Z% d; P0 C( H7 o, Q4 l) b# y, Q8 X7 L
    mcasp->regs->DITCTL     = 0x00000000; // Not used: V* \9 W! c- i6 }" a3 {
    mcasp->regs->DLBCTL     = 0x00000000; // Not used+ L; y1 L" T) ^% B1 Q
    mcasp->regs->AMUTE      = 0x00000000; // Not used
# |  p$ ]* @1 B, ?6 q1 D/ ^; U# R" h) i! `( _2 U0 Y1 G' _
/* Starting sections of the McASP*/! w& B: Y+ a/ e, z
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
4 H7 X* Y$ C+ M8 k9 K7 w    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  / l/ @& `  z+ ]7 b
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ) ?6 P- B' x( Z) [4 u5 y
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );2 N3 f3 s% N" f" M

! {/ |8 L6 C. f! {7 I( N0 m  j) r    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
& ^1 X, X7 N' x. `& T+ W- ]    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );$ u4 E/ s' o- j; e. M3 e5 s
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ! L8 x" d% ^, F4 |1 N7 b
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );: @3 x" f3 C' X

4 `; K! I0 `0 d* d  Z0 N' }- v    mcasp->regs->XSTAT = 0x0000ffff;
/ M! v" \+ M$ G$ w) j, B8 u9 e1 M    mcasp->regs->RSTAT = 0x0000ffff;
% Q) i3 j* y4 c9 j" {: Q+ D
6 h/ K0 I: H3 L+ L) c" ]* ?    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;5 K1 ^+ z' s6 r/ D0 R
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );1 N: _) M3 X+ b7 J* F  _
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
1 y5 M6 s; p$ V- M" C    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );- i9 X/ {% x! E5 r0 O& ^. B

( g) I# ?+ S/ }! s2 t: [) g    /* Write a 0, so that no underrun occurs after releasing the state machine */7 Y( O: N8 ~! M* X: f
    mcasp->regs->XBUF5 = 0;
2 G3 P# e4 h$ e4 [) C5 u    mcasp->regs->RBUF0 = 0;1 T0 L9 c  b) `( r6 o

$ h, U% ^$ z/ l! E/ y5 F    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
4 e1 y; D* d1 d0 `, l4 R* R    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );; n* U' x4 @1 ?
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
0 o6 S' ]5 S: B5 a/ M; r( r% }. F& q    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );) v* m4 A+ ]1 E4 j: ~& Z3 ?
4 C1 @% ]) i, e5 }
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
7 q+ i: a, k& O' t$ b. {    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );6 w3 y2 E* X6 J+ G) X( a1 u: h
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
5 [+ C: u5 h' F. z% q& ?    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
9 p8 T" b( \- }1 }1 x' O0 Y' i, r/ D) ^* X6 j# |( z
    CSR = 0x0000;! |0 W/ d2 v" M& S; W
    INTC_INTMUX1 = 0x3d;0 m! e7 R/ g8 I9 z
    ISTP = (unsigned int)vectors;
/ D, m. b1 T: I; ?    ICR = 0xFFF0;  
, d2 C) I( W3 n9 \8 \' y3 X    IER |= 0x12;  
: g2 h) D, d) i9 b2 {5 I" r. `    CSR |= 0x01;  
& k) C* x1 Q1 S! K, r% `/ j
' t: m- r5 Y3 t" e6 F1 `8 i0 q
! Q% @/ \( g- a+ U& d3 Y
- }! X# G" v: @4 {; p0 z还有就是两个输入输出函数:) l* F7 x, o( k2 |% x
void output_sample(Int32 out_data)" G1 A! @8 f- f1 k
{1 J, L" c2 ^( i$ f' @
  AIC31_data.uint = out_data;  
, u3 Q' L) E; M" l- w2 ~6 f  MCASP1_XBUF5_32BIT = AIC31_data.uint;
* Y, q3 @* I. U, Y6 m9 j8 ^}2 j# n  {$ U) y# n- x  \0 }. v+ A
" `, G: S2 i7 ^, o' }8 a( h" [
Int32 input_sample(void)
6 ^. b5 l: j1 m! ]( x6 w& @{  + P2 C7 y6 D9 k4 _' c; f
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
) U9 M* u/ E4 u3 I% h$ r) K  return (AIC31_data.uint);; b' _. n; K2 c) U
}
- K0 q: n" V0 A* i+ y: ~. u' z) v( ]7 f

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




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