嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
( _6 s. f! `, b+ R& I' Pmain文件:9 S# [1 i5 s* B6 H" v0 |, |
interrupt void interrupt4(void)  * ], ?( h8 N) L4 P' W: E9 c; i
{
, r( Y0 m  h5 e' F: V3 s0 R  Uint32 sample;* H& n- X* @+ l6 Z$ n

7 l. w# H# `* K6 t  sample = input_sample(); // read L + R samples from ADC
4 c; u7 I! Z$ W# F6 b8 T. T8 m  O! r  output_sample(sample);   // write L + R samples to DAC 9 w1 A  |) Q( T! t1 V; t0 J' T' F, w
  return;/ H( C! ~$ d8 Z) K) T
}
. m' s( g8 a0 {  J- }1 O/ f7 z/ v8 ~' o' Z) \2 I$ S) r
int main( void )- d* [9 G5 c* z) n6 ~, q
{
8 N0 `; `  Z$ T0 B- H
/ }5 w  O7 K7 G) A- {& V    /* Initialize BSL */
$ ?1 Y; ?# q* K# w" a" p" H/ X1 h    EVMC6747_init( );) B1 u& {4 S! {7 V" g
        /* Call evmc6747_intr function */7 `% V% s+ j! b4 `; h$ S" A3 J
    aic3106_init( );
% n8 i3 A, U. w# P4 M4 x        while(1);
" Z$ r1 H, Y) [" u2 Y, E}
1 z8 ~% n& L9 s8 D" h8 l& I& s
! R- i3 _/ ^2 }) Y+ U
$ ^* C  Y: Y* q  ~aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题& |1 }/ l4 ^9 i3 [0 l
/* Initialize MCASP1 */" c9 B& H, S4 `
    mcasp = &MCASP_MODULE_1;9 k$ N+ E0 }5 @+ _, M! s9 o
    mcasp->regs->GBLCTL  = 0;       // Reset
5 H" @& ?# {7 j    mcasp->regs->RGBLCTL = 0;       // Reset RX! B/ l& h$ ]5 C1 g  z3 g1 z+ D
    mcasp->regs->XGBLCTL = 0;       // Reset TX
+ t3 }! |6 s# c* i5 S' I! w1 S( D    mcasp->regs->PWRDEMU = 1;       // Free-running
. p( _2 S$ O% a, l+ j   // configure McASP0 receive registers+ r2 T$ h  N) I
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
8 @; i2 g/ g, s6 k0 |5 L9 _* h+ \5 C& P% a    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
  g0 o* [( b8 Z    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word* A- ~$ Y$ K& T! I9 B- e7 l
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)% R1 v# A1 H$ p/ r
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side); u" F7 I; G! y7 e% M& M
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,12 X0 O6 K( Q6 c5 @( H
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
8 s8 r6 P1 V2 Y1 |% M: U    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 _/ @3 A  \; k& v$ O5 M4 W, z6 h' e! T" k
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
# u8 C; @2 h4 e& ]    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
9 {* g4 \; i; J- N. D, v2 D' E    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word( I7 l4 R8 ~! [' O; ?1 |  C  h
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-168 S( P0 b5 ?: F/ A) ?# t) B
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
& g8 u1 ?* l3 o, h# J& ], e    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
$ |2 _/ U7 ?- x6 z0 C    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
$ Z: O, Z  R% I9 U2 j( u% D    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256* b& z& M* k/ f8 e) n$ j9 T
% }: T( H# k% d/ O% E
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN8 k5 g" a* Z5 P8 a$ @6 U& H
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT' T5 x" t7 _- `, W! }1 E. g
    mcasp->regs->PFUNC      = 0;          // All MCASPs  O: j+ g  F, i
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1% e2 g2 }7 S% l5 d4 s  q
" W0 P5 D9 F& W+ a
    mcasp->regs->DITCTL     = 0x00000000; // Not used
  w" u0 n+ E2 O    mcasp->regs->DLBCTL     = 0x00000000; // Not used
# w  k. w0 W! Q5 n; L$ m6 I, t2 W    mcasp->regs->AMUTE      = 0x00000000; // Not used
$ e' D) s' b! S3 [+ J5 p6 C- F1 C$ a% i$ r# {
/* Starting sections of the McASP*/
: y( w4 X' K$ c# }. j0 s: n    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
( E. W4 L4 b( J0 v( K# \8 s% u    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
4 @) R; E7 J+ c. T$ H    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; / S* c- y# u+ {3 k0 a+ }
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );0 ]% A; ]7 K9 L1 s2 P) O

% A; g+ n$ p' h- |    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; : [$ w! e) g. x& R* Y9 }2 L
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );4 ]0 [6 Z, G# C- D
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
( F4 [) n% k3 ~7 \    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );3 N. {# A# i) m) ^1 F, a$ L

  F8 F$ }- [( }3 _+ H    mcasp->regs->XSTAT = 0x0000ffff;
: C% t+ S3 w6 c# @6 K    mcasp->regs->RSTAT = 0x0000ffff; ( F- f% F9 j0 Y' ^7 g2 O+ @

- v  a" x  h0 A0 S( D0 b* u    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
1 f1 f( B7 O& ^+ X9 u) L    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
9 Z9 U+ G" ?2 b$ [4 n" M! @    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; / q2 D3 U$ ~& w5 e
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
3 j( s6 ]7 d% M3 t
, E1 }6 O% F! x- w" K    /* Write a 0, so that no underrun occurs after releasing the state machine */
' {- v. q8 G- o5 Y    mcasp->regs->XBUF5 = 0;
8 @7 {1 D8 x  k/ G. d  y' F    mcasp->regs->RBUF0 = 0;. q+ M  Y8 e, G7 W- ]/ S- r
& ^. y' }2 S& I9 _1 J7 ^  O( D, k2 T
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
3 z3 T* \8 @: E! d6 F    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );3 l; _6 J4 |0 j# z/ y7 t4 M
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
& R. t% {2 W  D, Z& n8 ~3 D) O    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );$ a3 C; Z' [  M* O

! _/ I$ ^+ j1 }6 i  W6 Q) v    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ; T7 O" m) C/ I8 O
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
0 s) F  C1 O% g  a    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
6 `- `8 K7 A9 V+ N6 B0 E3 C    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
! [( Q' g0 I) q
: N+ B$ I; C: Q1 N- d    CSR = 0x0000;# R  L( b5 s. m3 @4 e
    INTC_INTMUX1 = 0x3d;
5 s6 X/ w6 Z8 l7 V    ISTP = (unsigned int)vectors;& z8 F0 |6 Z& Y% l
    ICR = 0xFFF0;  & @0 ~5 \8 x5 [# J9 B7 k
    IER |= 0x12;  
- y5 Z1 r  f; a6 C    CSR |= 0x01;  . M5 C6 X- G; `9 }" Q1 J  I& a, O

  K; _8 m4 x+ S; v7 r6 U4 ], w( y: I# P& ]- e0 @: p& k, G2 E

' z6 p2 b* A& s1 U5 L还有就是两个输入输出函数:8 p. t2 Q* g2 B8 }2 l( s/ F
void output_sample(Int32 out_data)
# q3 A4 e' T' ~8 q; b{" z, O; D1 d+ F$ w2 c5 W0 f
  AIC31_data.uint = out_data;  , v; U; r# {: q2 B+ b
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
9 i3 v2 `; i: |: g/ E  n4 c1 W}# P/ H4 l$ M3 r1 s% O
. X! Z2 ^6 R# ^, z: b
Int32 input_sample(void)% q5 E% \; c/ D/ ^% X2 P
{  
+ j4 ~5 h' E6 l8 l- y5 _  AIC31_data.uint = MCASP1_RBUF0_32BIT;; T5 |, R$ @" B0 L( W! c2 W3 Z
  return (AIC31_data.uint);
/ @. t' v5 B' X: m( t. u5 j; [}
$ X" x* W( C( M9 \) `7 S
: r- c9 j0 M: G5 @6 |
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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