嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:; t  d! K" V% ^* x
main文件:) ?! _( N& ^3 m( S/ s) }, o0 o
interrupt void interrupt4(void)  # Q4 \7 C; N& |# Q  V+ ]
{; g4 L6 I! c' u
  Uint32 sample;
) y) [3 g  V* W/ J' x1 w& G+ h# S: X! h1 ~9 Y' W- C# m3 u% W* O
  sample = input_sample(); // read L + R samples from ADC
! C, k3 N/ O9 `6 q# S3 \% i  output_sample(sample);   // write L + R samples to DAC
, w5 X3 R! |9 \4 R  return;
3 A# A% p2 l; B$ l6 K}8 v: {2 n& m+ z" p3 ?6 T
+ ]2 B7 A1 ?" u: K: q
int main( void )2 O2 K: j( @& q  A7 B( @( d
{2 D' s" G# C+ U) c

7 [' O( @3 ~% i, W, m    /* Initialize BSL */9 q2 S' u# t2 y* O: K$ i9 o8 {
    EVMC6747_init( );$ J9 m0 F/ D& S: Y
        /* Call evmc6747_intr function */
. T  W; E5 ]) V5 }    aic3106_init( );4 s: A$ t5 D6 }4 `- E. F6 T, K$ E
        while(1);4 ]' o* R- ?, m; T% x$ g- c
}
; ^+ l7 s) N8 ]- J, w8 Z4 F& E# b5 a/ I& w( ]% {

# q4 H: r+ R3 Q+ I/ [2 paic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
. q& N; ?6 `% q/* Initialize MCASP1 */9 R1 ^# s3 O) Q1 J0 c( \2 Q- ?
    mcasp = &MCASP_MODULE_1;% V7 P& E  E9 y  M; y! Q7 D
    mcasp->regs->GBLCTL  = 0;       // Reset
' T/ Y% \1 ]$ _! h4 S1 B3 S    mcasp->regs->RGBLCTL = 0;       // Reset RX4 S5 G, Z: @+ {
    mcasp->regs->XGBLCTL = 0;       // Reset TX
7 u6 c. M: q* B8 d    mcasp->regs->PWRDEMU = 1;       // Free-running
/ A$ E  G7 R8 ]8 k+ \; t0 j   // configure McASP0 receive registers
0 V; q, U; }/ m. t" c0 h! K! \    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
# g3 Y; z$ p$ S. g9 H% J2 l4 M    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus" {- \/ M! S( A$ s4 _( r
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word& D1 r3 a) O; `: S
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)( X3 }6 m2 v' G/ J
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)- ?( I' F( F2 l: h; r8 V$ p
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
+ o* e+ {. k+ h2 g    mcasp->regs->RINTCTL    = 0x00000000; // Not used
9 M% b1 ^) |( i( {7 p1 E    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
% @6 Y! G1 v: d/ D' Z# \: T: S- `5 `
$ Z; _( \1 |% T, P: C7 N  b    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
* [+ g" J1 P% S3 {3 M& Y    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* e% U1 f2 U, w, Q/ v! ^    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word9 u4 F/ R6 I* z# E8 U4 a+ q7 o
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
: i$ y) Y$ C1 p% |    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK, _: `8 F, \6 J0 G  v. \8 L2 |
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
* M" C, E- G0 M7 k$ g8 t    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
8 v' c- W8 H5 C& G    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 c/ H* {" X2 c% v! B+ h' z7 ~3 E) v! A
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN5 X' l! e# o6 l9 m
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT9 y9 S! l/ j( f' F# I
    mcasp->regs->PFUNC      = 0;          // All MCASPs5 @; V# l0 R& E  \8 x
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
" j: V. O; _2 a! B' K- W: k
% X: ^, C" ~& ^/ K; k9 s8 N    mcasp->regs->DITCTL     = 0x00000000; // Not used: t9 F5 X- A% T6 f0 P% _4 C
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
3 Q. |' J5 v( c4 _  K3 Y    mcasp->regs->AMUTE      = 0x00000000; // Not used
" d* z- R/ _+ M% W0 s: w
" {1 u7 c1 x1 ?3 l/* Starting sections of the McASP*/
+ |4 U4 S! ~4 L( E    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
% V- n$ j/ O+ R% h+ L) X( A    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
2 P3 o9 Z/ C8 H/ E' K    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 5 [; b7 J/ Z) y0 v4 s. H
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );* X/ Y- @3 S9 i, e/ O5 c

$ d+ c+ ~- L; K0 x  l    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
, V8 C! q1 w$ B" V    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );8 y% \: q) e5 U' H+ f: Z) k/ i* _
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
; |5 U+ {. i( k$ k& A) D3 J    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );; k3 g/ |$ E8 j( K
+ x. Z' |6 G) `# J- [, G$ O3 K; x
    mcasp->regs->XSTAT = 0x0000ffff;
( t1 F6 B: q+ _4 b/ `    mcasp->regs->RSTAT = 0x0000ffff;
/ ^! o- Y: p% m, a. c
- Y: v5 C- v/ L1 ?    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;! k: v. Z0 J; t, i. K5 G5 H
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );, q* s0 u) M9 K" t: A
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 6 m% ]/ N6 F/ c) |, K" D( z$ y
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );; L. w2 V, X  Z

) Y' p8 }. I. `2 c. [2 m! G    /* Write a 0, so that no underrun occurs after releasing the state machine *// T3 z& |( |4 X0 v2 _1 b) U
    mcasp->regs->XBUF5 = 0;; X, @- a. o2 H! A5 i% T6 g( G0 k2 M* N2 U
    mcasp->regs->RBUF0 = 0;& S* i* r7 C! K  y
* Q0 t& T6 D% c0 ~# |9 D3 c
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;   v& [- ]2 G  M- O% H, Z
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );/ f2 Q+ g$ b: Q5 n% w& o
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;   v0 m/ \! w! {# l# i
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
+ d8 }, A- v/ B2 n; \" n1 ^' x& r+ G1 B6 S+ F- q, @7 _7 J( u
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ; H0 G* ^1 M: Q4 D7 S- N! e
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
0 T4 p: t  t% C- p    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; , l' ~0 t6 E. T! L  v0 }
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );( w0 e9 A7 B: e

# `! Q5 U0 w  @- A  S    CSR = 0x0000;
% ~. J" F6 C) U) r+ J6 |2 c    INTC_INTMUX1 = 0x3d;
, u, z+ _5 |- E3 G9 L' {' u    ISTP = (unsigned int)vectors;* Y3 ^: `( L: q' c3 W' }3 l
    ICR = 0xFFF0;  1 h% k4 }! R( B) O
    IER |= 0x12;  ( O9 t6 B% c" ~: q  S7 A
    CSR |= 0x01;  
- S; I, X2 C9 I! w. ]2 \- x& O5 u. F7 V/ R& i/ [/ y
, V) x  U" a0 w' H
/ P& X4 h1 f# `
还有就是两个输入输出函数:& X' o/ t8 _+ g
void output_sample(Int32 out_data)
+ x  ?5 z( o1 R3 z6 Q1 \$ `{
6 F3 R$ c6 J) G8 |/ k' J# K- U2 F  AIC31_data.uint = out_data;  
; f9 L' f: L# c& Y1 f  MCASP1_XBUF5_32BIT = AIC31_data.uint;
3 R9 h2 {8 n; _( i}1 k( s6 h- M/ g9 H3 |9 T; ]; a

, [) o, P% S) y) l3 R* G$ K3 dInt32 input_sample(void)
/ N( k& S) m& N{  0 ^, _% a2 k$ r" O
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
2 K) `$ o. j1 z6 ~  return (AIC31_data.uint);! ?2 V& l$ l# Q; P) |2 ~
}% c! q; U6 I) b* _1 R

% j( M6 T7 Z' e* o6 y
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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