嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
9 E) Q6 R, J/ ]0 `main文件:
6 c# `# B" J% Y% X' U0 dinterrupt void interrupt4(void)  9 f; c( n" r, @8 q  @# B
{3 _; A1 O  [! q8 ^* {
  Uint32 sample;# h, h  Z8 @- H( k

0 I% D* L: F6 J4 Q8 Z9 k& X  sample = input_sample(); // read L + R samples from ADC" \8 |6 {2 v8 {7 i
  output_sample(sample);   // write L + R samples to DAC
' y$ ?' y: P; c. v  return;0 t. S5 b/ `4 ^% \; b- q$ [
}2 n, M! k( a4 c( R( f7 ~

1 c  U& g8 I  V; |( c# Y. Fint main( void )
8 _2 e$ j, R: l9 K{9 t( q# l0 j1 [

6 U/ M  R$ o2 F( x6 v    /* Initialize BSL */
$ w. L9 a' k# p8 ]3 r/ d' G1 }3 B    EVMC6747_init( );: G& g; P+ u; _, U) E# \$ V7 R
        /* Call evmc6747_intr function */: Z1 G: x4 P. u+ A: R
    aic3106_init( );+ ?3 t, M9 M3 R$ F
        while(1);. T; z) @7 K# W5 t7 C$ q
}
  b' g. F0 B" g% s3 y3 U% w9 U1 k
' U% _+ m, d0 A/ J1 M$ h. ~. z/ ]5 {/ W+ C. e" m( F
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题& @4 N5 y2 s' |4 {1 s5 s: ]3 k' W
/* Initialize MCASP1 */+ g+ f5 w$ H% w# P
    mcasp = &MCASP_MODULE_1;
1 I, G2 [! r; L5 s    mcasp->regs->GBLCTL  = 0;       // Reset
  J: `2 o2 H/ b* b  F* a/ q/ \7 ^    mcasp->regs->RGBLCTL = 0;       // Reset RX# e! o' j: q3 _. K3 K, D
    mcasp->regs->XGBLCTL = 0;       // Reset TX8 r7 W/ \6 T' M6 m2 L8 u
    mcasp->regs->PWRDEMU = 1;       // Free-running; Q) {) \* G) |: R
   // configure McASP0 receive registers' i4 C& P! @0 F, J
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used" v$ I0 U3 [4 Y, \2 ^# f6 X3 x
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus$ x/ j- Y* {0 d) o1 x- G# v: ?
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
0 Q9 G4 ]( `/ A! N/ E    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side); W9 p$ C/ V! _
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)2 n% k" d3 u' U1 T6 t/ t2 J: L
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1& Q5 Q0 t! b0 H9 \
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
- [8 I3 L" B6 }: z. y: B  H    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2568 ~- X1 l5 N5 m# l# {$ t  ]4 f; m6 X

& m, D' L. b2 s, ]3 `) a    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used6 \5 L' B/ a$ N1 w7 ?
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 T7 I. X) v; U+ T/ L- c    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
2 P1 \1 n% h& s* a0 L4 b6 S1 j    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
9 i" Y( E- z/ q8 H! M8 P    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK7 D9 N0 D  X& g: [+ ?7 |- ^  Z
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
" O2 E6 Q* L6 b    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
# \' j& c' o  O  [7 f0 W) ?3 t! T. _    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. W' e8 J  U3 m& i$ L: j6 m' k4 r  R; h$ L; ]$ R
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
; @7 U& t* B5 k+ C' P  y    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT* R. @! _: R; _; B: G
    mcasp->regs->PFUNC      = 0;          // All MCASPs
+ |7 |, h1 F% H6 u' t6 m2 H    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
4 `& F8 l, s, J3 ~5 |  P& _' X; G, Y" v" c
    mcasp->regs->DITCTL     = 0x00000000; // Not used' h& L+ ~3 p  W( G2 q6 n- e$ A: Y
    mcasp->regs->DLBCTL     = 0x00000000; // Not used0 l& H: H, x6 m9 u( D9 @
    mcasp->regs->AMUTE      = 0x00000000; // Not used  Y% u9 {: w" q5 e3 m+ Z1 ~

% v$ i! z8 s# q1 l1 K6 e3 D* k/* Starting sections of the McASP*// a- B$ O/ a$ T1 i
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
# @6 E" M0 w1 y3 U3 c+ y9 n    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  ' k: e1 W; m0 B
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ) F( V5 t; ]" c3 X
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );+ @' m1 B, ^  a, R
" {# g' _0 I7 m$ N8 d
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;   d+ b2 E8 u& S: P
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
2 h# {1 m. M3 o4 }    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
+ ~3 `- C8 u4 R3 F. _3 g, M    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
& B! T9 z3 {6 l( a% T8 d4 A, B
) V% Y# ^  C" i. e0 v    mcasp->regs->XSTAT = 0x0000ffff; . `3 r# U" c; l8 x
    mcasp->regs->RSTAT = 0x0000ffff;
2 x9 z( L( }. O+ s2 s2 U, }# m, d* k* J8 ^9 q
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;; v) H0 O/ f4 }* h* h' b
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
' E9 C' K% `" |0 c0 C    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
1 {5 {5 x$ ~4 Z    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );6 [( _3 Z/ p2 A/ M! ~6 [
7 \' f  x! K4 }/ \3 E: W0 Z
    /* Write a 0, so that no underrun occurs after releasing the state machine */. J1 m; @; k$ E* o( i: J
    mcasp->regs->XBUF5 = 0;
0 b9 j8 w2 V1 K+ F! d    mcasp->regs->RBUF0 = 0;! R; k- I2 V' p, P7 f8 X" |
+ h$ c/ m/ @4 \: F' Y% C
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
, B* V* B7 P2 Z# J. L4 |$ j    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
* Q9 I/ {2 |! g    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 9 R' P$ ^- U$ V" z- w) G8 I
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );9 C* u5 y, _2 Y( p

) H* D& l0 g/ \4 I, [* Y6 d2 x- J    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
: f; I2 C2 U2 L' y* r( Z- ^. D2 U% Y" Y- n    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
4 @" P# H( |7 E0 s8 I! D3 F    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
6 ~5 r% p. Z: O5 ]4 [    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
! V4 h' T! q: u3 C' o2 ]. Y" S. J7 S, j: F/ S+ ~
    CSR = 0x0000;! z, Z8 S6 H* d
    INTC_INTMUX1 = 0x3d;
! q4 V- D+ [! q. `+ Z8 G$ y    ISTP = (unsigned int)vectors;3 S3 F$ ]. W( K  w
    ICR = 0xFFF0;  
; K) k/ X+ D* v8 ^; s4 W& K& z    IER |= 0x12;  9 N3 O9 K. C7 f2 @+ [
    CSR |= 0x01;  1 E; ^/ v7 v6 `5 P

' y; O5 D! t4 ?' |  M* w8 w. O( B# b
$ y( W# D/ |. C0 g
" Q/ S6 N8 D) e& k) Z/ E# A还有就是两个输入输出函数:
- D* _0 \9 {6 k  X! Cvoid output_sample(Int32 out_data)
4 S' R! A5 E8 k8 v{
3 ^7 T$ Y, M4 t" z" p+ y) N  AIC31_data.uint = out_data;  
0 C: h  y4 S  V  MCASP1_XBUF5_32BIT = AIC31_data.uint;9 h# l+ j: ]  K9 Z& Q  n2 T
}+ A7 J- j, o( x$ P9 U% a3 m

: D2 J! v7 D! D& \. NInt32 input_sample(void)
& N- o, x; Q. y4 h7 F{  
9 G' D5 a9 S8 g  AIC31_data.uint = MCASP1_RBUF0_32BIT;
' Z) @5 R4 x6 J9 l% r; S  return (AIC31_data.uint);
! }. I- s4 L5 u* s. n1 K1 V}
1 A$ r# g" p& U# R
9 H0 p# F# R+ d$ Q; _9 J
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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