嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
3 |  ^6 P! A0 d7 Q+ @3 Fmain文件:
4 `- M7 s* P2 tinterrupt void interrupt4(void)  
+ w* f: \) C: I8 }; k9 T* P{
' c4 ]$ U! ^* S9 t1 R  Uint32 sample;( L0 h! Y7 A. c2 |8 T1 L

8 ~0 B. P: X2 |5 |0 U* Q  sample = input_sample(); // read L + R samples from ADC
8 y/ g# b7 R( r, i3 B) d' S  output_sample(sample);   // write L + R samples to DAC
0 a( D/ [. W' U1 Q  return;
/ o' N8 C0 @; V$ B$ u0 ^9 ~7 j}- Z5 C' t! H8 q

. z% @1 l3 F6 J  ~! E. cint main( void )# W: r& G4 K  z
{
  C" @3 R9 @2 D0 k( q7 @4 T+ w7 y6 k+ y- \" c* ^
    /* Initialize BSL */
: x- A" l9 j) C( C    EVMC6747_init( );
5 d  C) t4 t; Z& o/ I        /* Call evmc6747_intr function */0 E! {3 |, B( F; ?4 R( d* D# w4 I6 c
    aic3106_init( );+ h& ?: K, F$ u* j8 R8 J( L
        while(1);7 b% q) S3 F7 a# ^5 S5 B6 W8 P
}  v# k3 u4 U$ f! H

( Y: g" U, w% w" A% x8 U1 L* v6 V/ p3 d1 O# j. Z" F* {
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
: G' s$ a) P4 G) O0 V" s/* Initialize MCASP1 */# C* A- {+ U# X+ k5 h
    mcasp = &MCASP_MODULE_1;
; z4 @2 H& X! O5 m0 a3 Z. i% `    mcasp->regs->GBLCTL  = 0;       // Reset
2 g$ T6 ~1 v  `3 M( ]3 o' S    mcasp->regs->RGBLCTL = 0;       // Reset RX
# @* d' i, C4 F) `$ Z    mcasp->regs->XGBLCTL = 0;       // Reset TX- p; e; L& F4 R& i/ w
    mcasp->regs->PWRDEMU = 1;       // Free-running, E* X. ]! v# u& ~8 C+ B% d0 ~& H
   // configure McASP0 receive registers
" f, X$ z2 L7 h    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used( k- Y! T0 [9 z0 l$ {5 z: S& t; R
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; t8 i/ x, }3 M6 ?9 [$ ~& s    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
/ E6 }( ^% l! j8 I" R" L' j    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)7 Z2 A9 R2 l% H3 `, ]# D
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
/ g2 ~/ f' d/ E: W1 A    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
9 R* m7 F1 g. `! G: s    mcasp->regs->RINTCTL    = 0x00000000; // Not used7 u* x- i* E4 K0 R9 m! y$ z7 C/ }- |
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 O# b* o& j. R  O8 x2 `' s3 Q" o' Q: J
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
! b7 V, P. M8 x- d, O: j' W    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
8 I/ Y3 W* u' T9 t    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word4 b) y5 _" }" f, C0 D
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
* v* r( A  n4 W$ m# z) q. D& G    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK0 E# {) H$ N9 V; U" B% F
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,19 f2 S; R$ U( C( ]
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit3 f6 v  z3 ^  e$ T: ?, j1 _- F
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256+ p0 I5 R. R5 m- b1 v' o+ C

# o3 e7 j2 r# n& D    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN! T% w& z2 T8 C4 e3 O' e( Z* l" i
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT" w& ~8 Z3 C8 A+ Z
    mcasp->regs->PFUNC      = 0;          // All MCASPs) Z# Q7 k2 u) |2 K- e6 A
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
5 I9 p5 h! W! O+ z! h0 i. |2 g0 y
    mcasp->regs->DITCTL     = 0x00000000; // Not used: i1 X; O# E  n/ A5 |+ Y! h7 \
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
+ h* A7 P, o; Z% D( ?) o    mcasp->regs->AMUTE      = 0x00000000; // Not used+ Q5 |  L  H6 T9 D: b; J7 b7 L9 H0 P) A
& r) U2 x; o; }( L* i4 F) Y2 T1 G
/* Starting sections of the McASP*// {0 C1 _1 ?4 l- v
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 9 P3 k! K- [0 d2 Y  h
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
' o6 b7 h4 P4 J- ?8 s7 c    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
' k$ e: ^- w+ r6 C% N; ^% s    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
5 q1 V0 z3 H* Q/ l4 V" Z; T' _- c- `  \* D1 Y! U# Q4 ^
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
5 R. u* U; N0 Z0 S1 @    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
: M2 @) r9 m. A6 J( F  B0 Q6 z" u    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; , c& O! i2 m5 B) L1 o7 r
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );$ }, D: W$ }4 T6 F3 d; U

: r$ `, e5 v1 J5 i$ i    mcasp->regs->XSTAT = 0x0000ffff;
& V2 ^# b9 a9 [3 o" @- _    mcasp->regs->RSTAT = 0x0000ffff; " x7 ?+ O" ]8 n; {
$ p9 c) C# W' L1 g8 U
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;& P- r* B9 U4 k* ^1 d% U  u2 L. [
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
. b) X0 n9 a: L# [    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
% k) D" B. C: j    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );8 _: J& h3 O$ X; K+ W
' S1 g% v  Q" ]' L. B
    /* Write a 0, so that no underrun occurs after releasing the state machine */
: [+ g5 s4 l2 x    mcasp->regs->XBUF5 = 0;
/ Y" t  Q- y7 Z8 F; d( z    mcasp->regs->RBUF0 = 0;1 y7 K  N. O% u& L5 y9 d. a

; E1 y1 T' a4 i+ [& t    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
7 c+ @5 t/ L0 j- j    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
) i" h( `0 l9 `+ V/ ^    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
; ], ?$ E4 [& y& s: }    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
! ]7 F1 G3 `( m+ D4 @" k. x- \% j$ [3 ~: R
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
1 |1 r  c" T& D    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );* N  X8 l; R" T
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; # B2 u2 _. G6 r4 g1 S
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );+ k* h3 W. ]# N, V8 L

4 n8 l# i% I3 }" q% v) ]( \$ W8 e1 {    CSR = 0x0000;
) W7 I2 E# e& z" C4 B. y% Q% s; O    INTC_INTMUX1 = 0x3d;
) b% H% i9 G# R1 @    ISTP = (unsigned int)vectors;0 d9 L0 E! ~5 A, W
    ICR = 0xFFF0;  " c& i1 A4 e, s) k8 j
    IER |= 0x12;  
: R% x! n# C8 `6 ?8 d. g- W    CSR |= 0x01;  * w: @! F) C2 Y

3 I) y' s9 }+ N1 e% p
" O* N  f. h2 u* O4 l  Z8 m& i% Q, t7 r: q) q; |$ p
还有就是两个输入输出函数:. z* E3 @2 Y& M( K
void output_sample(Int32 out_data)
7 p3 B8 d) V! [$ ^{* j! d8 v( [7 `0 q# n0 M# x
  AIC31_data.uint = out_data;  % h$ g; G6 s6 @. g, W, g
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
, s( c; J5 {2 h}. r5 F, m% `, Z' c! @* ?  R0 d5 }
8 r% t% A; J1 `% v6 K- p
Int32 input_sample(void)2 }: V: b* w# U# ]
{  - n3 ~2 F0 T8 S5 S5 v& p
  AIC31_data.uint = MCASP1_RBUF0_32BIT;& L* Q. P$ Y$ f3 U
  return (AIC31_data.uint);
& t: r0 H3 b2 N1 S}- @9 i& _0 z0 B" J
6 f- _- d+ Y6 j, t

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




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