嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:0 O+ \& |! S/ G4 g3 o  x2 v
main文件:
9 _$ }0 o7 u! E8 {: g9 {, sinterrupt void interrupt4(void)  8 d' V" w/ `  K  P8 [1 B2 H
{
( Y% R. h! D5 j6 m, B' g7 N! S2 b  Uint32 sample;
9 m1 K: t. o4 L) t+ H4 y0 [7 |. D5 z+ K
6 V. i" e4 E# o1 m. E  sample = input_sample(); // read L + R samples from ADC
0 K2 {1 ~7 K0 q. D" y8 e5 Z  j+ a  output_sample(sample);   // write L + R samples to DAC
% t7 h( t7 o( v7 w  return;
: A5 n/ q5 Y0 m. l% {5 L+ u}2 m# F% r% s4 {! n# k, |5 ^
/ F9 {% [3 u# `) H: Y
int main( void )7 ~; [4 ^; W3 H9 ]$ j6 y
{
- H  p2 ^/ ]; \1 M2 B- n. G( j, \2 ~9 R1 K
    /* Initialize BSL */
) w" x( v& a* T* ?6 |    EVMC6747_init( );
$ J7 D+ `) t, b4 M0 x        /* Call evmc6747_intr function */
! V/ O3 ?- f! V1 x" i! R    aic3106_init( );3 n& g6 O' ?% X  [  N* }
        while(1);3 q  l' \% y% M! m" J6 O! ^- K
}+ \4 v- ?" v* K# `/ p% b& q
! }' E; ]6 ]9 M/ Y0 D

$ Q$ c9 k" y  b# ^, R2 T: Saic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题8 \- n+ p# W' o+ e3 P! N8 L
/* Initialize MCASP1 */0 ?1 S) c6 a/ s4 Z
    mcasp = &MCASP_MODULE_1;
" b0 p: b6 E3 k% k' |2 j/ M    mcasp->regs->GBLCTL  = 0;       // Reset
: N& k. L9 U: v! c& f# c    mcasp->regs->RGBLCTL = 0;       // Reset RX; N" U- J& `& ?8 Z
    mcasp->regs->XGBLCTL = 0;       // Reset TX
2 P- b$ A" [  j: @    mcasp->regs->PWRDEMU = 1;       // Free-running% k8 I. x2 Y5 T7 o. Z
   // configure McASP0 receive registers4 ~2 F/ {% L/ R. _
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
' C8 z7 N/ }( Z) p3 s0 {    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 H5 X8 O9 H4 F# j5 Z    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word& W, J: I! `5 B; v" L
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
7 s- Q' k9 s" Z5 s; O    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side), ]& |* x) A8 o* Y
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1: I0 y' Z7 ?; L1 o; L
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
1 M4 e) j* R, C0 d2 K7 L    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
& r! ?, r2 g  M8 t1 ]: R7 V5 R, |0 E" K9 X+ G2 I- G1 o; Y8 H
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used- i% P7 r9 F) I
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus8 v8 u7 N. Q3 W$ O) Q, ?: ?
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
5 s( x2 N, G6 O' i* A    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
: \% u4 Q: D4 u/ e' Z" y, j    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
* h0 i- I  S& E. m1 H    mcasp->regs->XTDM       = 0x00000003; // Slots 0,16 @& N3 N: b( E7 u6 }' f  t
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit+ n0 U/ j, _: x: i" m: E$ S4 M
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256' B; [' ~. Y$ C+ H

1 \9 T# V8 E, ?5 C- y/ ~    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
. v  L- ]- O9 n$ W3 L0 d: l    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
7 _5 C* T1 H) Y    mcasp->regs->PFUNC      = 0;          // All MCASPs) h- G: \1 S; I+ W/ q4 |
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX12 Q( H1 @. T* X; e$ g# z4 X# y

! P8 c7 y* ]) V6 H1 Y5 t  F& Q0 R    mcasp->regs->DITCTL     = 0x00000000; // Not used
: S9 ?+ Q' F* [, X- M; b* f: m8 }    mcasp->regs->DLBCTL     = 0x00000000; // Not used
; k  o7 ], T8 s- I! L3 ?    mcasp->regs->AMUTE      = 0x00000000; // Not used4 t3 n% `& w  ^- s; Y3 q

2 p* r5 E0 M- c" G" b/* Starting sections of the McASP*/
; k- T& A! C( G' R( a    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; " N2 F- B: D  t. ~: u0 I
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
% d) r! E& ]% m* c6 h0 G" w) c    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
) `4 b; l) n- C- q; U6 J    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );( R1 n1 T6 ]0 `/ i* X7 I

# w+ l$ V! ^; p8 n/ I/ x: g    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; , J& B  S$ o) y: ^8 ?( \) j
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
3 B' r; l/ _4 C  D: j    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;   B% _5 D4 p% o( J' Q1 }
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
# d  a' r* ^) ^* w9 u- w( W6 D+ V8 ~. I  L1 _
    mcasp->regs->XSTAT = 0x0000ffff; ( e/ g; p3 `' v
    mcasp->regs->RSTAT = 0x0000ffff;   T$ ~8 O1 @$ Z
! S' o$ z1 G" h6 q
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
, O: `  `0 U+ ~) |, x  c4 _    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );* j1 X, f9 I" C. {7 ~, D* }
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
/ y/ P8 _, C& k1 w7 s    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );7 c" j1 n$ W  T" v8 C9 g0 C

% v% p9 [' i, q    /* Write a 0, so that no underrun occurs after releasing the state machine */
, Q, C+ V$ {) h6 F    mcasp->regs->XBUF5 = 0;9 u$ `1 T9 @& j6 W* b2 e
    mcasp->regs->RBUF0 = 0;
% P8 L. g9 k8 l
2 l8 ~! p. j: w4 x    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
8 t& {8 F: d6 c5 p    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );2 `5 h8 O7 e( x( i8 r3 N, P
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
) e6 D7 [4 `6 {( c) V    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );9 N. q, x5 k# t" u
& Q7 j% A0 y" e1 {3 z$ m
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; , V8 F: a; D0 |* v
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );$ n; k. g4 `1 i8 Z+ [% r& ]
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ' u& J% s$ w8 Z! P
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );4 a: v" g8 ]! ]3 _; |
) r% b( M2 M8 v! N; o
    CSR = 0x0000;. X( K4 N$ Z$ c- ~2 X3 N
    INTC_INTMUX1 = 0x3d;
, x# I2 h6 H- M$ \" l( o/ n    ISTP = (unsigned int)vectors;
# U$ t1 n- [& g& X$ R8 h    ICR = 0xFFF0;  : Q. f) Q% T7 |7 k% Q
    IER |= 0x12;  & t3 j1 ~& x! e6 l0 E
    CSR |= 0x01;  1 z$ w) A" H' v9 ]/ a5 ]( p

3 ?; M0 l. T9 K1 c; I8 @( z
5 |9 l% ^) H6 F! _  z( x' n1 I/ ~2 I- R  T2 b
还有就是两个输入输出函数:
( y3 I; E) @$ {% Hvoid output_sample(Int32 out_data)
7 W( n7 ^; K, U3 n4 b- d{
( D; A: f" h# A  |  AIC31_data.uint = out_data;  ; I( u; o0 e. f! B; w. n/ k
  MCASP1_XBUF5_32BIT = AIC31_data.uint;6 \+ D  M2 s6 v8 x4 _7 U/ v- l
}
, J' F; U7 m7 {7 [, ~* K  O; t9 Z; t- x6 B) @5 I. m* A4 n
Int32 input_sample(void), d1 c' |0 Y" x; P7 v  U& P
{  
. {3 ]  D9 X8 q  z  AIC31_data.uint = MCASP1_RBUF0_32BIT;
9 F1 ~; n4 e( Z& h9 u  return (AIC31_data.uint);
3 K5 }* L: c& Q: u}
: {! M5 N& M2 [  f( {* \9 W2 [4 L
7 x# k# c( R7 {% |0 ]
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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