嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
4 z& G. c+ I; z3 Qmain文件:
7 E# S9 P0 H0 H- u8 z9 pinterrupt void interrupt4(void)  
0 V7 A$ F' p, {3 B6 s{* J& ~0 b5 R& Q
  Uint32 sample;
7 H0 Y! F. ]; v; |) s9 y2 F
+ H, S2 a3 x5 r) U! `) Z  sample = input_sample(); // read L + R samples from ADC' `2 s0 l& U) x% Q0 g
  output_sample(sample);   // write L + R samples to DAC
1 m- H6 s8 o3 I) R  return;
, X) F' t; f7 b% k, A; ]}7 @5 L" o3 l6 {# S# V  E+ Q
8 ?6 F' T% n6 B0 k
int main( void )$ f; ^  J5 h/ X# e' f" T
{
2 _) {/ |! T. s6 @- G2 X6 V
0 S; V/ A7 t7 ?8 w2 h    /* Initialize BSL */
) N4 Q: w  |/ H7 ]5 _0 m    EVMC6747_init( );
! y& R2 M. N9 }1 ]6 g) X" w0 `        /* Call evmc6747_intr function */2 @- z1 I, r4 O; k5 v" g
    aic3106_init( );7 e& k/ t: g+ x- X4 P8 ?- I
        while(1);
& y* a" U/ b- E/ a2 C; ~, Y}" b/ T: ^+ g9 W9 U6 q0 q, n: G
+ `( M) L6 b  d' z
9 f2 W( k. k  ^# B
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题7 U, f( l2 a# ^( |. M5 `
/* Initialize MCASP1 */
* n) L  e4 u+ t- Z8 D5 ?( \' b    mcasp = &MCASP_MODULE_1;
/ W% V( _$ b; ?' R$ L& k. ]" a) x1 J    mcasp->regs->GBLCTL  = 0;       // Reset: n. d2 \- }; H2 f( d$ p
    mcasp->regs->RGBLCTL = 0;       // Reset RX0 R/ O/ }! e) D+ V
    mcasp->regs->XGBLCTL = 0;       // Reset TX
: B* P- F+ X+ L8 ]    mcasp->regs->PWRDEMU = 1;       // Free-running% z2 U4 P4 N/ r" o2 I
   // configure McASP0 receive registers
9 [( q8 Q9 [( _7 b6 C& v( R5 g) P    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used8 `; H0 ]% T" h3 g0 V- u
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus1 F# ?/ r0 _; A# y
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word9 v7 ]0 X1 l( N, k) z1 ~2 M; p( n
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)( i' L5 D' n* F; ?: A
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)6 i0 x: o0 m' t- F) I" F+ R
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1! k" ~. Z: ?6 {$ A' h- z+ J. r
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
; t5 i8 y$ K0 g    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# f2 R. ?; I4 @" ], \1 g6 `7 J9 j& U8 S: f
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used# @# Y0 a: v8 R$ n
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; F$ B1 Z9 }9 F    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word3 T% ]* n5 g3 [2 s# A1 ?
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
' K- ?" X! F! {+ @    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK5 h2 s+ g+ O& Y( \9 _* s+ z( I, ~
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1  z7 [& h7 w7 Q# k: h) G* |
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit2 k0 z" K, H5 v) [. w+ A2 n* x
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! A- z+ ~! M' }" D; d1 ?% v( P2 ?% N: |  _" G4 j) h4 w( S
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
. e& _6 O" P/ q$ w9 X! V" c0 Y* y    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT0 K7 x* l% R5 r% j0 Z! @$ h
    mcasp->regs->PFUNC      = 0;          // All MCASPs- p, i$ D2 ]' @$ p4 S
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
8 v' m) m! q" z/ K( T" h2 \
# i9 w' n: ~/ _1 R8 P    mcasp->regs->DITCTL     = 0x00000000; // Not used
$ K% _( r% u  D$ y% W. f    mcasp->regs->DLBCTL     = 0x00000000; // Not used
  b! B5 W) M$ |; z5 T1 B    mcasp->regs->AMUTE      = 0x00000000; // Not used
, y4 `: x: P) r' Z4 G% R- V3 Y# F! b+ q( P0 x$ D7 |* B9 j
/* Starting sections of the McASP*/+ y$ p+ R$ x2 c# ~# E
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 0 ~" G9 D( J" }1 K; w
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
, O; C( ]  w. i# ]' y! x+ v    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 5 `2 e# t7 X+ Z& V1 O
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
! `2 j* g* {5 U0 b3 D% |# l
' V& v2 I- Y9 A2 ~8 l    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
  @" _/ @# M  P    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );* f( f! T1 y9 M/ D5 c
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ; f6 Y8 ]1 X* {/ t; p
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );1 p' h+ Q2 e0 D/ m. {2 ^
( |# H. \. o; {' k; {
    mcasp->regs->XSTAT = 0x0000ffff;
& X# e/ q; a6 c$ Q& Q    mcasp->regs->RSTAT = 0x0000ffff;
) _, C  ?. z9 j: ]' v2 i- Y* M" Z
' E/ i' ^. h0 f' V7 G    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;+ F' r7 {( @* t) i& ?( N
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
% O* U2 ?9 L* B' Z! j    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
; ~+ F9 _2 v5 \9 J    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );/ E. [5 E7 @  s  |
+ a+ L* _7 \! O
    /* Write a 0, so that no underrun occurs after releasing the state machine */
$ M8 Z# H) H% K7 A    mcasp->regs->XBUF5 = 0;
9 S3 P# M/ O' R* q    mcasp->regs->RBUF0 = 0;
3 Z! ^% y0 `/ @$ B. c% }- y1 A$ Q* A; J/ e& @
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; . w" @6 Y  D; v6 a; c
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
& ?  V8 g# B* H3 F% t' d5 F) n    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; + r& @3 [, L# z# ^3 u) `7 P
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
& X% y8 |! t, @3 n, G  o- C9 ^* ^7 s& V) F6 e' E8 V
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; * D) j$ S  p6 Z. t4 C
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );6 J! G# {& }+ F
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
& Y- d/ {2 C  Q1 x7 a' m- o    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );& K) r, \7 N  `) L: h9 x# g

9 ?# t3 W1 ^! h8 ?2 y  h    CSR = 0x0000;
9 y+ d( ?9 J, I, B! p" l    INTC_INTMUX1 = 0x3d;6 D% ?+ ]) a6 K: a1 [2 }3 o  ~" ~2 S
    ISTP = (unsigned int)vectors;4 \# o# K* ^- `, {8 V! P% o
    ICR = 0xFFF0;  # s4 ]" r0 ^( p- ~& m0 }- x
    IER |= 0x12;  0 i# ?8 M2 ?) S, ^& m( i
    CSR |= 0x01;  & o- c  P3 h; J! ]7 g' H  _

; E. f* w" V, d$ ]0 N" T* q- E& s9 P" g) }

0 `1 O1 j# g& P5 d% h还有就是两个输入输出函数:2 k  t- m% E( w, _& d/ J1 I
void output_sample(Int32 out_data)2 P- @6 D" e1 k5 v! ?) Y. @, o$ P
{7 ]' Q% R# d; E) W1 s! X; {/ s0 h
  AIC31_data.uint = out_data;  / q% }8 o- C! B# P7 M
  MCASP1_XBUF5_32BIT = AIC31_data.uint;4 k8 O5 [7 t- N. c' m, x- q& h
}' @, k( O9 N  ?9 X$ T& D: H
5 V( v) q% G9 L9 x% w4 L8 M
Int32 input_sample(void)
; e8 F8 C2 v6 Q3 `{  
% Z$ t/ e, g$ U; y  AIC31_data.uint = MCASP1_RBUF0_32BIT;
7 ^8 o& Y9 y$ v1 @: t  return (AIC31_data.uint);
. k$ A6 V5 H0 j( M0 [}* G8 h, n1 E. x9 u8 r: S: [
1 R3 A: Y, d" m$ \$ j; X" w; v) B+ V

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




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