|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
5 j8 }5 N7 K1 s* ^/ P* @8 O# g: Zmain文件:
7 \( \. `4 j- W9 T7 iinterrupt void interrupt4(void) + v& U6 v n/ p$ j2 t' I1 r. k
{
) s9 F# n0 D1 }4 M, v Uint32 sample;- Y+ K$ r: K) K/ E2 }9 D) M
( ^& d( E; I, v0 {. a) Z* D" ~! K sample = input_sample(); // read L + R samples from ADC" j3 g. O2 Q4 x3 @# l
output_sample(sample); // write L + R samples to DAC
$ [" O* z0 |% R+ p( R+ E; @9 s return;
) n/ {) x6 D, K7 h W9 k5 J}+ d0 N! u, [* l% y9 P4 u$ D
6 f$ Z( u& S9 o
int main( void )' O3 i4 u5 P9 P0 [6 y
{* }( ~1 q3 `0 C2 h& b
% n& Q5 P# h; f- c) R( ~ /* Initialize BSL */" }9 b4 n. p( {
EVMC6747_init( );0 y. O5 q$ m0 {
/* Call evmc6747_intr function */% e; ~* _/ O8 Q, J
aic3106_init( );
8 o' Q6 E2 f' J) U2 m7 {1 G( w4 h while(1);) x% u* l4 i& ~
}
8 R' A! H1 a" \# T* v1 e* I4 ?$ C. ]; u: T$ N) S: P) u, I
5 P R: h: r0 q( s
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
" o* |& M5 l* h; ]" k- E' g- ^' g: W/* Initialize MCASP1 */
5 C( I+ @5 b8 U i mcasp = &MCASP_MODULE_1;
6 `+ ]7 F! a5 \. K# m mcasp->regs->GBLCTL = 0; // Reset8 I$ v. X3 p% ?7 k( W& N" `. v0 V
mcasp->regs->RGBLCTL = 0; // Reset RX D$ ~3 q* V0 ]2 w. M: a* X
mcasp->regs->XGBLCTL = 0; // Reset TX4 n7 A7 I% V7 A* B9 F8 c
mcasp->regs->PWRDEMU = 1; // Free-running7 j% B' M4 U, L& y
// configure McASP0 receive registers
! J/ V0 X. j- x- o: I) s) V mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used" J: K1 E5 g# t4 d, B2 ^) L o9 p
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus6 i. b8 ^$ a' H& t6 y* G+ g! m
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
! H, T# z1 p$ _/ w7 R# ~. t5 S5 D mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
# r! q1 s1 @5 \ mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
* u3 ~/ h# t9 F1 ~ mcasp->regs->RTDM = 0x00000003; // Slots 0,14 M- F0 [4 m- c, Y' V; f' I* t
mcasp->regs->RINTCTL = 0x00000000; // Not used
) X4 D* P- o. H; f) x9 Y; | mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
i0 m; V7 X# C9 m1 [+ H# O2 i: n' b: O# h; C. {# v' X9 p
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used2 B, I7 q2 y/ p* v+ W5 i* n( X2 m
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% \ T# E, H( h; Y) _, m+ G" S mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
+ A; W; w1 x# g5 v* R9 U mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-162 U8 d* y( w* p4 {! p, U) A3 j
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
% i/ _) h- b2 H9 M7 y mcasp->regs->XTDM = 0x00000003; // Slots 0,1
+ w2 A8 t `) `5 H6 G+ L mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit8 G6 A9 Y+ `( T' \3 _
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 R* X+ E1 r; ?, T$ C! b1 g* a1 A! T! H, D4 w! t
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
$ Y9 i5 [ q a' n+ C8 g mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
X; {. ?, h0 N4 _3 T) g% D mcasp->regs->PFUNC = 0; // All MCASPs
6 O7 N' b- x; h/ G mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX10 \6 ^ ~" E4 ^' Q; J( _- `
* o: b( U6 r! L. [* H mcasp->regs->DITCTL = 0x00000000; // Not used, E6 ? @$ E+ v! C4 y9 O
mcasp->regs->DLBCTL = 0x00000000; // Not used
: f& ?+ V. @" q: k mcasp->regs->AMUTE = 0x00000000; // Not used
. x# M7 E+ y2 r( ]! U
. ~4 V: m+ P& P2 J" \/* Starting sections of the McASP*/
4 N$ P+ Q" a; }/ d5 l mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
4 B- ] ?* x5 v( w' Q+ V while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); + ~. h& T z8 x7 T$ p3 ~
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; , @9 C; |$ q9 @4 r* L+ c% y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );' t6 A3 ~2 \- ]1 c/ o- U
$ F! F Y1 M& B" B) ?- _8 Y mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
3 o* Y" }1 H) E% {: C4 Y5 ?; K# ] while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
& }5 M. N: e5 y2 P. T" |# t mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; * K, ]9 j8 i" \3 @, |. N( n
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
5 L9 ~+ ~0 H7 e6 G3 p" e& z+ a0 r1 J3 |7 W) R
mcasp->regs->XSTAT = 0x0000ffff; ' g+ P% B% l* E; B/ N
mcasp->regs->RSTAT = 0x0000ffff;
u- j+ q7 X6 f& P9 X, A4 q; l) C3 q1 z& p2 p/ J' r' J, e3 ?: D
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
# Z2 l5 C# t7 l; L( y3 V while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
" [4 x8 b5 ^5 H$ @. J% _8 [ mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; $ p+ I" b( ~3 x7 x6 S9 J
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );$ \- ~+ ^9 x' ~3 O: J, K& _: [+ e
~6 L4 w; b2 H9 `; s: s /* Write a 0, so that no underrun occurs after releasing the state machine */' d% A$ g8 o# e* c! P9 Q
mcasp->regs->XBUF5 = 0;
' h5 A H S9 Y: v. B mcasp->regs->RBUF0 = 0;
6 d! N1 R, M. s o0 m
7 A" G8 u. v4 y5 H, [ mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 1 y9 R, ^9 V. j" `* Q8 U! p5 k2 K
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );5 o( i) b% G/ `1 d0 o" K4 `
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ) g, o0 j3 {$ e: p
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );# a' q$ u5 q) T+ f
. M7 Q3 |1 b: B& ^. R$ U2 d: Z mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; & O0 \$ K3 w6 E0 \4 z; D1 `8 v) {4 V
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );, }: @# o% v) o* `6 D, C6 N
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 1 q/ M7 d3 K/ Z& M2 t
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );+ ? s" H( R2 a S" n
h! S" F/ P r( u( H6 n
CSR = 0x0000;
4 p9 L; E5 B. I0 ^ g3 Q) |0 J INTC_INTMUX1 = 0x3d;) z- K+ Y) U; u! k6 P& f6 Y0 z
ISTP = (unsigned int)vectors;3 I! Q/ y8 M1 X! y) L
ICR = 0xFFF0; 7 ?+ r- }( e" Z
IER |= 0x12;
$ e+ ^- ?; T1 r6 i. x CSR |= 0x01; # k2 R; \; V5 t) a
. o. h9 P% P& Z* ^8 z# i
# q7 L7 _2 z+ x) m9 C1 H
% b' c' a3 }% i( q. W还有就是两个输入输出函数:
: F$ x! [8 h0 lvoid output_sample(Int32 out_data)
% O% D4 u/ Q2 D) I+ J{0 N* R8 U+ c2 Z+ Y+ ~. l
AIC31_data.uint = out_data;
& r5 F# v0 H3 h MCASP1_XBUF5_32BIT = AIC31_data.uint;0 T1 `0 k' k# Z5 ~* G9 `% M3 O( C
}
- X2 V) T! u Q9 R5 q3 }( x5 O# T/ D5 E; r* Z- H
Int32 input_sample(void); z! a `; A: S2 p) K6 M
{ : Y* ^2 [0 m5 Z3 c" m5 v
AIC31_data.uint = MCASP1_RBUF0_32BIT;% ^, A' w% e& [9 X/ ~: V
return (AIC31_data.uint);: r2 A7 x. p4 l- f, `
}8 e( a* y; Y, v& ^6 U. s
?- e" n! h+ K: g- b0 R |
|