|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
6 J0 ^& q7 B7 e9 X6 ]; v5 }0 Wmain文件:, P" ^' w. _9 S2 `4 Q. s+ e0 {
interrupt void interrupt4(void) # [1 f2 A& \4 j5 u7 L7 s W+ t
{, N0 t) H" v8 G2 A7 h
Uint32 sample;1 c( Z/ A* D4 }* P5 [ l5 \
' `( @! L, g9 ]
sample = input_sample(); // read L + R samples from ADC' g5 ^* a$ s0 s; ]
output_sample(sample); // write L + R samples to DAC 5 J( g1 C D# ~0 s* v
return;- [7 w& x6 a* _; N6 h/ o+ s
}) ^) x2 p+ @. Z1 F& W, Q2 }% ?
7 l# a# x$ g$ Aint main( void )
" q" Q+ z- A% ]5 [1 T& ~3 F. @# ]' Y{% s4 P. I( ]# I0 f+ A
- X- ?5 v- T; @1 R* u /* Initialize BSL */8 q8 y* w7 g/ D* q6 u5 T B
EVMC6747_init( );$ x& ?/ j) {. T4 F; Z
/* Call evmc6747_intr function */
/ |4 g- [2 E& h9 D9 @ aic3106_init( );) J X$ ]; C" N4 x4 P
while(1);3 w/ K$ \- r/ ?
}
5 u2 c; K9 s& C. w+ R' p2 c
- _/ p. }9 m$ R; K6 q1 k9 A0 K `/ n
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题. W0 d( X' k1 {/ n, w$ J/ R
/* Initialize MCASP1 */6 t# w& {2 z+ @
mcasp = &MCASP_MODULE_1;
, U. ~; T7 [% X+ x mcasp->regs->GBLCTL = 0; // Reset- _% l* ]9 S* U; Q5 Y$ L
mcasp->regs->RGBLCTL = 0; // Reset RX
% c7 s/ B2 B; @. r# O* [/ J mcasp->regs->XGBLCTL = 0; // Reset TX
) |1 u$ v: K) I3 f' C, n mcasp->regs->PWRDEMU = 1; // Free-running8 h8 N9 C$ z2 r8 |/ D. d
// configure McASP0 receive registers6 L) c* T6 Q( @! w7 @# @ P9 [! V* {/ R
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
! X2 c, I- p4 a mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus N% M. Z `' a3 ]+ ? r
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
4 ], {: Z9 M. B mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
- ~6 e$ s; c- q9 v- I/ H( T9 W mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
/ i. |" a$ L$ d: t mcasp->regs->RTDM = 0x00000003; // Slots 0,14 J: j1 A5 \0 } M2 F/ K7 @
mcasp->regs->RINTCTL = 0x00000000; // Not used4 \& ]7 }/ N# y2 `% M/ t- W
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! u7 o1 w! W8 ?! }; @( G* {; I5 @; Y4 B( X
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used6 O& K! S4 M+ I) ]; |
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: q& X, j# s+ H2 z* Q+ M mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
/ R3 q- ?9 F# S0 \0 w mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
6 ~1 Y, d& ]6 z1 J: i6 f8 W" y mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK. y/ q5 C/ F1 c4 X' \( n% k
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
% K4 X, ]& k+ _6 m- ^ mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
9 q1 j6 s( I$ D- H C! b mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 d% v" D- I1 B
( d% s, i) B- m% O1 b mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
& u8 `3 ?% M; y; k# \. l B5 E4 Y- i mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT; M K, F, l3 ]- h/ O5 A
mcasp->regs->PFUNC = 0; // All MCASPs
8 l3 s, l+ z8 o* p6 g mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
6 q7 \; _, {' c4 Y( E1 S& u
* G6 E p6 V# h0 b mcasp->regs->DITCTL = 0x00000000; // Not used2 E$ ~: ?& p& p; e' O2 ?0 V5 h
mcasp->regs->DLBCTL = 0x00000000; // Not used4 d; a7 B) d: E* M/ d& x
mcasp->regs->AMUTE = 0x00000000; // Not used2 g5 e" W- u2 C- F( X
" B# L( w4 C9 O% Q2 h! J
/* Starting sections of the McASP*/
) t5 y" k6 o. \ q& G( w6 O mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
7 k2 X* x0 q7 g2 s% ? while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
8 c$ W/ S# }4 A# K$ k* L$ w: ^; Y- y mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; * K: I! D0 U: ^
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
* H7 C3 p$ N b/ f. J0 x, n, [
^, y2 s0 j1 r; v- ~( F mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ' }- x! d( I8 R; |$ F, _) |9 { R1 \
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
- {! ? B! {4 @ mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
1 m$ I. f& V8 f, F1 Y while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
5 w7 e1 J7 ~4 d
0 W3 [# Y! p4 _8 _$ C mcasp->regs->XSTAT = 0x0000ffff;
6 p" {- B4 t; i! I E; _ @; I mcasp->regs->RSTAT = 0x0000ffff;
- s2 j; z- W0 q( g+ C: l% Y% d; b8 f
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
/ \& q+ E T" o- N- m6 U while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
% f+ C. m9 N- D& a mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
$ X- |+ w9 }! L T. C7 V while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );5 O. S2 l5 R' {' C2 X, ~. ]
4 e$ Y2 P; F2 N: a /* Write a 0, so that no underrun occurs after releasing the state machine */0 c C$ [/ j- k( y
mcasp->regs->XBUF5 = 0;% R: N4 P& U# H- T. P0 x9 [
mcasp->regs->RBUF0 = 0;* j+ J: Z" l% D: M& |4 u
5 Y& x1 [- L8 t
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 6 t& K4 M7 R0 S. u$ _' ]# X2 h
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );" j. f- K# Q) M! Y A _: u
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
* {6 `$ N! [ j while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );2 v1 C( [; R4 ~) Q2 U. G3 H' j5 w
, i$ S! N2 B3 |2 j- C( M+ o mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; $ v, |$ I4 \6 M, N
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );& \0 {5 e+ x4 a2 x) ^
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; $ R4 v- K4 y' H. ]! o' K1 p( P
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );. ~2 y7 E' [, v" V7 |
; w% P2 X/ r0 \! e3 G
CSR = 0x0000;6 x7 S+ Y9 [9 N3 M, a
INTC_INTMUX1 = 0x3d;
2 B+ i1 u5 ]4 E ISTP = (unsigned int)vectors;# a; i# n u. d: w
ICR = 0xFFF0; ; n6 X% H- W0 A' B
IER |= 0x12;
: Q. a8 b6 ?" ~" L# \% ^ CSR |= 0x01; ; h+ m1 ~5 I9 m5 ~
% B4 [6 K0 N- z8 q' S1 \! B7 y) l
3 g( ~- v8 V4 Q8 p2 b
5 l% E o$ t" a8 m
还有就是两个输入输出函数:
6 f; `+ l4 |: e0 }& K/ K8 bvoid output_sample(Int32 out_data)& w1 S* N2 z( r' j M
{+ k4 K F- P4 g( {6 l4 d" D4 }" b
AIC31_data.uint = out_data;
: x4 h6 u- d) p m! U% f6 d MCASP1_XBUF5_32BIT = AIC31_data.uint;$ r a1 K/ ^! O2 L2 b) y/ e9 y
}
% i& ~0 O! S- i; ~
$ ]/ M2 ]& n" KInt32 input_sample(void)
4 i8 W0 C2 l& Z: q3 H% M{ & ~- j- C0 I8 U3 l. j( \
AIC31_data.uint = MCASP1_RBUF0_32BIT;
6 L# l' f( j; a% k/ B return (AIC31_data.uint);8 ?$ J: c4 ?3 x
}
: o" U9 q- \5 X/ @: V# v) {5 e; [ k8 m$ | a8 ?
|
|