|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:0 C* V/ C i+ z0 j' S
main文件:7 M. W6 |* P# ^& A
interrupt void interrupt4(void)
0 O: `; \ p& c/ i) s& s2 r$ H{
8 H* G. Y0 d& Y; q% \3 m' B Uint32 sample;+ b( X$ w$ w" C) u' l2 ]
3 m$ E' k, {3 w; f/ c sample = input_sample(); // read L + R samples from ADC
: j& {' c. F* p0 |& W; d V+ S output_sample(sample); // write L + R samples to DAC
+ k0 `; Y( x5 x8 S return;4 [. Y: z; K! A9 p+ C
}8 k' z0 c' X& [6 ? T
' `7 V$ k5 c8 {6 Hint main( void ). x6 d5 T+ O6 Z' u. H
{
D- {6 O2 I# k/ v8 i ], v, @( `8 g! d! a3 n( A/ _4 ^: p6 b2 W3 J
/* Initialize BSL */
/ U" a+ V; p9 N% p; Z6 e EVMC6747_init( );
) b9 s5 h3 f9 i: J! A0 i" l /* Call evmc6747_intr function */! B) Z" Y* o6 ^1 x
aic3106_init( );
- {" Q5 O$ z- K/ } while(1);
1 D& B& f6 S2 i, }% q# L* r; X}
( p" v* \# a) J% E. Q3 z6 u% ?$ N' N
" y% }+ Z5 c! t$ D
$ E% m9 k- S& {9 a, {aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题2 {% F! I8 n3 n! o, ~) \
/* Initialize MCASP1 */) f4 |" Q; d2 I$ m: s7 ~
mcasp = &MCASP_MODULE_1;6 C) l! N5 I/ b
mcasp->regs->GBLCTL = 0; // Reset
9 D! s4 V7 t0 _- K6 m) x9 h mcasp->regs->RGBLCTL = 0; // Reset RX5 h; M% H% O" r: m9 i1 h
mcasp->regs->XGBLCTL = 0; // Reset TX) _; A; d5 O9 M: C+ |4 L; q% W
mcasp->regs->PWRDEMU = 1; // Free-running
, e. v- U5 J& K& Y2 i! X // configure McASP0 receive registers3 Z* X0 ^8 ]# z4 ` P
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
/ a/ {, T, |/ E! k mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
$ R' g; ^7 [9 J$ P2 G" f+ P, ^ mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
: Y1 s. T0 E6 q$ o mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
: M9 y' t' W9 \9 L mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
% B3 B I4 T: i% P- _2 m mcasp->regs->RTDM = 0x00000003; // Slots 0,1
6 C2 Z% q* f1 X Z0 }3 C4 t9 k mcasp->regs->RINTCTL = 0x00000000; // Not used
8 K# B1 I: p- I5 n mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
) L1 X1 Q. e7 [' A& D; I6 L% p" @, {$ R8 h
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used' O3 d- z0 Q6 V2 E8 G
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus5 q$ o9 l. |% [' x
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
. p8 W8 E' G, |8 D" q+ \! f mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16 h) f/ }! b0 N0 p1 s
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK- }7 _ F" J. z; i/ r# }/ d q
mcasp->regs->XTDM = 0x00000003; // Slots 0,11 }* W4 `- s& V1 ]' g7 g
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit5 K' O) C5 j; j! {- ]
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2568 X4 F4 m9 |0 g9 m
) M! v& n* H9 p( ?9 n5 }* o mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
% [8 J4 F! p7 J5 L8 Z/ D mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
% q4 v2 f3 b$ V: v1 M* p+ J! Z mcasp->regs->PFUNC = 0; // All MCASPs) V4 G! q: L; a: H
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1+ Z& }; {' t: ^8 R
" P$ Z2 h j$ A& q$ g/ v
mcasp->regs->DITCTL = 0x00000000; // Not used, k: @$ a' O) U3 s
mcasp->regs->DLBCTL = 0x00000000; // Not used9 u1 h1 x w, f, p
mcasp->regs->AMUTE = 0x00000000; // Not used+ @ J1 S; _ Y' {7 f
L3 N5 i, o }* ?5 |: r+ u
/* Starting sections of the McASP*/
! `! G+ N- |, v M% r7 r mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
& F2 ^4 H( s* M while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); % b% J2 h1 w3 S; S+ z
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; & \( e6 K) [/ E
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
7 q6 L4 L b) ?5 H# p; k# E0 Z
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; / H; h+ C9 u) Q* a
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );. N- k8 f7 w: K. v; _
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ! o0 Q9 ?0 s. F
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
: {: J+ ^2 G; Z. z: V& B$ g. F" J/ c9 X |' R0 t
mcasp->regs->XSTAT = 0x0000ffff;
: z" k* M2 b, S W: H mcasp->regs->RSTAT = 0x0000ffff; : T* f- N; u3 u# S2 z; j; j! U! C* q
$ f, @0 o/ P# Y' N mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;3 G9 O# H' F/ } z9 N
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
3 A, V M1 W/ q. |$ G) _ mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; * F! H$ L$ T# @: O( q+ U
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
( C& P5 D2 m9 ^3 n# K7 r- Y
2 Y6 T% Z4 p9 W; I0 e* r /* Write a 0, so that no underrun occurs after releasing the state machine */, P# d% F& Z: T6 e% D2 z4 s7 t+ T2 A
mcasp->regs->XBUF5 = 0;
4 N. R! `% X' G0 y1 h5 p. ?1 @ mcasp->regs->RBUF0 = 0;
k$ O- N/ x+ K9 A
" H+ [1 O% p& H, f2 N mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
$ n* s1 T1 I- s: i; \0 d while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
1 T: v9 a) S3 m; C( e2 _ p mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 9 r& G+ v$ S* V" B# T |: Q" ?
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
$ h7 Q2 p% {, p7 L" P4 w, J$ w1 B) v' x
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
* N! \% h, f" h7 d0 M while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );' H/ o, I; N- j
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
2 U& w8 j1 X& B0 `* }8 b while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );. A' V+ g! I# }! `3 X7 g
5 O2 S" E% Z+ C% t4 S$ T CSR = 0x0000;
! P! b8 E, B4 ? INTC_INTMUX1 = 0x3d;
% ]7 o3 \6 e/ ? ISTP = (unsigned int)vectors;
. l# ?$ q |% Y j1 i8 K ICR = 0xFFF0; 7 q: B+ Y" t, |8 v% C" m9 P. f
IER |= 0x12;
1 p. P6 N% O; W3 }2 M4 z CSR |= 0x01; 7 b# u7 g% C" s7 H8 ^
n. O) P$ t" j6 c7 i, A& K
$ K- B* j: E1 M3 D9 j( r f6 {/ V9 c
还有就是两个输入输出函数:
2 R" a% z, |9 J$ h& ~: v9 `9 Xvoid output_sample(Int32 out_data)
5 G" N5 P% ]$ V: w{) F9 A H" ]3 B* N
AIC31_data.uint = out_data;
k: h) g2 u6 r8 j% N MCASP1_XBUF5_32BIT = AIC31_data.uint;0 I* @# }+ F/ N
}7 w# P' l6 F7 i7 E, _6 Z. e
0 y0 }5 p1 {5 V A1 |! S" K0 }Int32 input_sample(void)
! L1 O/ M1 n; p6 \( r6 k/ K0 e5 u; }{
6 k6 [ }) l- [0 `$ c5 p3 ]1 N2 q* y AIC31_data.uint = MCASP1_RBUF0_32BIT;: p, l/ }9 A @' l$ i
return (AIC31_data.uint);8 U2 f# r* k! Z! d
}8 u1 z: ~* h% h `8 `( E: D
9 _0 z: Y1 G: R5 M; d
|
|