|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
1 ^! k4 z$ y, ^) N- ?. Y$ b3 Omain文件:
! o( |5 Q5 ]0 f8 O5 ]1 Q' Cinterrupt void interrupt4(void) : ~( `# o6 \0 H; I' N
{
0 s5 ^3 X2 D3 J3 ~' N: _3 l Uint32 sample;
+ T7 o/ Z3 j {$ o' A m2 G) [ M& [; v( L; g' c! v$ j. W; d
sample = input_sample(); // read L + R samples from ADC
2 \! ]8 \7 Q& [0 k! B: ` output_sample(sample); // write L + R samples to DAC
8 ]) u2 h, ]2 M4 @ return;
6 N& t0 g" }' i5 y* g: z3 P. E}
h' C8 x7 H* e0 @9 [$ q- F
1 `& J' b: V4 G" |. e; F5 hint main( void )3 u6 }- k5 N- Z' W8 q# x% G
{
M+ ~. t- R# h1 @5 Z7 J0 f
; \* S! J- t1 C& G9 I /* Initialize BSL */
4 L8 b8 E5 z7 ~! U4 N EVMC6747_init( );3 R i$ n3 q: e+ y
/* Call evmc6747_intr function */
% B* t+ \& Y, t+ G9 F8 \4 M aic3106_init( );- m% p. ^- [) i1 y: B0 d g
while(1);
9 i ^( F4 q0 j4 j8 u j2 }}
0 B) Y+ U. E( ?9 w9 o7 o0 l
9 L/ ?3 y, r$ w+ u! d, f. b8 R
2 R- E& X. P$ eaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
( D6 `& b5 F% _ e/ S; \/* Initialize MCASP1 */; u. Q$ t0 K8 q) ~; S
mcasp = &MCASP_MODULE_1;
/ X- W6 e; x5 f2 F* n# t' W, B mcasp->regs->GBLCTL = 0; // Reset
, v2 j& K _( ~0 L" w mcasp->regs->RGBLCTL = 0; // Reset RX
0 [/ h7 R- {! @' {0 ` mcasp->regs->XGBLCTL = 0; // Reset TX2 f: G; ~- X# T2 d; q' a4 W0 Y# F
mcasp->regs->PWRDEMU = 1; // Free-running3 ?8 b6 ] b8 R1 r, N7 ~5 n5 v
// configure McASP0 receive registers
3 { a' N/ x& q5 m mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used* S0 v* p9 g: J" {5 N* S/ \
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus; ^+ I( l! _0 J9 J/ y6 ]
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
+ y' G7 K" o- I. L mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)2 s3 S2 Z+ a0 P9 Q; N
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
! Q& o4 j8 u! }3 _8 h7 L$ [3 K mcasp->regs->RTDM = 0x00000003; // Slots 0,18 r, ^( _4 c1 j6 [8 `2 F
mcasp->regs->RINTCTL = 0x00000000; // Not used
* j U0 X% w: X! u* P0 F; v- u mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
D: R$ O- f) B2 K5 I7 i8 |3 _/ d8 l+ ^( r; `9 E
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
0 e/ L; t/ G) S5 r* K mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus* `; h8 p- J7 i ]6 B: S3 a5 l7 \
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
" ?: a; W/ n1 n9 M3 e/ |- Z mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16* R' Z) x+ a/ V- i4 U4 G, B
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
$ n0 a0 F3 E; Q3 y1 ?) V, g mcasp->regs->XTDM = 0x00000003; // Slots 0,1
8 }' h: S2 `# s* v mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
) R- W1 j/ e! j1 l" W/ O! L mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 ~4 {+ u8 R, Y4 C' Q# Z% \+ c
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
$ N0 `6 s% T" }0 N mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
/ Z8 o3 d5 i7 s! D- q I8 H2 K' B- g mcasp->regs->PFUNC = 0; // All MCASPs% f$ U. F5 ?% m* G/ m& ~
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
9 O( v/ f" Z+ b7 s- u6 [; r* u0 C3 v4 ]
mcasp->regs->DITCTL = 0x00000000; // Not used z( `8 i* w8 m* M* I7 K. M
mcasp->regs->DLBCTL = 0x00000000; // Not used
2 D5 V% K+ t1 @2 S4 ^ mcasp->regs->AMUTE = 0x00000000; // Not used, a5 N. K0 m. P3 r/ o2 E
_5 X2 J) ~- Z7 B* m) M/* Starting sections of the McASP*/& X9 _8 z( a2 s- h$ ^) V, p
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
) \! u( k/ _0 b2 S5 W) E while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
$ ]- i) w* e" L, g mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
3 |0 w* N8 w8 q4 z7 } while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
% x% z7 u2 L. X" f7 [ A Y' e) P' p: s% w9 l" ^; r1 k+ u' o
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; . [8 I! Z& _8 H- H( v8 E3 p. t1 a4 y1 u
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );3 Q" W0 t7 ^# u/ s$ C
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ( I/ x% m# z m- e; b, U: i. w3 s F: `/ r
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );9 [0 |$ w$ i- V" ?
0 I2 V3 Q' u& T
mcasp->regs->XSTAT = 0x0000ffff;
6 v. Q& g5 T. p' \3 e mcasp->regs->RSTAT = 0x0000ffff;
# n" d6 ?( t7 ?. |5 P/ _
7 M4 c8 m% |0 G/ S mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
" @/ s! p, E+ c8 o while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
, G: |4 o# g* f+ X) h E+ E. L mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 0 k$ X+ L( u! V* |4 O( _$ Q7 ^& L0 c
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
( _4 C) g9 m2 o4 i8 n
. J t( V4 |* X& s w. N3 f$ R /* Write a 0, so that no underrun occurs after releasing the state machine */" H6 l- }6 ^" v' H
mcasp->regs->XBUF5 = 0;5 f! u+ A _" D4 J7 c7 R- D: B/ s7 D: `
mcasp->regs->RBUF0 = 0;+ ]! a# u$ }" u
% ~3 D5 l* G4 _: T' d) B mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
4 E ~0 M" a; m" z while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
# N( b. Q- X( v. E mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; / S0 O8 A, i# v& k8 V) m- _* d
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );) e& D* m* ?! ]" S# u
) a/ i1 U: T' J) b9 l
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
* J7 l- |, O9 b- k' [! [5 i w while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
+ Y! i" B3 Q. n: S mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; * B& {2 |0 M% u, T
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );) F: V; m. b: @+ a* l+ \$ f
9 r5 ?, G3 t4 e3 l: I
CSR = 0x0000;6 c) [3 d9 _4 Z* P' A7 _4 @
INTC_INTMUX1 = 0x3d;$ K/ ~$ E8 i9 t" \4 t5 r; K
ISTP = (unsigned int)vectors;
7 @: s7 _& t1 |# \0 U7 i! Z+ ?5 n ICR = 0xFFF0; ; C/ m+ U* Q) w4 L
IER |= 0x12;
' p" X# e0 @3 h' S+ g2 O4 w CSR |= 0x01; + X. \+ |) M% |: T% b9 Q! A
, H/ l6 [. ]/ P! H* P8 y5 F8 Q' d5 W. j5 J
/ I& ~8 ^, R1 o1 e) R& @3 G还有就是两个输入输出函数:1 k/ y4 Q6 c7 w4 a6 N7 x
void output_sample(Int32 out_data)8 U4 [# K( E Y. C* B. u
{
$ S- k+ ?- |8 c8 O$ w3 B5 B AIC31_data.uint = out_data;
6 k( { N' u& C- R( b: _$ M MCASP1_XBUF5_32BIT = AIC31_data.uint;1 |8 M+ m" ?% C" p+ O
}. |) v# y/ w$ A
, T* t! d, ]) l1 W2 Q! O9 L9 ]Int32 input_sample(void)
' t2 B, k8 a& [9 N) ]# H% d{ 2 P7 L# v% {) L% Z q( @
AIC31_data.uint = MCASP1_RBUF0_32BIT;
9 f2 K# z! v! ~' d, t return (AIC31_data.uint);
8 D" w Y7 F, T5 K3 P6 b# m}, a# s9 X) C( @7 E/ @: m
0 c3 j) I" g7 S5 i9 A$ p- h/ O |
|