嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
* r+ e/ }* H. s  m9 |main文件:& v" D$ e1 Z% s) g& p
interrupt void interrupt4(void)  # y& }7 _0 @. V
{
( Z% ~& a8 N7 [3 M4 d  Uint32 sample;, E+ E( v/ }2 i: @( q% u
4 ?& o6 b+ M4 X4 z3 N) L2 T
  sample = input_sample(); // read L + R samples from ADC7 R% H* F! E3 q7 T+ l4 Y1 v6 X$ Y
  output_sample(sample);   // write L + R samples to DAC ' A% Y  ?  g6 Z5 k
  return;
4 t' [  u1 u5 q. i0 U}
# h, D: n3 o5 z6 h0 c  g
7 G; w- y" {# E) r7 Y/ F- yint main( void )
1 L3 f0 {" p, k2 g8 m/ h{% N, e! o, t( w+ O0 i! b

7 J4 [5 E; L0 ~# M6 R+ S* e, Q8 A    /* Initialize BSL */1 ~+ h5 j$ x% u, u* q
    EVMC6747_init( );1 o3 W" ]7 C! z
        /* Call evmc6747_intr function */! ^. d' [9 P  g- q6 `5 i3 [
    aic3106_init( );
  k3 r5 b4 I) k        while(1);
9 }+ o, q' I' g) a0 H7 ~$ l7 d}" O( k$ l: r" ^& w. Q
, ^  ~! u% p2 P+ _0 {- H# b. ]
) _0 H) G+ O5 B
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题2 {. e6 Q( z0 h8 t
/* Initialize MCASP1 */4 U6 X: W0 F( D7 _6 m
    mcasp = &MCASP_MODULE_1;, f4 v: m" Y1 g; e8 x/ j1 v' O
    mcasp->regs->GBLCTL  = 0;       // Reset
9 a3 O# D3 l8 F- P: Z8 H    mcasp->regs->RGBLCTL = 0;       // Reset RX; _) |0 C' b. O* `( M# T
    mcasp->regs->XGBLCTL = 0;       // Reset TX
0 N( |5 m+ ]. b, c9 A. y* G    mcasp->regs->PWRDEMU = 1;       // Free-running
/ l( ^' q4 s7 [! b  Q   // configure McASP0 receive registers7 c! S* D' J1 Y6 D% W* h+ s2 t
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used* K: c  `! Q7 ~1 j
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
$ |$ Q6 V0 z, W    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
1 D% O- K6 L$ `3 V0 U    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)9 a# s1 l, N9 m9 c5 a1 b
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
( o! _- f* w8 G2 o    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
9 e# y) v- K/ x- [  M9 n* C    mcasp->regs->RINTCTL    = 0x00000000; // Not used$ q, k! _/ e" r' f+ t# ]9 }' J
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256: D/ b& |+ Z+ f

9 }5 C! n" U; L    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
! {- Y$ t* M3 F" Y    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus& \$ J( P5 h4 Q  _5 |% O- {( E! |
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word" M* H5 l* M% X+ R
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
/ d7 w6 R' m. k& f* Z( i; J( V    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK( H0 F0 H5 \, u4 v' a* d+ W
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1( }+ s6 [$ o& E
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit- S" |# `3 o2 w# Y7 {& u
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256/ U! T" x' {2 b: R# z

1 J/ f# v4 `4 C2 S) C' A: R9 a    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN" k- v* g4 V3 [; F1 l
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
  W0 W1 K2 b( ~    mcasp->regs->PFUNC      = 0;          // All MCASPs1 l; u8 r0 W* y7 N) P
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1& s/ }- r7 J7 L& t0 a: R

- u; I; Z: W. C8 C    mcasp->regs->DITCTL     = 0x00000000; // Not used. |$ \, |, N7 N8 s
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
1 V% {- H# H9 o) m. R    mcasp->regs->AMUTE      = 0x00000000; // Not used
% i7 `& ]' Y  b$ w
5 @$ d8 S3 }" R: i) Q# @' I! |/* Starting sections of the McASP*/
4 b/ G8 T1 B0 D: H" z    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
$ X# p. A& U  C; @# o1 J/ c. ?    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
1 @1 j1 ]* A) R0 I    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
) O/ P0 @' g4 Y- U, n9 p$ R# |    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );) B2 Q+ U/ R" N
+ f7 q: G1 D: E, M0 `5 E% S5 x
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
( Y8 L9 V0 K0 l/ J, f; j    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );. Q' [  q# q9 G* Z5 b  K
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ( G6 f: A: b8 ^5 {" C* G1 x" H
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
; O$ H  ]6 h8 r8 N, F4 C
3 @( T# Q. W. W; H" q    mcasp->regs->XSTAT = 0x0000ffff;
2 `* p% A0 ?4 M' O    mcasp->regs->RSTAT = 0x0000ffff; ! S/ J+ p0 B5 \: Z+ f) F

# g& m6 n. _" G8 r- B+ |    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
& G2 K! l4 c0 ]2 t. |* h    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );6 G, y: w% e" L9 `: ]
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
2 |! D/ Y0 b+ T* T    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );# t; p& N7 W( P2 Q2 e1 E
/ E: ?" E$ j/ x9 _5 W1 w; l" a
    /* Write a 0, so that no underrun occurs after releasing the state machine *// c+ E+ J* q  u5 X: x0 n7 J1 c8 M% f
    mcasp->regs->XBUF5 = 0;* E7 m  G7 q' N3 x
    mcasp->regs->RBUF0 = 0;" ^1 J& |; o7 J/ |" y; n
+ z4 d( H9 a  |+ ~( M
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
, K3 y( D, {3 _- _& j    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
# M' T. H. N6 j# B    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
5 O) P& Z/ L, S% s0 e& c( L4 y    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
4 y# O! C' {1 b* a/ |5 d( U( D& o5 A, Z! S
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 1 J% B0 @4 ~# c* x0 A
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );- N' g" s  g4 G5 Y  |/ ^3 V' u
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ( W( o1 y+ [8 |3 s1 H$ d
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
. S, c+ A4 i% ~2 ?$ g
2 U% E" O* \6 M8 S' w3 T    CSR = 0x0000;" l. D* m- u& ~
    INTC_INTMUX1 = 0x3d;
6 t9 l/ z# {! A6 v4 V    ISTP = (unsigned int)vectors;
8 Q4 f# X: E$ Z5 y' v, F" y  Z6 s( G    ICR = 0xFFF0;  * r- _( i% k+ U; l) s
    IER |= 0x12;  
1 [2 C/ ~/ i7 `/ ^+ p5 k8 D5 O    CSR |= 0x01;  
& t* K& g6 [6 E) z% m% u4 k/ v2 f+ N0 @1 \

+ H2 f+ z5 T" D! L# C8 m: m- k. l. o5 E$ f; E
还有就是两个输入输出函数:" e  {6 g* A9 y  T# F: K
void output_sample(Int32 out_data), f- m4 ~/ f# K- N& l
{% I% c' [9 y3 [) l* Y3 Y/ [. \
  AIC31_data.uint = out_data;  
+ f4 f, T9 ]! a0 }3 S  MCASP1_XBUF5_32BIT = AIC31_data.uint;
. _/ M5 z6 s% t. O5 z7 O) ]}' h0 E8 }( c1 ?! S
) D3 ~, t. G: Q" _
Int32 input_sample(void); W2 Z0 r3 d2 E$ m
{  
) R  b$ Y5 S4 x' d  y8 X  AIC31_data.uint = MCASP1_RBUF0_32BIT;' P& X! w" R7 C
  return (AIC31_data.uint);
6 d8 W6 R; K: ^4 x4 x' L}4 S, R7 K, O5 b/ K
6 N& R$ Z. v8 c8 ~9 S5 n

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




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