|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
. x& @6 i; g1 p1 U! i/ pmain文件:
1 k! c/ x, ^$ _( Y# }) vinterrupt void interrupt4(void)
; k! ]4 J. F$ o- O2 a{
# } n T3 q/ F) Z3 ` Uint32 sample;
. d- }, O; h" ?2 R! a5 a
5 r( ~% L+ y* b: } sample = input_sample(); // read L + R samples from ADC
1 r( W+ |% p5 _5 W+ u output_sample(sample); // write L + R samples to DAC
4 j2 L4 C( q* Y% ~! c return;
6 {2 x }% K9 K7 m e0 |}* V Y& G, F7 U
% k/ }% g( G: \. U" n3 t
int main( void )' x7 s: H' `3 A) n9 N
{
6 s$ H- A9 G5 S* [: [- c
3 @ q% e% y& f. B; t /* Initialize BSL */
. f) z; F& r. h! t4 M0 _8 S EVMC6747_init( );
& @* {+ q# {4 U+ z /* Call evmc6747_intr function */
$ V# q+ ~6 l! R( `' ?8 h aic3106_init( );5 r0 V ~5 N' C
while(1);8 C' r( ?& z5 ~& K
}. f9 r0 z5 N3 j2 R& R! C7 }& p7 N
9 u! m; R& F& Q! Z
+ d& |* F6 e$ J6 N, ]
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题. q9 f1 R. j& V' {( ]1 L8 W# }
/* Initialize MCASP1 */
" i1 {: L; m8 f0 r' V( k' V mcasp = &MCASP_MODULE_1;
5 R. k" R! x; e. S b9 T mcasp->regs->GBLCTL = 0; // Reset
" W' h7 L# t8 X/ a+ s mcasp->regs->RGBLCTL = 0; // Reset RX6 [! T* C7 u( N6 X% l
mcasp->regs->XGBLCTL = 0; // Reset TX
# o2 O9 e* e1 S mcasp->regs->PWRDEMU = 1; // Free-running/ S, Q* y) H" D) H, A# m
// configure McASP0 receive registers! f/ F5 a' C1 m2 @
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
1 U6 b& s6 M' k0 ~; o mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus) J- x+ U8 J+ x- X, z; L: Y
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word1 K+ _' m9 ?. g1 M. Z4 h: A
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
8 {" H9 ^5 O1 @ mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
8 C0 W$ Y3 k* T d* V mcasp->regs->RTDM = 0x00000003; // Slots 0,1
1 U: x- b! Z; H; e& j mcasp->regs->RINTCTL = 0x00000000; // Not used
) w1 t8 h1 Z+ _7 z1 n7 |8 Y mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256- f! o. G! L4 s" N* e1 A1 O# s& h
" o0 v0 O3 y# k) `3 E
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
. r0 w, D3 Q, n$ m3 i$ H* u2 F mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus) l j; c- D( _( J$ K6 k1 m
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
/ m- D& `1 o! ?; Q7 t mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16, C+ O6 l+ K! ~; \: P" W7 y
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
y' ]5 q7 t: P$ Y mcasp->regs->XTDM = 0x00000003; // Slots 0,1 h& g+ y& N( d- ?, O$ e: l& ?4 S! h8 j
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
. u8 O0 J' i Y' O5 }0 {% ^1 i mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 O/ C6 r9 a. P$ o) H+ x
" A4 C& ]* Y- E$ l/ p5 a y mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN) z' k" Y4 @$ u5 S* A
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT* \1 R% g" Y- P7 ~$ |
mcasp->regs->PFUNC = 0; // All MCASPs
; `0 h0 b# J- a7 ~ mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
) H/ f- W# }! _4 g0 \( t
2 B3 z/ p# @7 @5 N7 r7 g A mcasp->regs->DITCTL = 0x00000000; // Not used4 V0 h/ P. P: W4 x& R" Q& Y
mcasp->regs->DLBCTL = 0x00000000; // Not used$ H! T6 c% m; N6 ]& ~. n" G
mcasp->regs->AMUTE = 0x00000000; // Not used
3 b$ Q( r% @+ p: E2 L" a% q( b2 i% Q, r6 A
/* Starting sections of the McASP*/
& F, l4 ?' z& U- O( R0 V! q mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
8 }+ A( g9 y K% F. v: t while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); " P7 B+ c0 o( j8 r) M
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 9 x- N- p' \5 Q" A$ R
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
7 o7 h% k' |' q& ?- D9 {% l2 q3 l8 C; f2 T5 [0 m
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
/ q0 K: {7 L6 ~ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );9 h/ o& S' \9 {# w# }; V
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 8 v+ X3 |8 I6 D, I. ]
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
8 V+ i. i! t$ Q" I$ V f( z+ l+ x# Z$ {9 D9 i5 |
mcasp->regs->XSTAT = 0x0000ffff; & [. x. v8 P# ^3 h. T& Y. X
mcasp->regs->RSTAT = 0x0000ffff;
2 _* M8 b: S0 L! z# k7 [; e* h n; H2 [8 U+ h- o
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;0 R, h* R, P: v5 N4 i2 w4 j' N5 ?" J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
$ o! k/ H/ d1 m' n mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; , _+ E- ^5 L( B: u5 `
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );# {" r. H) i: k" K9 j+ k- P
$ l; Y4 ^2 M1 u* p /* Write a 0, so that no underrun occurs after releasing the state machine */
7 R1 y- h4 E. z' q! u V mcasp->regs->XBUF5 = 0;8 r) ^. S- U: P2 s2 @
mcasp->regs->RBUF0 = 0;
. q5 Q& G5 o0 @
7 v6 k8 b0 [9 E7 ? mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ' ]& G: B/ y! I M& M
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
0 M4 f+ ^! Z" B, c# j* B P& } mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
4 C$ U0 M- L/ F. g- Q9 W8 @" q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
# t @9 {7 X: Y0 \. Z
9 @6 L6 {: p2 ?7 y. |" B- A8 } mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
7 P% Y4 `# g+ S: m while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
1 ~8 x" f. J* A& _% F mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
5 ]6 `# {- x$ o: F$ Q" ~. D while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
' }; Z: T/ M* I# L/ C Y/ a
% ]/ \, Y, z2 a/ x7 w; b CSR = 0x0000;- f; l/ U' K o
INTC_INTMUX1 = 0x3d;! p1 |6 n4 d5 a( {! b
ISTP = (unsigned int)vectors;9 t7 e. G: V( g% p
ICR = 0xFFF0; 8 }1 v5 a* t8 A$ R9 q5 t' C
IER |= 0x12; 4 f- q; k! f y+ L3 @& E2 C' j
CSR |= 0x01;
! ?6 m" _: N; |2 I6 w5 r0 ] c( D& s% D+ f
6 |: m% Q. f. V/ v9 G4 z- }. V0 m* C/ H+ f% V- h6 W/ N5 h
还有就是两个输入输出函数:* l( a8 |2 J& w E* [
void output_sample(Int32 out_data)
6 i/ Y+ l# ?( S9 I4 Z2 a# o$ M{$ b" U) m$ |) A; |; v, h x0 T
AIC31_data.uint = out_data; . Q3 J2 H% B: U4 w
MCASP1_XBUF5_32BIT = AIC31_data.uint;7 h) N n* p# o3 d
}; a0 z b3 S3 g. |
/ _! `, [: A3 K: {6 g% e" l
Int32 input_sample(void)
0 A6 h; N) f* V; b0 j{ 2 C3 ?7 Y2 ~- S$ P. R- |2 Z4 W
AIC31_data.uint = MCASP1_RBUF0_32BIT;
& ^1 d8 u! n+ L: V return (AIC31_data.uint);; o! \6 Z' |; h! v$ j; N! \6 K
}
( ]; Q0 u% u7 q1 H) h
) o) ~( I) H i |
|