|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:. T( Y* C3 g" ? b+ ]# s8 i' l- R0 D' G
main文件:
7 q$ M/ {; ]4 pinterrupt void interrupt4(void) 7 r7 x; O8 l: ~( x ]; V, G
{0 }3 ]0 D- J! v. r0 X5 w* t0 B/ I
Uint32 sample;4 v% N% S. R. o. ?4 R" \8 n. j, J
8 D/ l, U6 h! k, I7 k6 M
sample = input_sample(); // read L + R samples from ADC
3 f K5 \, u4 w c& ] output_sample(sample); // write L + R samples to DAC 3 V7 x [+ }. X4 b: B; |
return;
3 A9 p3 u* \# C- L/ K" u1 B5 i}
. I7 a/ k( k, ?1 \/ \% a6 G* c: x( ]6 F0 B) {
int main( void )
. A3 ?/ P! w' `5 a2 R# r{ L& f3 K/ W) M6 f, y
$ _& z! L b" g% u- [
/* Initialize BSL */# G( M1 s' |1 `1 ^9 A4 ?
EVMC6747_init( );
1 E" y9 t, V# I$ }3 ? ^( _5 C /* Call evmc6747_intr function */2 n) P |% J2 k+ t T: E) ]
aic3106_init( );( b7 t9 E8 t( Z( f% H
while(1);7 j( \4 Z$ ~1 K! m# p$ E5 M
}- p; u# W" q# ?6 D8 p1 T, K
" L7 N& L: \; l
8 X3 v: T, _2 A
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题3 I; C* |1 X$ g( ^1 {
/* Initialize MCASP1 */9 i% y5 t7 Z7 I, H
mcasp = &MCASP_MODULE_1;
, }2 s0 E' E5 J( Q1 p) Q mcasp->regs->GBLCTL = 0; // Reset
2 Y! ^: u. h4 o5 v+ @; U mcasp->regs->RGBLCTL = 0; // Reset RX
% u$ l. H# p# ?$ o4 {! I2 _3 ]( ~ mcasp->regs->XGBLCTL = 0; // Reset TX* S& B# C# E0 Z$ }# T" B) z- u
mcasp->regs->PWRDEMU = 1; // Free-running# h" j- M2 J6 v; Y2 A7 t) y3 S) H0 @
// configure McASP0 receive registers8 q) W: |5 P* r& [3 y
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used$ r% P- c* c& P+ L9 s
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" W- x/ v! q" Q, B mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word4 Y- j/ M7 z2 k
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)1 i& @# m6 d% g4 d; \$ J5 Y& |
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
3 ^. l* D/ u' l5 h% u( a: A+ ` mcasp->regs->RTDM = 0x00000003; // Slots 0,1% u3 X, }( ~4 w& Y
mcasp->regs->RINTCTL = 0x00000000; // Not used
) C, c# g% C: z% `- L mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256) Q& L- t$ X% ~2 Z+ M- v9 n
5 f3 E/ K$ x9 t8 l+ C8 c mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
8 B' v2 U1 a6 x# N9 B mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
# C/ w) t/ I( h7 C4 A! H mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word7 V% u1 D! L* l- A. m2 G, ]
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
5 D& ]: g6 P- F% s' c i# U+ \+ f mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK- f p% m* O; V
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
, e7 ^. u3 m/ T mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
5 t: |0 I8 g* E: q/ R mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ T2 _$ b4 x2 h: M5 K* ]+ T8 F( d9 B, ?9 r# n
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN" r) x1 C3 c% L2 ]! z$ C" H
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
0 _) Y2 l7 y3 ]$ H# i( _! N! } mcasp->regs->PFUNC = 0; // All MCASPs9 s: g0 O* j7 l9 j
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
& t2 [ R- z% z
, B4 q' C# ~: A; V- n; x' y mcasp->regs->DITCTL = 0x00000000; // Not used0 Q. n; K$ N# _7 _" O* e
mcasp->regs->DLBCTL = 0x00000000; // Not used
+ t( |8 L6 d' t' Z) _ mcasp->regs->AMUTE = 0x00000000; // Not used
- \+ X1 m( _3 p2 J- M2 p/ G; O$ R5 ~, e
/* Starting sections of the McASP*/) ~7 L' C4 {% d* m/ h [# h
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; * ]- H8 c& e/ c/ p$ C! H
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
- L X( M& _$ ~0 T# Y: S. l mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ) n4 k* a. J; D) `. Y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
$ ~+ P. x9 U) A" I+ Q+ z3 g" \0 h* x9 T8 F6 n; F$ \# E/ H, ^& o
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; % E* t! e2 n1 f+ c \4 a8 j
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );9 Y: i1 N& r( C X' E* q
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
1 C- t I9 I. G! E1 [8 u while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );/ w$ D9 i/ L3 c
! ~! L2 \& T1 L6 { v4 G mcasp->regs->XSTAT = 0x0000ffff; 2 B: T" U7 X% m9 {7 p
mcasp->regs->RSTAT = 0x0000ffff; ' S5 S, I* w3 n1 M$ f
) ]6 ^* u8 ?: ^; s. F; q
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;( }5 S7 q: P5 Z" q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
; Q5 S9 J1 c. p1 K' Q( k( H mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
% ]- m2 E; W$ V+ g while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
2 W0 A; ~0 m, r- a/ v' i5 w' f
3 { t/ I5 Z- _% [( A /* Write a 0, so that no underrun occurs after releasing the state machine */
9 I% ~1 C3 f* R, G mcasp->regs->XBUF5 = 0;1 L+ m: S. ?5 j6 ]
mcasp->regs->RBUF0 = 0;& k4 g `# P9 j9 }) R8 D5 a4 @
/ ?, u$ y: }& c5 c
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 4 h. b3 C# G4 ?7 [2 @( h
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
& d& N3 A3 g y: V mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
3 |, d2 Y# E+ e while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
! A d/ J8 }% w; M+ f8 J9 H' e; f. A* B8 H) B* B* P/ |* r
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; , r- n) j8 I* D# J7 A( W
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );/ ^( A- [1 q- R; v7 R- g
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
# ?% {- |% B+ r! g/ V while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );. ^5 v5 a, Q# z/ m# P
9 h; {3 c5 [5 h9 v
CSR = 0x0000;
3 F4 t" ^+ I; ` INTC_INTMUX1 = 0x3d;
& M. d6 r8 V. w3 S ISTP = (unsigned int)vectors;$ c p. m' t, l
ICR = 0xFFF0;
* }3 v/ h$ @+ a I IER |= 0x12;
; P( d5 F" I) H+ \) F# g CSR |= 0x01; ; ~; z& L1 u2 d) P6 _" L0 h$ ^2 z
& `$ E D) Z* o8 l$ a( {6 Y3 c4 f1 D5 x- ?4 x) u! W5 ~
' w1 m) N( y$ c; d0 x- ` O
还有就是两个输入输出函数:
) }1 s. \% y6 _void output_sample(Int32 out_data)7 D, }2 v/ w6 Y) E
{; ~' t% N0 p+ O
AIC31_data.uint = out_data;
% S7 F \: Q% i7 j& j MCASP1_XBUF5_32BIT = AIC31_data.uint;
5 ~9 c* R3 L5 d& V6 H U}+ d4 c. D+ \4 ]$ E. n' o
2 y( t& d9 v$ ^
Int32 input_sample(void)
2 Q/ N! F3 V0 _/ I& l4 q{ . _$ H5 J' [0 I' I; p0 b8 l
AIC31_data.uint = MCASP1_RBUF0_32BIT;" R) s7 x; ]+ v2 w& t
return (AIC31_data.uint);
8 s; e0 ?- R7 m}' o0 ?' d) `6 @8 H
% h0 Z& U% }9 I. U+ M
|
|