嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:" q) n) n- J1 p3 l8 ?
main文件:
4 _  L/ i" P7 B/ Sinterrupt void interrupt4(void)  
  p9 }" o( o" w/ T{
' A: h4 V8 g1 K/ U5 D+ b4 j/ K( j  Uint32 sample;/ ^) N: o0 z8 K$ x5 p0 a5 f

2 w1 |' Z) C! U7 O( X  ^  sample = input_sample(); // read L + R samples from ADC
' o0 _8 C% {- `3 S  output_sample(sample);   // write L + R samples to DAC
( a8 a1 T3 x0 K( _! [  return;
! h; \/ A, |$ j3 Z$ b% t/ M}% V' t. _$ U' o

6 }: D  U) s$ m, uint main( void )
" J! T' d5 ]2 J4 k* R{
5 ]" [* ?* D! N. c& i3 }3 V' q* o9 S+ Y- S  B/ G0 m/ X: \
    /* Initialize BSL */
. Q% W0 F+ y9 a# h5 b( i  q    EVMC6747_init( );" O1 p1 c5 V/ E9 I' ]/ \
        /* Call evmc6747_intr function */; ~+ m  e. E) P" P' _4 {
    aic3106_init( );
( f; m* C; S  D) `: n' p" H        while(1);' p; |+ I/ b/ q- m* q: w
}
% z* c9 {) J: n/ w2 P% Y4 t# C1 ?: D

* \9 t* Z8 [$ Raic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题* n7 x4 L0 ?. j8 p8 M0 v! z$ D
/* Initialize MCASP1 */% V0 a# ]+ W* |' z3 |4 N; k
    mcasp = &MCASP_MODULE_1;
3 k6 n- q( f7 e" t: o    mcasp->regs->GBLCTL  = 0;       // Reset
% `% O3 ?7 Y# Z    mcasp->regs->RGBLCTL = 0;       // Reset RX
6 O/ m& a7 V8 z% b+ X8 r! [3 x# q    mcasp->regs->XGBLCTL = 0;       // Reset TX% q  g7 f8 Q% s4 ?& H2 p6 l
    mcasp->regs->PWRDEMU = 1;       // Free-running* o& B8 k4 H/ U- v$ b* P2 A
   // configure McASP0 receive registers
6 q! u7 ^0 \! m4 U, P1 T, U) z    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used/ I8 H3 K( q- n0 G; a4 K
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
( [  W' `8 o. h, X    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word) f  ~  u! v+ w7 X8 E
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side); |, Y- J, T! w! ]8 g# b% f
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)6 }# i9 S+ L" \. ?  v7 z/ I3 m
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
& F( |: Z. m: e8 ], C7 B    mcasp->regs->RINTCTL    = 0x00000000; // Not used
9 D/ U: l3 K$ v6 U$ I6 O  r% E    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256" K5 t( y0 p- ?7 N* H5 \
. u7 e2 R" \# R: ?
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
4 X# a& E4 v5 M- O7 [. P    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
+ \6 C" J- J$ r$ F; W    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
- C# S0 t/ Q% W, ]  Z* i7 l    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16- t# a  n0 }* I9 _' ]6 ]7 C- [& _  @' l
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
$ T  d7 E; M9 `2 y3 E# f0 ?# t) m    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1" V% Q/ B& Y! f8 r; r6 T% u/ ]9 g
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit5 {& e  c$ Z- u9 t/ f- M# O: }! h
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2569 Q' E% l0 _! P
  w0 \& M5 C8 u) C/ e+ a2 {7 O
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN4 }* D, d: V/ T# O0 e. z
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT9 H* E% h' G0 U% @) T; R3 ~6 R  y2 E
    mcasp->regs->PFUNC      = 0;          // All MCASPs- x6 C; [- S0 E2 x/ h+ a
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
5 k: U" V! R" U. \3 Q
1 f. x' h4 T* E& u. j    mcasp->regs->DITCTL     = 0x00000000; // Not used. C- k; z$ J* G1 D/ L" X
    mcasp->regs->DLBCTL     = 0x00000000; // Not used( p) O. ~$ ~) [; H0 X  J: [* A
    mcasp->regs->AMUTE      = 0x00000000; // Not used: J8 j: _) S# t$ L; j. w

; W4 p1 Z! r6 c" Q# Y; B/* Starting sections of the McASP*/
) i  l6 |3 n9 b. H; |    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ; u, J$ ?& L7 R! |
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  . E" z8 h( t" l$ d1 v/ K
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
4 q, r! ?( c- `9 R2 U; b    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
4 e& M3 w- j) N/ [+ C$ h" `- n* v
* d1 ~9 {* C! m# W! }    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
8 E& h! E5 D7 s    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
& N4 X* b6 l$ k+ G    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; : _! j: G; R/ R+ I9 ]. C
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );5 r! @4 O1 O9 r2 y; c* N5 }8 j
6 ]' m# J" ]+ X& n+ D; ~* U; C7 j/ b6 `
    mcasp->regs->XSTAT = 0x0000ffff; ) S2 ?  v3 ]+ H& ?1 \* C* V# j# I+ B
    mcasp->regs->RSTAT = 0x0000ffff;
! \4 K: o" u# X# l" F7 o" @" Q) J" Q0 x# x* o
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;" A- p) p2 J; b( s
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );- z; Y3 Z0 \. {& Z! H1 q
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
  w- w. W( y/ m# Q4 v4 i    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );8 o. j* B0 G- O) o
: C3 m3 R$ f. H8 y: o
    /* Write a 0, so that no underrun occurs after releasing the state machine */
! U7 J$ E* R! |8 D    mcasp->regs->XBUF5 = 0;+ `! Y6 v6 p* o. ]
    mcasp->regs->RBUF0 = 0;* V7 t. P4 C% [8 e2 {+ l

7 _* M( `) {1 e    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; + n7 i+ y( e' x
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
. P/ p( Y' c0 S    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
  {: r4 @1 C3 Q, \9 B    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
7 J3 c! u' A/ Q9 y8 @& U9 R
3 L0 s  z" L+ ?& q    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 6 O  r7 Q3 u3 r# i/ C: N/ _
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );. X* |9 K- Y0 l) U, X
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 2 `* y0 c% M* e# x4 D# c, d
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
1 b5 F2 @# E' U3 p) l# ]
5 R3 h  G/ q9 x) O4 s  D    CSR = 0x0000;1 u; a5 k. e& }- s8 q! F; L1 }
    INTC_INTMUX1 = 0x3d;& {' l1 j" d( `, `( w$ w9 i
    ISTP = (unsigned int)vectors;3 Y2 J, {) M$ Y& f+ s, j, U2 N% E1 A
    ICR = 0xFFF0;  
) K, ~1 l& M7 V6 J) }# y- R    IER |= 0x12;  
1 V" p& s1 v. G9 ^+ B$ Y9 Y3 X# B    CSR |= 0x01;  . W1 y1 W  O# B" s6 `
# G1 z8 a- n) m5 E  h3 X& N2 C
8 y" b1 ]6 V; _/ `5 O4 T

: _) {5 a$ r3 X4 F$ w还有就是两个输入输出函数:4 l* r% {$ Y: A! F) h: C
void output_sample(Int32 out_data)
4 \) g& N5 u8 K7 T* v$ _3 R2 l3 [{- v! E3 l1 L. M& S
  AIC31_data.uint = out_data;  
  W  \( R$ B6 r2 E" ^# |& R2 V  MCASP1_XBUF5_32BIT = AIC31_data.uint;$ t: K. d% Y1 e' C3 v
}  x3 M7 r  k" `/ Z9 c. `
4 x9 ~5 j: x' i. ^/ Y
Int32 input_sample(void); `. Z' x9 E8 [
{  6 m: Z- {9 x3 W8 f$ E) j+ o
  AIC31_data.uint = MCASP1_RBUF0_32BIT;; y% j& }( H* i% o8 P
  return (AIC31_data.uint);* e- w$ S% u: g
}6 Y+ `& u5 {0 Y: [( e% L/ S9 z

, l4 X/ c3 v* c: S- J) T4 N3 s5 C
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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