嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
9 g2 m! U% t( K# n! Cmain文件:8 d( j/ w9 Y% y* T
interrupt void interrupt4(void)  
8 `" O$ \9 P% o1 p: R{
; U0 M, p* w5 J" f# U% n: B" D  Uint32 sample;$ g/ k! L( i- B& B; c# r! ^% }
& F% _& W3 Z. D" @' d
  sample = input_sample(); // read L + R samples from ADC; ?7 G! x3 P4 J
  output_sample(sample);   // write L + R samples to DAC : `8 d8 B; d' F
  return;
) G& \9 t* I3 D5 y) }}' `: F3 p: V' A! S% e$ @$ ^9 h- v
' ]" M1 ?: s& P( s5 G/ ]8 C8 |
int main( void ). t3 x3 ]  w, p8 x
{' `0 K5 W5 Q# o; f$ o" v9 ?
# j8 H7 R* l7 W: c- r! |
    /* Initialize BSL */( L  e$ R$ t; W& p
    EVMC6747_init( );
+ N3 Z% ]$ f% O, t* D        /* Call evmc6747_intr function */. R# ?* Y5 D$ {$ |7 s3 A
    aic3106_init( );2 I+ t0 {* a  h5 k; o% h( ]
        while(1);
. }- w8 {5 ^. R+ T- b}3 n; F+ M- N) x1 I
( g& U9 y( s$ Q' S" ?! k- b) U0 ~

& a6 i% I& |) w& E8 u- ^aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
1 R- {0 s& K# r% F6 J/* Initialize MCASP1 */
$ y7 U  v. O/ b! o+ f    mcasp = &MCASP_MODULE_1;
- y% Y8 m3 T& I' l1 N: g7 X    mcasp->regs->GBLCTL  = 0;       // Reset9 u) c: }0 R/ D5 K& r1 p) Y
    mcasp->regs->RGBLCTL = 0;       // Reset RX$ G* \) i& Q( I  t5 o
    mcasp->regs->XGBLCTL = 0;       // Reset TX
+ r0 S3 |1 G- r1 U! C4 i7 c    mcasp->regs->PWRDEMU = 1;       // Free-running
6 A$ j" g* z  r  }   // configure McASP0 receive registers
2 \8 t( K* J, U, C0 `9 ^+ F    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
! H! K( u' |5 n  Y: {3 s    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 y- V) ?% H0 F  y( j; Q    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
- O5 F9 J. U/ y2 U    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
$ J3 l/ W) }9 V3 K7 R' _: j# f    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)$ g4 I4 _8 i2 A5 q
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1  s2 g6 E7 P! T* m: `# ]! x
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
" ^% b/ B- I$ k& H( Q$ L    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
& @, W3 ?. a% Q* c! c! x: v) x9 g9 J) C4 |" q$ N( n  S' P* a
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
4 l( V* ?: m% n& ^    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus* G4 c( B6 D7 K- l+ F2 Z
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word# s  @3 @0 I& S1 {% G9 C% r" ]9 D7 s
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-165 ^. ?* k+ z% I8 V$ G. ?
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
  y3 {" B# E/ {/ e/ D4 P7 W    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
% I* x3 i% m# p% l& Z! Y    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit, `9 |  P! J  e2 g1 `* B; l* e
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256. q6 e5 M6 e  N- Z% o& M

" z1 p, _( T6 c- p/ \    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
7 [  @( b) u+ e4 h( e    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT) J/ J% l, X4 e6 W) j; \
    mcasp->regs->PFUNC      = 0;          // All MCASPs
4 o6 a, @: H6 b" E' T/ w3 E    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1+ w$ D6 ?& K2 i) z2 g$ U7 C

1 J9 T: s6 S, l; C# S- i    mcasp->regs->DITCTL     = 0x00000000; // Not used9 }' \6 I7 J; I5 d3 c- Z
    mcasp->regs->DLBCTL     = 0x00000000; // Not used* Y8 I: ]+ f% L. ^6 c! ^. B
    mcasp->regs->AMUTE      = 0x00000000; // Not used7 z! F* [7 J+ @3 M0 J

) b' _2 j+ L: a/* Starting sections of the McASP*/1 l2 C7 B5 ?) H$ F: W+ i) O
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
! m+ G% x8 L! u6 j' g    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  # A2 m) \: f% Y, ]# p: u/ V* n
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
- u9 ^4 Z) d4 M' ?$ H    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );  J) ], S3 B$ q4 N/ n% r
( U; O. K9 ?/ J1 c4 C
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 3 x5 O7 p8 ?; V" T/ H
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );4 @7 c4 @/ m* s
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
  |8 ^' M0 A: w% T    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );5 D6 D$ o4 }+ N1 L& d" o2 u3 l
5 N# @8 o. z: z& i' T2 G
    mcasp->regs->XSTAT = 0x0000ffff; , r3 F! A6 j4 t. [8 |
    mcasp->regs->RSTAT = 0x0000ffff;
' Y6 C) R" T/ Z# y( `% a3 D5 ]$ ^' b" v6 D" @" {" h9 F
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
7 E: q; y7 ^" |% w1 E% K    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );( j  r' I' X- J4 m& }( q( R0 o9 X2 x
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 6 A! W" t2 D7 T
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
( Z. r) _2 H( R: n  L$ v# W9 P+ M8 g+ o; V3 I7 o2 H6 S
    /* Write a 0, so that no underrun occurs after releasing the state machine */" ?& b6 ?' a8 K8 l/ h. W
    mcasp->regs->XBUF5 = 0;, e  o5 {0 d! ~+ Z- _
    mcasp->regs->RBUF0 = 0;& ~3 h' _: u( M6 C/ y: F
1 _4 U, D* r2 X% ?
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;   _& x$ V; A6 y! X& M$ u
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
7 K& X0 ?8 }* F8 b, f5 ^& ]    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 0 y0 s, m% O! Q, s+ l
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
, }" w+ B4 q% Y( l) U0 w
% u& q/ D6 M$ A; d9 j2 @    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
- u* z$ A' O5 r; @! G, N% e! d% N    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );9 P$ ]: c4 d1 a- _
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ; P. I1 F: H: G
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
" N. s# z' e1 m
, r/ F7 R: J" P    CSR = 0x0000;& n8 W2 {0 d$ t0 }  K/ d
    INTC_INTMUX1 = 0x3d;
- Q9 a6 X& p! I) M! a    ISTP = (unsigned int)vectors;9 F& d2 w+ T+ z( Z1 C) k2 |
    ICR = 0xFFF0;  , l# \  o* g2 F; r% B
    IER |= 0x12;  ( G9 ?9 Z! U# P& `$ G
    CSR |= 0x01;  
- e1 H3 o9 f4 j8 Y( z( n" _  L% R* b/ G

/ d' D6 }: Y! k8 h( W5 J7 b- O
. a6 Q3 u  l) I3 C3 t还有就是两个输入输出函数:; b% z& p( D. V+ X
void output_sample(Int32 out_data)9 R" ^4 X+ C* p$ e: s6 S# P5 W
{
: g# n- E0 k% S3 @2 M  [  AIC31_data.uint = out_data;  9 X) l( O( [; d4 c# y; f% J. b7 ^
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
8 H3 [( M/ v4 |}( Z9 {9 a  e5 L) h! ]

; \& }3 }  ~9 r3 EInt32 input_sample(void)
7 |( ~; d. [( E$ \. ?4 i' E{  
; v8 P( V& Q8 f5 U( o2 I0 c5 [  AIC31_data.uint = MCASP1_RBUF0_32BIT;/ @- L: W; I# k2 r* u: g
  return (AIC31_data.uint);% A% M# _  k2 v& f, _
}( i9 Z/ A9 x' E) a) {6 O  }& L
, s/ u( P+ x5 {: S

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




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