嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:$ l- q. p3 @4 N* T  j, }6 h# T
main文件:
: O0 {% d* c( h  R) yinterrupt void interrupt4(void)  
# M" p7 b. Z6 v* G8 L{( C( S1 C' r9 e& t+ d0 j0 P' ?
  Uint32 sample;
% ^" x2 f2 d/ G" s7 h
1 y# G9 T4 e3 [- ~; D+ X, ?  sample = input_sample(); // read L + R samples from ADC- A* Q/ O$ _6 ~; A7 K
  output_sample(sample);   // write L + R samples to DAC # d( \( B8 x+ ?9 l: h. S, x
  return;
) g; t' [1 i; k1 V. i0 H' `}
  R+ Y: E! \" Q4 F& d1 v8 y( x, o5 N, ^0 c0 E& I1 z1 B
int main( void ); N0 ^. }% n, |7 C; M; u& }
{) p( ~& \1 Y' C. X# y' ~. b) B

) E9 p) G! i- g) q( Y0 C$ p    /* Initialize BSL */
. R& e# I: x" A) W0 f' d# H( o$ G    EVMC6747_init( );
. y# K  m& b1 w; X( v        /* Call evmc6747_intr function */6 |+ C3 l2 D  C$ G  P
    aic3106_init( );
+ m: I" X0 d0 s' S$ M$ U# D0 ]3 Z" J        while(1);4 h2 M3 X' l1 V% u, T$ x+ \
}
' I* x3 Y5 r3 [) B' _# C
  C9 E* {2 Z0 J0 U2 b$ f$ v) @  P, x  z4 s, u! m
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
9 `$ F$ b  s  u1 P/* Initialize MCASP1 */
3 G6 f7 Y0 \3 h5 B2 |! b9 R7 N& J& B    mcasp = &MCASP_MODULE_1;
3 ^# r* E8 S- I& a    mcasp->regs->GBLCTL  = 0;       // Reset
  ]* e7 l8 o" W1 c% T, i6 k; ^' ?    mcasp->regs->RGBLCTL = 0;       // Reset RX
8 j' B6 P" s4 e# d1 b    mcasp->regs->XGBLCTL = 0;       // Reset TX' L7 f- h. m- [' o& J5 B
    mcasp->regs->PWRDEMU = 1;       // Free-running
4 Q/ N4 u; z5 f6 f3 v; F   // configure McASP0 receive registers
0 _: D+ ^* p9 A2 E% k& y    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used5 w5 d; l! B/ O+ ]
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus5 N: f3 ^- S$ K) P7 t8 L2 E
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word8 X5 K  E! \( N) |
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
0 ~' t) q  K! t9 Q    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side), N. B& Q7 n2 Y7 B
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
1 }& ?  y5 G2 ^9 r    mcasp->regs->RINTCTL    = 0x00000000; // Not used" }! q+ K* ~2 u( \* K
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 r3 U# r" b% j
* J$ D: P' }4 y* E2 T" l; o    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
( `" u! c$ d# ~& j    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 v. f' e. |) h' E# E7 {    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
" l" _  a2 @0 G- t    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
4 W2 J" e, q, d1 t' B5 [: t: `    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
+ V2 n- U- N* x, o0 L2 l    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
6 R; l/ `! v- s  n    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
9 j2 x6 A$ Z9 u    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
) W) G8 O: S) Q+ g0 S& t8 K; n. \
9 [4 `. q$ `: a2 ?7 ~% N    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
: R7 F; v& i9 C% S  c; K% z$ @    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
$ G% g2 R" L" q  I, M% |7 O2 C    mcasp->regs->PFUNC      = 0;          // All MCASPs0 f& _* h, c( e7 N
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1* A, \7 ~/ c% w! W
# m& b4 {8 z% w% U8 s/ W
    mcasp->regs->DITCTL     = 0x00000000; // Not used
3 d; x% @# Q! Q1 |7 O! R1 z    mcasp->regs->DLBCTL     = 0x00000000; // Not used
1 p  I5 H2 _. R    mcasp->regs->AMUTE      = 0x00000000; // Not used
* ~  b. A# [& v, T5 ?9 K5 U! Q% a" X3 L' Q& o/ W5 {
/* Starting sections of the McASP*/4 R' l  a$ {6 P0 Z) e  `
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; % l' B  D' ?( w3 p
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  % H% Z+ K7 M) G& v
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
$ f) C4 W6 A5 e4 m    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
( @# x0 l/ _+ {& w1 O$ y: f7 C" D# S, v* L
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 4 x9 D% v. O4 j; `! p
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
% z/ E+ a& k$ I8 W    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 4 Q7 b0 B4 r/ M
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
! ], J# k4 }4 w0 q+ q. J; z
' P) {6 a0 _: ^+ S  g    mcasp->regs->XSTAT = 0x0000ffff;
' X* B5 k' H/ z    mcasp->regs->RSTAT = 0x0000ffff;
/ V* c8 ^5 _/ H- [# C& k
, l' [' L, R1 a    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
9 y+ y3 x1 ^% c3 z+ l    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
7 {# V) Y$ r+ |    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
/ x1 z; h  [  E    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
1 s( j: c9 d' Q% s& A+ ]* I& N2 y0 o/ l' P( I
    /* Write a 0, so that no underrun occurs after releasing the state machine */, `3 ]7 u6 A0 c* G
    mcasp->regs->XBUF5 = 0;: s$ w/ u, a! F, W7 V+ P
    mcasp->regs->RBUF0 = 0;. _! r: T  U& Q" g

9 i% `! h! ]" ]& u: t" p    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
" Z8 Q" N0 j5 {3 X8 o    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
' a% h* Z3 L) P+ X$ d    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ; O3 G! R5 C" D2 i( E& K* K$ B1 N
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
* ~1 Q) R+ R( O
) z/ F; B$ O) h: ?% q0 H    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 2 n; B5 c0 m# ?. Z" ^/ l: X9 B; g
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );7 a7 d) C3 O" N
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
( q' `" }9 C# c5 r/ A% B5 A5 V    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
7 J- D8 n: Z9 n- \4 f. ^7 }% Q& l0 W% r6 g
    CSR = 0x0000;9 F0 X6 N1 T: {. `
    INTC_INTMUX1 = 0x3d;: f+ s; I3 R3 Z8 Y4 G
    ISTP = (unsigned int)vectors;  ~; B% D' i3 u, I4 F6 w
    ICR = 0xFFF0;  
( m8 l2 m: r5 J; C    IER |= 0x12;  
+ `- O" V* o& d! g: l    CSR |= 0x01;    h. b2 L. `" R' \- d

/ C* ~/ g  P- K' `0 t9 |
/ H+ {" r$ o$ _' K4 R# }( `* ?  I- `9 l7 a5 ^
还有就是两个输入输出函数:
" y) [- @3 k. K. s# S7 C/ t/ Kvoid output_sample(Int32 out_data)' P9 y& H2 d$ H; o
{, Z" b. K; D, N/ K
  AIC31_data.uint = out_data;  
- \4 X0 D9 m6 E  MCASP1_XBUF5_32BIT = AIC31_data.uint;2 v0 I4 `. K! L/ ~
}
: m" D" L1 o8 S- {* o7 a1 c  Q1 ^3 F1 k8 ^& `' i' Y' b
Int32 input_sample(void)
7 y: Z8 X4 G3 x. h{  3 N; @. r+ p7 t
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
0 `- x& H$ [- O' J) h  return (AIC31_data.uint);
; |1 l  \; X: u" g* ?% `}, Q, {. X0 A3 O8 R' S+ @& i" H1 v

" u; |9 C6 Q& }# U. H, L
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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