|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:/ j9 m: R2 x) [+ \% ^8 B' k& D
main文件:( q, f6 R" H# s
interrupt void interrupt4(void)
+ u# `$ k$ I# l0 N6 x7 h8 v, g7 o{
3 R8 z8 f# p, k8 o* y Uint32 sample;6 d( d( @% K8 h, f1 t
& D% @! O/ a [6 G2 T5 e" {9 b sample = input_sample(); // read L + R samples from ADC
( T% a; }, d$ W6 g- P+ l( k output_sample(sample); // write L + R samples to DAC
m% M% q4 N( b2 i! d$ S return;
0 k6 y I( C' f& w% O6 ?* d}
; I% A; J6 u$ D8 o( p3 }$ _8 R" Y. t
, i0 H$ L/ A. t) F: Vint main( void )
" b2 e: U' T* Z; A+ i/ F{5 u5 M0 K! {8 r" W" [! p
$ J% {' y0 B% {+ ]+ p6 x- ` /* Initialize BSL */" ?& Q+ f$ \6 y$ `2 S5 G
EVMC6747_init( );
( \% g) T& l( p /* Call evmc6747_intr function */
" l( L- r) h$ I; O+ Z* [% K6 G aic3106_init( );. m- ?1 Y7 D! p0 z
while(1);1 ~! E' [2 R# F# C2 H0 V+ }
}7 g2 a4 X2 t; s
3 V! y) u9 M- r
) E7 A/ R% V* E( v2 V' f- Gaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
# X7 @" a3 C' N1 p. K. ?/ C/* Initialize MCASP1 */! c7 c. y8 w) }
mcasp = &MCASP_MODULE_1;
) ]' e2 v; P" H) o! ^+ D( Y mcasp->regs->GBLCTL = 0; // Reset$ i* A( { j; C) R" v7 _4 I
mcasp->regs->RGBLCTL = 0; // Reset RX+ X- e5 ~; C% a1 B
mcasp->regs->XGBLCTL = 0; // Reset TX
. [' _8 e+ b' g) A mcasp->regs->PWRDEMU = 1; // Free-running) ^. d6 Z4 @6 ` K+ h! L
// configure McASP0 receive registers5 X' ^( k+ b/ L6 {
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
$ H3 x% B/ O" |9 ] mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus2 L) v- X5 E. w- x3 V+ j
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word* ~# I7 \/ ~ a7 p9 V
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side); {! J: R$ T' B5 f7 c1 S5 D
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)4 g3 Y( U% t5 ]3 d% C; k, [
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
8 ]8 _5 c( b: h0 {& n4 _ mcasp->regs->RINTCTL = 0x00000000; // Not used
V! ]6 S! E1 L( I! U/ _ mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: x5 O9 f, v; G" K. I# Z3 G* q+ l/ ^' \+ L* I9 M# \
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
# ~" e; U6 G- V- n6 v mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus/ r0 f! A' a3 P
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word8 t5 s# d/ A" h0 |* w- e4 E. Q
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
& {1 e7 A+ x$ J+ D mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK1 g# u+ @/ w9 s/ b7 s
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
; S, Y2 ^; Z7 P. n# u" ? mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
7 Q g6 |. i' N* T' y4 d A; [ mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2564 J( ?- {; h/ e* i" a1 _
% d$ j w1 g2 L, ~2 J: M6 J mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN- v( B1 X! R0 B. U3 _2 R7 A0 z
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
4 C7 j/ O, Z2 N* [# X T mcasp->regs->PFUNC = 0; // All MCASPs
1 U1 U( M: L* M5 L. P mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
# B/ j- w* ]: w8 V0 @3 n
$ _# g* H4 w; M e4 K4 e; l j4 ^ mcasp->regs->DITCTL = 0x00000000; // Not used6 `8 I1 l( P$ ^/ g4 I
mcasp->regs->DLBCTL = 0x00000000; // Not used' o" B2 ^$ c9 l9 C
mcasp->regs->AMUTE = 0x00000000; // Not used
. A1 c& p% d1 O- ~4 U# }+ c- P# k( z7 J4 p
/* Starting sections of the McASP*/5 \8 H8 _" O7 R* b2 k4 w5 c
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 7 j- p9 C/ z/ S; x; b
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
W; x+ y4 `, D9 w7 `$ ~ mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; L/ m& K: w( `
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
+ Z2 ]- I0 P. y
# O/ I* P" Z6 r5 F& ]5 c mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
: |- P) M$ a8 C- g b3 I2 [; y while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );8 z: U9 ~2 j* p8 o1 v" T+ _
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 8 P- n. j# Q4 S% p+ H
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );$ E1 h2 T5 O. `! j
/ s4 U! G, E' Z) x1 t* A( J: {
mcasp->regs->XSTAT = 0x0000ffff;
$ `$ y3 O/ J! ? mcasp->regs->RSTAT = 0x0000ffff;
5 a! ?9 V4 [3 P1 W' L6 K" D% I+ r$ T! l: S9 G* B
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
6 m5 G4 f$ P* D6 N7 Y( r& \1 e, u while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
7 B- c% C" G, v mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 8 w6 Y F' a" K* t
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );; p8 q1 s/ p: v2 }6 P! Y
4 u: C# Z$ i0 L1 Y5 E" j: ] /* Write a 0, so that no underrun occurs after releasing the state machine */+ i2 X3 w7 U, Q) D3 J' U2 ~! A
mcasp->regs->XBUF5 = 0;
( r' ~( n4 f" p F' @ mcasp->regs->RBUF0 = 0;! b ^' F+ f, L6 [4 r s
" q0 H( l8 n& b& R) \ mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
: i9 O9 ?2 j+ w, | while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
e1 Q6 l* ^( d, q! @3 k: m1 ~ mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; / N0 c3 ]' e* g: H1 w7 s+ L9 [
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
8 K; n3 r5 @+ s9 t
8 s2 ~* x6 H! d# d- _0 y mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 4 O9 ~# k6 r! q7 W* f. y; H
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );, y: V7 }- S" J
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ! O1 R y, C3 i. ^% F8 K7 L
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );) o8 p$ }! ^) A
" I: X: }. e w# t$ m4 ]4 U6 I. U
CSR = 0x0000;
) j' H/ `* {( D1 L) w( [ INTC_INTMUX1 = 0x3d;2 Q) C0 o7 ?' F7 y5 l1 M
ISTP = (unsigned int)vectors;6 G+ n; t9 ~5 X6 a' Q& s
ICR = 0xFFF0;
+ b& h; p8 \ w* m. V IER |= 0x12;
% e1 k# @2 ]+ b% [; {: U" q CSR |= 0x01;
# z. p; J- b, v5 E J5 V9 N8 q/ Z7 v8 \
% h% ]0 C3 V7 n* c! X9 }- M. a" \
还有就是两个输入输出函数:
) o7 l2 s$ ]( xvoid output_sample(Int32 out_data)
9 W/ l* r0 y: ~" O6 {! |1 @{" t' o/ X+ b) A, \
AIC31_data.uint = out_data; / J1 G( i" \" ~/ z" F9 x# l
MCASP1_XBUF5_32BIT = AIC31_data.uint;
5 e! c3 M" j' [}! T" W) y# \3 Q
+ S* t+ h) E5 R, m. h7 P5 ]3 R$ eInt32 input_sample(void); @' ?( a+ A+ b8 y {. m
{
, @) f: G8 b+ j U5 C5 b2 t7 {- I AIC31_data.uint = MCASP1_RBUF0_32BIT;
& n! l! L d& F' q return (AIC31_data.uint);
$ r8 ~ j/ N; A/ g& a& S( e& y}, h( M3 y2 n2 I
) ^. g9 s0 Z# a
|
|