|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:& \' _$ @( A) g/ k
main文件:1 k$ g/ O9 H6 u$ W
interrupt void interrupt4(void) * p, C3 d$ m+ U7 U( `
{( Z1 @+ Y4 D' l& {) T& [9 a
Uint32 sample;( U# x5 q: D& s
; }# F' l9 k+ H- X sample = input_sample(); // read L + R samples from ADC7 Z$ X0 q( e) {$ O N/ ~
output_sample(sample); // write L + R samples to DAC G1 B' ]3 F( v( ?
return;* ^* b" Y; k7 k) M
}5 {0 e# b# K0 ?* A k/ l
6 a" d! y/ E0 Y8 a# L: \int main( void )
' j9 g! y& F+ L4 x4 h) ~, d{1 g$ C- W' h7 d3 ^/ {+ w5 P
8 R' b* F0 |. s9 y u; _ /* Initialize BSL */
1 A% U/ q- \3 x, Q0 R EVMC6747_init( );
2 J% y9 h$ W( z /* Call evmc6747_intr function */
8 g, c( c7 c% o `8 S9 O0 O- l aic3106_init( );
5 k8 w0 V, `) P# [' C6 H/ p while(1);, T! w' Y$ `, ?+ W/ Q/ a4 e- ]/ \
}
( D9 Y) U, U; h; g2 J9 P
# g- \- u X% ~- D, f+ J+ c: ~! F/ J( z( `* R/ m
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题/ @8 `' {! N( F; P8 g# f) n( T2 J" J% |% n
/* Initialize MCASP1 */
! ]( w2 u: \7 o/ _6 C8 ?! b mcasp = &MCASP_MODULE_1;& J; k) ]' B9 ?. N& g$ R
mcasp->regs->GBLCTL = 0; // Reset
# u+ l) J% L6 U% {% U8 f) P% t { mcasp->regs->RGBLCTL = 0; // Reset RX/ o- k& \+ s/ p" u6 E& q2 q
mcasp->regs->XGBLCTL = 0; // Reset TX1 t) e' E: s& U5 R: X& N5 v
mcasp->regs->PWRDEMU = 1; // Free-running T/ i% q- ]: z* }0 q4 k
// configure McASP0 receive registers
! [3 w; U8 l9 L# f mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used- Y8 o' S9 {% q' X s! {
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus) [ i0 G$ F; F! B
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word; k1 |$ r% K; E, @* n5 i2 n0 e! c n. u
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
& F0 [' I- e6 T! U! s5 Y% r9 t, H mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
% r7 H9 i; H( F8 F$ w mcasp->regs->RTDM = 0x00000003; // Slots 0,1
! F2 D$ F. b; r' z( q0 f mcasp->regs->RINTCTL = 0x00000000; // Not used/ ?2 K; V) ~/ o$ M: @4 \- a
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256! v- ^ a( `/ J% i1 }
' c/ \$ @: [8 K& s" Z% G mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used( R7 z4 s b! D* I
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus& L4 c; B, a- h' [
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
$ N+ t: ^2 g/ F- c. V* y1 S mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
p# f. ^2 f# F/ ]" s: f; u H mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK2 U* z. M3 Y1 o+ ]* E% z
mcasp->regs->XTDM = 0x00000003; // Slots 0,19 Y" A+ O/ f( y" G$ _
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit7 @& h# s) |, T6 s* [
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: n9 |7 S$ A" {& F
$ @* E8 b, ^7 X3 ~5 b z mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
8 Q* F; l; n* p% O1 i! W mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
& l9 R) O3 \# X8 O mcasp->regs->PFUNC = 0; // All MCASPs# u2 f- m* Q! z' ` q0 Q
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1( C8 \" v- P/ b1 U4 p& j S
/ O4 r1 J- V7 P% e# l) g2 I mcasp->regs->DITCTL = 0x00000000; // Not used
' |2 ~$ J6 u* s' y8 ]9 Q* e mcasp->regs->DLBCTL = 0x00000000; // Not used
p9 u5 v' b: O mcasp->regs->AMUTE = 0x00000000; // Not used
- W k+ V' N' J& i" e5 u9 Z% n0 s# i7 m7 H
/* Starting sections of the McASP*/$ K5 l! ^, `( [' G; ~
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
- ]1 W* m( D+ U8 a9 Q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
7 `4 b- Z5 G9 @1 h; s9 M- p mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; + ~3 w. Q+ Z, b- ^
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
9 K8 a5 E; U1 z3 W$ u. u$ G7 i0 K* ^: x# `
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
4 f3 g/ I, ]3 y% p( q/ A, X while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
! N# c! l" r! \# X/ @+ h- Y mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 8 G% ]2 i" }4 C" c
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
% s* E' e2 D' M* r/ p. e8 V) A0 c
mcasp->regs->XSTAT = 0x0000ffff;
& z6 C; I2 k$ F; z8 l mcasp->regs->RSTAT = 0x0000ffff; 9 n7 i& r. m$ l* i% x
7 I4 v u6 s, T: {# X3 k
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;2 |! A( E) e+ R8 m
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );: n" Q4 |1 o" w
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
) n& _0 D" M+ N w# H0 z% G while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );- `/ i0 R0 ?0 ?0 X0 k
8 i' G9 R; ^$ Q/ G3 \) T4 b% r2 m /* Write a 0, so that no underrun occurs after releasing the state machine */
9 H2 [( C z) ]. ~9 G1 f mcasp->regs->XBUF5 = 0;! i8 W! V; Z+ q. _0 n: ?' k
mcasp->regs->RBUF0 = 0;: M! H, y* d" L
( @9 B4 S' a, e9 i6 c( r5 n
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
- u- Z- q9 Q) Y; V$ m5 J while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );+ `8 y' G o$ N W! J
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; # L: a2 q3 B, j4 Q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );* J- X6 ^; M# C- y
, C! u7 b- ^" } mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
% e. \, K# W" k0 I7 J while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
; ^0 j4 X* I7 o mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
4 T2 R& D4 h* ?, } J while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );- ^6 L/ c2 w( u6 U2 Z. b0 ^5 U
* G: Y* m0 L, C, K
CSR = 0x0000;
+ z6 y6 D5 b- t* V8 [ INTC_INTMUX1 = 0x3d;6 R5 W# i* A: e+ d: s p! H
ISTP = (unsigned int)vectors;$ e, [8 b! h2 z' n7 {
ICR = 0xFFF0;
; `) G0 {5 a2 O- X3 t R IER |= 0x12; 3 d$ W& @1 A- R$ g3 l& a! m4 y5 l
CSR |= 0x01;
6 V# g, G8 d: f! i: K5 M9 }. j% V9 d& T+ M$ h
! R; r/ j1 P4 x4 o6 i* |0 L) `# g
( c3 v+ x# B2 \! N/ t
还有就是两个输入输出函数:& k; @; O# l. f" A1 @1 w; f' u
void output_sample(Int32 out_data)$ g' m; P% Q8 |5 v
{$ Z. O+ P6 F& H/ d4 J. s
AIC31_data.uint = out_data;
$ [ C* M- C$ N0 h5 d: i* G6 F MCASP1_XBUF5_32BIT = AIC31_data.uint;
6 n6 d' A1 v; W" k' a1 O1 E* i, ]}2 P: [3 `" q- N. v( L
N3 a' ~7 L4 y, ^: F; x' q+ l
Int32 input_sample(void)* s8 J6 |- S- K2 ]; q6 z4 j2 Z
{
( C- T8 B: [; a; R8 o AIC31_data.uint = MCASP1_RBUF0_32BIT;
+ A. G7 \, g2 N/ O3 j return (AIC31_data.uint);8 ~0 D: b, p0 G: m
}
9 v7 g# X8 F; l$ |- Y# B' Z
& u5 B; ~" S$ N/ z; K+ p' s% f- Z1 D& S |
|