嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:) h8 M; D& O0 w6 A
main文件:
1 R! |. ^; z) B# sinterrupt void interrupt4(void)  * H- w1 ~$ ]+ x. b$ M. ~
{
# |; M5 H, S3 B3 _  Uint32 sample;
+ x9 L; x/ O  h+ A2 p' M
, f5 [7 t1 }4 m  sample = input_sample(); // read L + R samples from ADC
- |2 J* l+ q0 E9 F/ v7 k" g  output_sample(sample);   // write L + R samples to DAC , F- s9 e  \- D9 \. u0 b9 D
  return;
, g6 G& ]/ }7 G}9 C, s/ A( X0 _! @- B* I
8 j: Q* j4 \+ J" [6 D! P
int main( void )
% g* u# f7 y. B2 R{
1 e8 M8 I" p; d3 L2 j
2 P. b2 y7 H9 _! i9 Q: p% S6 E    /* Initialize BSL */! N4 Z! `, D- q  L+ [7 s# K
    EVMC6747_init( );
  g, v; R+ k+ b4 u2 X& ^  [$ m        /* Call evmc6747_intr function */
+ Z9 P8 [. Q- J1 I4 m  U- n0 w' l, e    aic3106_init( );! ?% G9 T" N; r3 O7 S" g8 ~4 v/ U. C
        while(1);
  i' q& L' ?3 ?+ W/ t+ N}/ e& J- J2 g' D8 t) a
) ~9 F& g) T3 K) |4 `: D: x
- w9 M/ Y/ O) `2 K5 {8 d- g
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
# V: n$ _$ P+ S/ |4 [. k/* Initialize MCASP1 */) G( e6 R% O/ C) r0 I
    mcasp = &MCASP_MODULE_1;
) O& y  o8 s  J1 }( d) j9 m9 {    mcasp->regs->GBLCTL  = 0;       // Reset6 A& r6 p' @2 X2 B5 G! y  A
    mcasp->regs->RGBLCTL = 0;       // Reset RX
' N, ]5 U& f) g6 M( c" w% `    mcasp->regs->XGBLCTL = 0;       // Reset TX2 t$ Z# I% |3 E& g3 ]" w5 G
    mcasp->regs->PWRDEMU = 1;       // Free-running
: q5 E& N0 p) K% o3 {" d   // configure McASP0 receive registers5 \( I/ b! n  A% q( w/ `
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
& |& d+ m, K- j, ^) k* D    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus1 |( g. t* B: t" j& C7 _3 @
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word( X: A3 \0 f! R" l' t5 l
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
5 R+ Q) E+ L% F+ ]" K4 g    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)% K6 L- W; J3 {/ O, i8 U
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
; r* v( S6 \- @* u6 y; A    mcasp->regs->RINTCTL    = 0x00000000; // Not used4 L' {  w& m, ]) o/ s
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 L3 U+ j3 V% Z8 |) i9 B5 r7 V
% W9 V$ s/ K7 H$ F% P& {! Z    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
* m8 ]# e: ]) S) L7 o    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus- c/ F' l, X" K
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word$ X# l5 r/ k8 m; s) O8 Z
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16# Z# e& q) v: o, u- K
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK5 r* b6 W! Y+ U
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
2 C& O4 T9 ~% X/ v0 O    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit' q  a4 G! N- i" ]- I# d* N( u
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2560 c% S& ^+ J, ^: r# i' O% |5 X% @
! J$ i0 y/ l! Q6 X3 S1 Z( p$ J
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN4 h+ o0 p$ s0 j. z% ?, y
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
6 I; l1 k2 g& B    mcasp->regs->PFUNC      = 0;          // All MCASPs
- `' |) w( E& }9 E    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1% q/ N2 O2 |+ u, ^
0 O' Z  _3 W# Z3 ~. K' b" V- s
    mcasp->regs->DITCTL     = 0x00000000; // Not used
% u1 A) a( I) g& F. `    mcasp->regs->DLBCTL     = 0x00000000; // Not used. N/ t6 W6 b# ^$ _
    mcasp->regs->AMUTE      = 0x00000000; // Not used
3 v1 y# B' f" O9 }$ M* h4 Q+ _* M) I8 v- L7 T& q
/* Starting sections of the McASP*/
4 m" u# q$ Q# l    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
' v# k1 w$ x0 y- ^8 G$ b    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  8 `) c* @3 V0 ~8 F- b. M0 j
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; " x; V  P8 B4 V; O. t6 u, [# t7 `
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
* U4 O+ h- ~9 B/ W1 e1 X! v* w8 q, i3 \  i3 u
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; " x0 b, t  j; j" D! U" P0 a. K" _- [5 v
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
* y# D# y" r# d3 l) e    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 5 f: z' z9 X4 G' h) y
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
* W  J$ X& @1 q1 q6 W1 z# k$ G. o; ]! B: D5 ^9 i0 h* e
    mcasp->regs->XSTAT = 0x0000ffff;
) V' m3 R' |0 V+ d6 D. `9 I( L% o    mcasp->regs->RSTAT = 0x0000ffff; . v6 m# ]$ r, f8 c. b. Y, X
6 b/ [8 q2 A) Y1 r* v, t& p
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;, A; Z7 I  ]3 y( O/ X6 F7 f" g
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );' i4 q8 T. r/ `! C! g
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
; J' ?8 q+ \+ B6 I$ t    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
" @/ j' b/ O- P: _
, d8 b7 G7 K1 \( A: G( G    /* Write a 0, so that no underrun occurs after releasing the state machine */& a) O7 D- B2 l# o# T
    mcasp->regs->XBUF5 = 0;
/ l; G- p5 k% {+ D    mcasp->regs->RBUF0 = 0;
. s. |' N& ], |: |0 ]- c9 F. t$ U3 k5 y9 Z% k3 T% w
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
& A: W/ H5 N+ N+ H, K2 W    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );) ~4 w8 L0 i) p, ^% P- I4 k
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
6 W+ |8 ?3 B# g    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );! N$ s/ F  G" _, t

' P$ E. ^+ K, ]* }9 x( c# k$ ~" s% b    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ' u2 n1 o: I0 C! m- g4 Q
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
# E  R, F! k7 |% a    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; % ]' O2 L3 y  r" O- y% \
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );8 |9 K2 Z* N& x3 m
1 E. G) Z; h6 e7 r7 N
    CSR = 0x0000;
, p# {# m! n. m- H    INTC_INTMUX1 = 0x3d;
' j! S2 N0 R. ?- p# h- q7 S% l    ISTP = (unsigned int)vectors;& y/ h/ o8 N1 Z8 W# z0 p' B
    ICR = 0xFFF0;  ) p. @8 q) W3 ~9 u+ s
    IER |= 0x12;  6 M) u0 K, v+ c* {
    CSR |= 0x01;  . g# l6 B, T; {7 y/ p

4 `7 t  ~3 u2 ~+ k
$ Y- Q/ ]7 d; w0 `$ `3 v+ M
; z  }; D" }1 j6 B1 u6 ?还有就是两个输入输出函数:7 T  V8 p+ C  p
void output_sample(Int32 out_data)
* k( w6 x2 }* U2 O! s5 u{
) _; O# N3 O; C# \$ G  AIC31_data.uint = out_data;  ! P5 p3 y! j. g0 v% `
  MCASP1_XBUF5_32BIT = AIC31_data.uint;/ H) ^4 w8 U5 B( T. f2 B) G
}& f/ @6 c4 p% r! e8 {
3 ^$ P' U% e3 ]$ C; c
Int32 input_sample(void)- j* p5 r, t) Z; C. f0 q3 e% J$ x& V
{  ' n5 y$ F+ t- _1 |
  AIC31_data.uint = MCASP1_RBUF0_32BIT;! a. v: |) b  S3 z) i0 A
  return (AIC31_data.uint);2 q* P1 i. n* y( r
}2 x  b* S( ?' W/ w) ~6 j& x
* c* s* U  U+ W1 R& O) q: O

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




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