|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:" b- H! m6 r, r! }4 O% t: j0 W
main文件:' u F% q" b- q; Z7 u( W
interrupt void interrupt4(void)
4 ^1 a$ z5 O0 O{
3 ^. f5 g. `9 u# x: i Uint32 sample;
% w$ e* B0 Q* Z# ~) x- n0 h3 ] l4 }' }$ s' Y
sample = input_sample(); // read L + R samples from ADC2 U" P+ @) g5 D: M+ ?0 H
output_sample(sample); // write L + R samples to DAC 3 R2 k7 ]4 U8 E, i) J
return;
5 r* K; |4 S: E) v}
9 V7 w% H$ I1 Y" `! F" O
: O1 v3 c& d0 O$ K' U. aint main( void ). D* ^$ D6 ]" n' X2 m. G0 j# a
{- E$ Z1 N' c% ^: T: D
% b6 k. H" k; \# [' I /* Initialize BSL */
: j+ p: L4 _ f+ ~2 W6 O7 j EVMC6747_init( );) U9 q; l8 A2 }, Z- Z7 E6 H
/* Call evmc6747_intr function */# y1 i6 g# F" z: `
aic3106_init( );
& n0 R1 n7 r4 P3 w. V while(1);8 p0 X3 B8 B, t1 e
}
! A- E: [* H9 w- i% K5 u$ h+ x
3 Z7 M1 q1 z) H& E# W7 N) B1 m$ j! P
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题6 R3 C- Y: o; m4 W& T- p
/* Initialize MCASP1 */
" |6 x d! R' V0 I& V; R' V mcasp = &MCASP_MODULE_1;
+ ~# l# ?) Z( X' N% M+ k, a2 Y8 j mcasp->regs->GBLCTL = 0; // Reset
, W" N$ F6 D) ~3 C5 ? t N# k: w mcasp->regs->RGBLCTL = 0; // Reset RX6 c* t6 D# X1 `; B, _- Y* G
mcasp->regs->XGBLCTL = 0; // Reset TX- A% E3 E+ t: ^5 a! x
mcasp->regs->PWRDEMU = 1; // Free-running
/ D$ Q6 {4 H' l# t" H5 X" d // configure McASP0 receive registers
3 w5 A6 T/ ~; a# t! s6 | mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used& W) @' q& U5 O% _9 M1 q# W) \
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 C* a a0 N: w mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word H( f) W v* T
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)+ E$ @$ B5 T2 w( T3 v
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
7 h* ?) o% I. j2 r* \- M! u mcasp->regs->RTDM = 0x00000003; // Slots 0,1
& V. ]* j' B) V1 l6 n mcasp->regs->RINTCTL = 0x00000000; // Not used
3 i- U. Z$ k. g, E, c( s mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 S& l$ Q; {% }* D& d
' n# J q# m. B$ R8 b+ t: H) D mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
S( b( v3 w& z* D! o; h: u mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus) N6 e0 |, z8 \0 N) j; @3 G
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
4 O! Q' ]. c, p) A8 F5 n( Z mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
3 G/ o5 P B. C# Z& y mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK Q2 J+ r4 z8 Q. _# `
mcasp->regs->XTDM = 0x00000003; // Slots 0,16 B! ~0 ~7 `, `6 X1 [
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit$ z4 d0 m3 r4 Q G
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256: i9 y2 V1 S# h' ~8 i, H/ N
( M0 i# m' ^- D' G! d+ c: Q( e mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN& q- k) S) G1 @7 K! d: S
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
f5 m V) i, G$ |4 a7 z, K mcasp->regs->PFUNC = 0; // All MCASPs: ]: e/ \0 v( O7 `9 D% ~8 t
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
: t5 A, w/ e8 J; J' ~& W
3 `' e# Y/ Y$ Y9 f4 @ O" T mcasp->regs->DITCTL = 0x00000000; // Not used
1 e' `$ i3 n& V. J mcasp->regs->DLBCTL = 0x00000000; // Not used
+ j, e& D8 \4 s. Z# n x5 I mcasp->regs->AMUTE = 0x00000000; // Not used
2 ^1 S! o6 b: D& O, L+ m. d# r! f
/* Starting sections of the McASP*/
4 X7 r; q! @. c, y6 c mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
# y+ `5 R1 K. b8 Q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); $ r1 E6 U- {4 T5 P8 j' K/ h+ Z
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
: t) E- M* d" s while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );9 }: R# ^! Y0 U6 \) @
. ^( W7 U- m4 v& Y; ?/ {! [5 {% x, \ mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; % @: c( @" H% W* u& s3 n: _ V5 Z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
- T$ C; X @6 G2 L8 n' b, {1 `) ` mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
: s j6 j( `" ~" c; E while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
7 Z: k$ O" h' J6 O, I M; U x6 P& x) q: S# p2 m
mcasp->regs->XSTAT = 0x0000ffff; 8 T' n; h2 q1 v1 Y& B t1 S
mcasp->regs->RSTAT = 0x0000ffff; ! o6 N( B+ Q, p
7 {" f$ b! [/ V0 H O
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;- ?' v' y# _ K- G4 v8 q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );$ x) A5 c0 m9 v! u/ F0 L
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
4 }/ r% g9 o+ a- ~ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
3 h8 `& u; \/ J# |6 I5 V1 V
/ k* c6 N" I, |. L/ `% \, ? /* Write a 0, so that no underrun occurs after releasing the state machine */
" b: k$ D) v9 c+ u: t o mcasp->regs->XBUF5 = 0;! x* ^0 Y6 d, q* n' |
mcasp->regs->RBUF0 = 0;
2 Q* P8 c' T* C/ T
F; E4 @ k5 I3 O, B mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
" {) N2 E3 O8 H+ a while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );% p( y( C+ k3 [; @' R' \
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
- @$ [! s0 F+ i8 @: _ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON ); s. @, M6 _$ n/ l
2 i. Y3 \4 |) p9 D
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 8 z& r8 ?" V A4 W/ S& u
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );5 ~+ c; H4 @9 F/ Z# |
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ( s/ M* T0 \* Y9 M( ^
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON ); `9 p0 b' R1 P" d# v
. Z, p6 a! |& u& F CSR = 0x0000;8 R7 r5 M1 |7 `
INTC_INTMUX1 = 0x3d;
* F; X o. J9 d2 D ISTP = (unsigned int)vectors;
; `3 J- \$ D6 J9 v, I( R ICR = 0xFFF0;
1 @/ K T+ _$ P IER |= 0x12;
3 w3 \$ L2 n7 O6 k7 l3 X- I6 n CSR |= 0x01; 9 o" S" k5 v$ I9 O* T9 c( O: z
: k+ e8 \6 A# P8 c# y
! G8 V2 x7 M. P: W
( `. `! F) U6 T1 A3 h4 }还有就是两个输入输出函数:
( d) Y6 S7 P; ?! p3 \& fvoid output_sample(Int32 out_data)1 Z2 j7 q1 |7 s u# b | S
{
8 j7 \; ^) k5 P X AIC31_data.uint = out_data; 6 y0 }4 t, ?! [4 X7 r* F8 \
MCASP1_XBUF5_32BIT = AIC31_data.uint;! O: @/ C0 r; V* L; v% S# B
}0 R) H$ V) B, k# p
" c/ S- x! m. f' i4 \
Int32 input_sample(void)
4 E9 H0 e/ {6 g4 g{ 0 Q8 g( l- i0 M, [- F
AIC31_data.uint = MCASP1_RBUF0_32BIT;$ x& L3 L! ^5 Y" `/ _' c; X$ i( N
return (AIC31_data.uint);
! c6 s' }6 s* s: @, I# j9 o}
- ^) p( H8 F4 f( F2 e" l! V2 |+ j$ t6 [
|
|