嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
* [( O4 ]4 u" n5 I# xmain文件:3 |& S* W$ c! z. C# a
interrupt void interrupt4(void)  4 ]0 i4 I! ^. e/ P
{& L$ |8 [; D% a! o/ r+ f6 g' Y. H; w
  Uint32 sample;# V4 ?4 g  N( M8 q, G' x4 H3 ~

& r1 O6 s( A( G  B; Z2 G  O  sample = input_sample(); // read L + R samples from ADC# q, k) Q/ \# N  P0 J3 k
  output_sample(sample);   // write L + R samples to DAC
2 l/ n- D8 J* X5 `0 ?$ `- P, j* z  return;: ?' Q* b( ]0 B4 O0 j+ I/ `
}
9 i. m  F6 x8 }9 w' F* Q7 @' n$ h0 @) d  ]; ~
int main( void )
, r  h/ e* O$ t  `4 x  ^5 r{0 S) P# O$ m  i; J9 z5 p

" d% o; B8 z# M3 H8 V    /* Initialize BSL */
0 _' {, M( H7 a  [    EVMC6747_init( );
' k# i* ?1 G3 E. U2 x( u# }0 q8 I        /* Call evmc6747_intr function */
% ?5 _0 i% Q& ]- N! D3 t    aic3106_init( );% b- t, U. F& ]; N: g7 E
        while(1);
" x+ D& w7 e+ h}
0 a" j5 z! H0 p2 B! t) Z, h7 {4 f% V( S0 y8 b

9 k6 W8 [+ @2 t5 y+ G" w8 \aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
$ Y4 L$ X0 Q9 Q/* Initialize MCASP1 */. h3 D/ X9 M% C3 E# M0 D9 z
    mcasp = &MCASP_MODULE_1;& q( y0 V4 _+ Y: D3 b& q
    mcasp->regs->GBLCTL  = 0;       // Reset' h, u' h- u: u
    mcasp->regs->RGBLCTL = 0;       // Reset RX+ L, R0 |0 @: c6 v6 v
    mcasp->regs->XGBLCTL = 0;       // Reset TX
+ C0 X: G2 ~; ~2 }: m    mcasp->regs->PWRDEMU = 1;       // Free-running
' L: y' @+ F8 M" @) f9 {   // configure McASP0 receive registers0 `6 }3 }) D  @
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
6 C) G& \3 A4 o( ]! [    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
9 A) z7 ?7 e" A    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
$ U2 k9 v; B- i( @& n: s; m+ Z0 e5 r    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)# S5 C. V# p2 H% _
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)+ V. y  H( w: z
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
9 }& w; O/ M. C    mcasp->regs->RINTCTL    = 0x00000000; // Not used
. e4 Y6 x6 G+ n6 b( a6 \" p/ q, o    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
; d& J  Z9 y3 J6 v6 T# Z
3 w: ]$ c$ b+ Z( C* p    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used' r) h: x  `" s
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
9 ~; x  Y% Y2 R  @1 X! B    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word) Z& Z2 {" X/ y4 p3 e+ c4 S
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16, ^; P# D0 s7 m2 X$ \
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK' R6 v2 c. ?' ]; f
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,12 \. T' L$ G* V1 G7 ~# z9 n
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit2 @6 E' W+ P) u1 _- {: R5 e
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ m) c9 C0 m9 v8 T; J+ f, u
& X- N# P8 f# L% H    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN& K7 d( K% k" q( k
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT3 _0 m4 z$ Q/ y* K
    mcasp->regs->PFUNC      = 0;          // All MCASPs" y2 r$ r+ v% W0 I- d. T
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1  m2 ]+ a0 U+ x
- e9 H6 |/ V( S4 E
    mcasp->regs->DITCTL     = 0x00000000; // Not used
; W) r  {; o+ t' I; n    mcasp->regs->DLBCTL     = 0x00000000; // Not used
$ Y% P6 q' \" v4 O/ E    mcasp->regs->AMUTE      = 0x00000000; // Not used/ k( R$ o8 j& ]( ?% N; q

. H( T3 K- Z( S6 M9 L3 _/* Starting sections of the McASP*/
% ~" \1 ^/ J4 ]$ Q8 f' _- _    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
4 [& Q& h7 S( ^' C; p; M+ k% i$ h    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  ' Q% G3 V$ Y! I; A# k8 ]
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ' c5 D  J* x+ \6 w  @7 t+ b
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
# g9 L! D. }$ m) O9 r: N' t* X: k% |7 c2 d1 k9 G* S
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
3 q1 U- Y, i6 R! r    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
$ {; v0 h' x7 g0 W; J$ A% V    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
% d1 d5 w' h6 A0 g( @    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );& |5 n4 j! C' l

) c" n% ]8 T' I% n4 y0 t    mcasp->regs->XSTAT = 0x0000ffff; 1 H3 o, g+ F8 z0 y: v5 j, D
    mcasp->regs->RSTAT = 0x0000ffff;
$ U: Z0 d' O5 |2 ]3 d. ~/ `1 k4 E  S
* m6 `" X9 L3 M2 T8 \0 R4 D8 L% Z    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;& I. l) Z$ l' b" D; v, j
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );1 Q- \/ b6 a0 g3 o/ n- e
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
3 a  V; F+ b" s8 A    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
7 A) r: U1 y- V) e% [7 T, U- Q$ R7 C5 x% B3 i0 }
    /* Write a 0, so that no underrun occurs after releasing the state machine */  Q: a' K0 D0 X- E% G! L2 h8 R" `
    mcasp->regs->XBUF5 = 0;
9 w& R6 Q+ K$ @- k1 \3 {    mcasp->regs->RBUF0 = 0;4 H) P* n5 r5 `* ^* {  o7 g
5 {0 Y1 P, v- n; s& t
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 2 |  ~6 e9 X  d; @- f: n8 c9 s
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );+ ?5 V. |% x% @: i9 B/ v. `: R
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
8 C6 F7 |8 I* b' Q    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );  u7 }2 ~6 _  u6 b. }  K7 Q
: K  M( N5 [  V( h, b7 a
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 1 b. V. J" m, }6 a' s- }5 v
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );8 k3 P5 N& g3 W4 n3 p; E
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; # z* @5 X) v4 Z
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );) z* v, g3 n7 |8 t6 z% P2 X

5 K5 T3 n7 ]8 q5 H3 F  d# n    CSR = 0x0000;
% i, C4 b  e) u    INTC_INTMUX1 = 0x3d;$ d9 @& F* I1 j: H- k% k
    ISTP = (unsigned int)vectors;) `/ E4 ?) _' J
    ICR = 0xFFF0;  
: u; L; s$ D3 ^. z* M5 I+ ?    IER |= 0x12;  
" Q; K* o6 ?# O& {. {% W    CSR |= 0x01;  
# B6 [2 q' L& k. \" w( y5 @, h% a, M2 v& Q

+ B: l3 Q, r4 _* X2 Y, D
6 Y+ M" T8 l: @' J还有就是两个输入输出函数:6 X* L- O4 p0 ], A. `; _. z
void output_sample(Int32 out_data)$ D/ P4 h% I2 L
{+ v0 Q& L7 ]: s% K5 Q7 I
  AIC31_data.uint = out_data;  ) A8 E$ T- f. g+ t3 H3 p
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
! I- O! [# R' A! B6 c: m}; K% \- Q0 e7 ]5 h9 x
+ x2 v% [0 M- h0 h4 w9 B
Int32 input_sample(void)
* o2 p9 C5 @5 e+ U$ z{  
0 q7 w; @' l& w1 j  s. ^2 V, }  AIC31_data.uint = MCASP1_RBUF0_32BIT;! E- K4 L4 G3 q
  return (AIC31_data.uint);. {0 i) s3 Z7 O8 n6 w1 ~
}
* Z2 Z2 A% Z. c) B2 G) e  l
3 ~, D( N& c. F: U' ?! l/ f
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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