嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
: h" H) a/ o. I4 i  @% Lmain文件:
2 ]' k' _; r3 }9 z& o8 N# @: B. xinterrupt void interrupt4(void)  7 w7 p9 [: \2 W
{
2 a2 v# }  q. u7 ?% C" X  Uint32 sample;
5 h4 X+ b& h# K  e+ g" o) _9 c) j$ [( {3 E  r- ^9 d
  sample = input_sample(); // read L + R samples from ADC# U5 X/ d( u: w! @: q7 V/ R7 |) Q/ Y
  output_sample(sample);   // write L + R samples to DAC
6 W1 f* A" e) M% `( _4 a5 l  return;& \5 T5 Q7 c4 \: e* L! h
}
4 g/ s% X5 _' D/ s' _
) E* Q/ \# N# c6 Jint main( void )
+ m; d5 Y: f0 ]{
0 b4 j$ ]( {! W6 N7 j. h% \, r+ L7 h
    /* Initialize BSL */
' V  H; \! R0 p# }+ c  o+ }    EVMC6747_init( );
5 N2 J& S! \7 Y- v        /* Call evmc6747_intr function */
* f% x0 q- }4 [8 \. c0 o1 E7 j# E    aic3106_init( );
! f  `5 R: m+ x% R* {# h+ p        while(1);
3 m/ X! [: w1 B; J}
4 M0 }: C! K' I
' K0 M6 C7 k' v
5 y* x8 e. I% @  r" d+ R  g2 ^* E1 Faic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题( f- K8 Z3 W$ E% g! R+ `5 u
/* Initialize MCASP1 */! s- r3 P5 v; H$ r
    mcasp = &MCASP_MODULE_1;# d: t1 B8 T3 k) P: f* L* j
    mcasp->regs->GBLCTL  = 0;       // Reset
( ?9 H) L- P6 p) r" p    mcasp->regs->RGBLCTL = 0;       // Reset RX
3 {3 ^, e' v/ ^8 @    mcasp->regs->XGBLCTL = 0;       // Reset TX  y3 r5 ^: B8 K( B" U! O
    mcasp->regs->PWRDEMU = 1;       // Free-running
: h6 _/ C( X+ e, T3 o) ^) F   // configure McASP0 receive registers& f2 e. |' z  G+ h
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
& ~$ B2 W2 `5 L    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus% Z, D4 A# ?6 W' h
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
5 |+ [" `$ n7 h" j* e! W+ j    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
; l. r- m8 `. g2 P1 V' C1 o8 f( ^, V    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
1 t+ d) T. M: b# {/ D2 T% V0 c7 w    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1: [* Q( ]4 e* D1 N8 |3 _1 [" a
    mcasp->regs->RINTCTL    = 0x00000000; // Not used$ c1 `8 @3 f  R- Z7 e9 S6 F+ P- e
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
3 R2 K- ?' J( O: {. D4 T8 Z
0 A6 K& }* k  r  P    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
& h3 m1 t; `+ X    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus7 h2 F( J- S6 Y
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
6 ?4 w, a% |5 ^    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
3 Q, N, }$ s7 |1 A! l) C( l/ {( d( U    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
/ ~) }2 [8 l; N% |    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
, S: B4 V3 {) L* [+ [, A    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
1 l6 ?, k) T4 ?8 G! O$ t+ D    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
  C0 Z5 c# j2 [6 x) k. P& }6 i0 B8 ]0 N" \5 v) w9 k( Y. a4 o8 [
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN5 X% F# o: J! q6 }' u
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
( B+ |6 `5 {( q    mcasp->regs->PFUNC      = 0;          // All MCASPs. M' m8 `  m( _- V" H0 `
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
" G# @; n. j' I- e3 \% q
/ `' d6 S+ l% m    mcasp->regs->DITCTL     = 0x00000000; // Not used
; _# G0 Y. c( m7 P2 ^    mcasp->regs->DLBCTL     = 0x00000000; // Not used
5 ?2 \; V/ g; Z! y! i, Z    mcasp->regs->AMUTE      = 0x00000000; // Not used
, R: i5 w2 ?9 Q/ G" n) ^: U( a; T
/* Starting sections of the McASP*/
& |: b5 Q% j! V6 n$ i& y    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 8 X& M6 {% r; w
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
% _4 j0 |2 z  |8 A9 u    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
+ j- Q' J7 C4 M# z    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );  o3 `* m$ u: z- v( }

4 [9 W8 F- j% C, f- Q    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; * {6 M  T6 g% y
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
, F. y; \% u8 B    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 4 ^2 v' Z6 w& r$ {
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
( H+ d' ^6 f" i0 G
& n7 a8 _3 c  F- G; c    mcasp->regs->XSTAT = 0x0000ffff;
7 A/ W$ t  h+ k& A9 p: w    mcasp->regs->RSTAT = 0x0000ffff; 6 O! g6 ~% U! A  ^# r+ q, ^
4 l3 F% w4 q  m  L) J6 `, e
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;+ F- q1 y* t8 W! e
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
  N2 u  u  f: b* T$ @* z    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
" g& X( J. E1 Q7 Y0 s, r) `! u$ U    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );' A7 n* b* T% f% _; X( R

$ [& L- K' N6 ~! u& D3 ~. s& G    /* Write a 0, so that no underrun occurs after releasing the state machine */! p5 ^0 [1 z. r; L4 q3 a
    mcasp->regs->XBUF5 = 0;# E+ Y3 E: {" _# E5 f/ `  M! V- K7 B
    mcasp->regs->RBUF0 = 0;1 {; A( v  r) h) w; G) v

9 p. f* V  b# u: x  d    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
0 q2 k3 r. s- }0 J    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );/ \& a6 S" L0 F; H2 Z/ p; f
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 3 u1 L2 C# G/ y/ ?4 G0 a( k
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
" c- Q1 ~2 B$ z2 A1 p' Y/ l9 L7 \* L# a, M5 Q
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
$ v: E" t1 s9 K1 @) ~# M) @0 a1 H6 A    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );. n  o$ c- Z) s/ |. @4 g% j
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; % d# [: I5 P" v, H2 x! O5 x0 n
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );  r  o) `4 l  T: q6 [' W

* g: o  c1 l% _$ O    CSR = 0x0000;  ?+ C  Y1 H+ F" C4 h
    INTC_INTMUX1 = 0x3d;* A/ Y/ e; t3 B$ I1 j- I' {
    ISTP = (unsigned int)vectors;4 @. x9 D" I8 s# T( k% i) C4 e
    ICR = 0xFFF0;  
  X9 }3 @/ h' A/ I9 \$ H    IER |= 0x12;  
+ I$ H. k. W, a; H    CSR |= 0x01;  # B0 F% A3 O* G/ P4 ]
( v5 l6 s7 t- B8 m" I

4 W6 p# H& X/ w! j. ]# g5 k* m+ m( _( q, l" {6 h
还有就是两个输入输出函数:: e4 J2 b* `) E0 U) ]7 P% c' R
void output_sample(Int32 out_data)  I0 z/ o) ]$ z
{
% o4 w, u3 k3 `$ l1 p( \7 T  AIC31_data.uint = out_data;  ; X" J. t4 C$ {) P: y9 k5 Q
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
3 K7 l6 `3 l* C9 s0 M}
/ e* T' }$ Z  R$ b5 i" n5 R. }5 o) Y3 n& h
Int32 input_sample(void), l/ ]* \6 A5 Z1 n) d
{  . A* v1 E' @% D+ k  s0 l
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
; f) Z6 r& ]' p- Q% p, e; U  return (AIC31_data.uint);
/ L* m1 I: u4 ]6 [}  S$ z  p5 n; R5 Q- b# S
, \/ \6 |, t" l% n, d! |2 {

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




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