嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
8 F! h; z$ u; B$ g9 J1 A8 G* }main文件:7 \9 O8 K! d* }; [+ X0 q
interrupt void interrupt4(void)  
- g% C6 U6 C# G% j{
- v8 f" c' a& V1 x: J2 Z; Q! f) ~  Uint32 sample;3 E! _: K1 z" ^1 G/ v

! X, ?: ~/ @+ b$ m4 k  sample = input_sample(); // read L + R samples from ADC" ^& z5 P$ v) _: m
  output_sample(sample);   // write L + R samples to DAC
/ o; E+ Y, M; M6 r% U# Y2 ~  return;) Q6 i, J3 A# n. q, {' p
}
, J+ a/ r) ]2 t: X" d
, l5 B( v- h9 v" y/ p: b, Y. Cint main( void )+ R' O9 J5 F" e5 k7 }% O/ c
{
2 H; A/ Y+ |$ r% ~: A  q4 G0 x, P- C6 I1 v1 f
    /* Initialize BSL */
3 T! ~2 `3 r; {) W5 ]6 R    EVMC6747_init( );
6 k" a. _: ]0 t9 Q        /* Call evmc6747_intr function */
2 g( Z; s/ m) @0 J1 t7 X) i4 n  J    aic3106_init( );3 c' r2 n& u4 c& n3 c- l. Y
        while(1);
' ?6 j) @5 i: ~- q2 o: s}3 n6 z) ^7 ?* h) `
/ f0 \$ g. ^# u/ k- J' y+ s
" x2 O! e' j; L3 d( t
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题) {7 w( |, Q0 V; {5 x; N
/* Initialize MCASP1 */, W* Y' m" r, K/ U0 {6 k
    mcasp = &MCASP_MODULE_1;1 w1 t7 ]  f1 o8 ?* }. z
    mcasp->regs->GBLCTL  = 0;       // Reset
% d2 a$ i# N* v    mcasp->regs->RGBLCTL = 0;       // Reset RX
* M" s3 ]( A. P. x  J8 ?    mcasp->regs->XGBLCTL = 0;       // Reset TX% S) B3 q1 b+ M0 _/ V# d' `9 x3 p% W
    mcasp->regs->PWRDEMU = 1;       // Free-running
7 l' P. ^5 l5 O  D   // configure McASP0 receive registers
% `. G6 r) P% C9 D+ o    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
/ w' L9 _( q4 ^% D, P' Y5 ]    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus4 i! c' Z  j4 u7 ~* s) f# c2 V
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
. U1 V, w4 a0 f6 k4 v    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)  j! y* y7 k% _: E
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
# }1 o( F/ c9 I, I& {' D8 K    mcasp->regs->RTDM       = 0x00000003; // Slots 0,12 m( n+ A3 U- g  {6 T* A" N
    mcasp->regs->RINTCTL    = 0x00000000; // Not used0 Q! v7 ]' a3 G. o# l, @8 o4 `
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2565 b# S7 a8 n% p2 s" P( \) C* m# f  T
3 E3 h. Y0 T7 D7 m2 e
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
; Y2 O' v1 c8 ?/ c* l    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus6 e" Q8 q- i  T# [$ c/ r
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
% r9 h; C/ d; o6 X7 u6 V. [$ ~    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
; w% p* P- q, D/ G6 o    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK/ K2 q. q! q0 d" o, O+ m) K
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
3 N5 y( l6 w4 ?/ j# _2 d    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
; z, {' m4 N1 b3 o5 \2 T  |    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, x/ d3 M8 }" t: Y
/ g" N' |$ t6 ^0 j1 X8 b- V    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
# Z% S$ ]3 a2 N3 E/ z) j    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
3 s2 I' d" U1 s# t+ s) d" \    mcasp->regs->PFUNC      = 0;          // All MCASPs, z8 ?  p% X2 W5 l# m9 x! y5 r* F" A
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1$ k7 h3 d. D5 c' d3 U, ]

: o. _0 v( |& X    mcasp->regs->DITCTL     = 0x00000000; // Not used
0 [! y- @4 ?! O2 V    mcasp->regs->DLBCTL     = 0x00000000; // Not used
! E7 ?* G' n1 v( t    mcasp->regs->AMUTE      = 0x00000000; // Not used3 I! y1 Q' x6 l- e

" m9 I. k5 a2 M( M- i  x8 V" I' V/* Starting sections of the McASP*/
/ Q+ q& `0 y7 C# B( \" k( Z6 R    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; $ A. a+ \" B4 J1 Q% a3 S$ }+ l
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
6 C7 \4 s6 Y+ [$ {    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; * V' V1 Y8 ?9 ~8 u! B+ a
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );) v5 i1 b. F' O) G& U& A2 \, x" V$ x
% i% s1 G2 ?0 I9 X, g$ s  P
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; - `0 x3 t! ?& E5 H% ~: p
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );& \' O& x- k6 f" D
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
" J! v% P& I! W+ g1 {6 ~    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );9 b3 o, g9 `+ V( Q( m* F! C6 Z
1 b% V1 ?+ \  P: L- n4 d3 [
    mcasp->regs->XSTAT = 0x0000ffff;
9 _, f+ y8 p. _7 q    mcasp->regs->RSTAT = 0x0000ffff; # K0 D1 e8 ]. j2 l1 T( ~
* b! t3 I7 R7 B8 @' \% z. Y- k! _2 g  W! ?6 p
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
. D( H) e0 ?. l$ ~' i6 @9 n    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );/ a, t8 N* W0 `# ]1 q
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; + B# S1 ]+ n5 c& {
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
  i( ^( ~6 @" E8 z# X! p5 P$ q5 z: C# ]3 f2 c" @- T$ o) e
    /* Write a 0, so that no underrun occurs after releasing the state machine */
  o4 \$ g% c1 B    mcasp->regs->XBUF5 = 0;1 k5 S5 R7 m, [7 Y6 V
    mcasp->regs->RBUF0 = 0;
) `4 s+ {6 o& @7 N3 Q( M) g2 {9 O7 O& h& C3 D! [) y
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
% B1 [9 g; ]6 E, f$ i    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );' h( |* g1 ^8 o  E
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
% s& b5 f  g$ Q0 o. t/ @    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
+ N$ E  V0 q7 J% h
2 ~& I2 z1 G- _# U; m9 l$ t    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; : ]1 ^  p: x, R- ^' c- A" W$ t
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
4 ]: h- n4 `8 t    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
$ w) `& `7 B$ x( N5 C9 X: K/ J# ~2 y    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );, W8 Q& z/ E/ T( f

! A9 O% f& q: [$ p. G    CSR = 0x0000;- |3 _) x7 V8 a6 P7 l, P8 Z3 ~
    INTC_INTMUX1 = 0x3d;% s' f0 B: d+ y. n
    ISTP = (unsigned int)vectors;
) M2 _1 T2 e1 ^6 ~1 y* t    ICR = 0xFFF0;  5 g# v# g3 K1 U; H9 E
    IER |= 0x12;  
( b+ F! n, D3 h6 P3 r$ v7 v    CSR |= 0x01;  
; N8 V6 B. u0 s4 H! h4 w/ j  S* T6 f+ u5 C* Q. X' a) @  g+ _

! v8 n/ u* g' w4 O4 v5 s- O
- ~8 w) T7 n, {4 z$ w还有就是两个输入输出函数:
0 {: D4 k! K% kvoid output_sample(Int32 out_data): E: |4 b+ M/ }" n2 a# j
{! r# r) y6 ]6 H8 \; \
  AIC31_data.uint = out_data;  
, z- @" q3 G% t2 e! [, s. Q) m  MCASP1_XBUF5_32BIT = AIC31_data.uint;* a! `; M" ~' \) P; C+ v% n
}
5 X! R/ I$ l+ ?& s* N- h6 x5 @$ X
( B' R! B' W( \% P+ \7 JInt32 input_sample(void)& Y9 g" P; ^7 p9 v5 C- y/ I
{  
& r3 Y. a6 j' I( b* Z2 y2 c  AIC31_data.uint = MCASP1_RBUF0_32BIT;
/ X7 j2 D4 D' N6 }) Q9 l* n  return (AIC31_data.uint);
4 e6 f% o" m0 F) L4 G' j; r( ?}8 h1 }7 e2 |6 v2 s
. X+ y: N! o. F  o

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




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