|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
; z/ J. }# }2 B2 s+ T" c& nmain文件:
1 ]% C L% u# C2 Dinterrupt void interrupt4(void)
* ~ }# ^6 K9 H7 O4 f{
! c6 G" w* Q, \+ s, e& ` Uint32 sample;
8 e0 a s- L# {. i' {, P
) G1 C9 A: p5 x7 t) a# \3 ` sample = input_sample(); // read L + R samples from ADC
/ b6 n- t0 R' }: V3 T" n output_sample(sample); // write L + R samples to DAC & ]) r- C4 S+ M' Y# W$ s8 q
return;# L2 }. M4 y2 ?1 k- |, P( u+ @# R
}9 W# A: Y6 O i+ _ O9 v5 Z
F) |: G2 h" C8 H1 y
int main( void )
! Z, ?$ w: Y. X{
9 a' F4 h+ R5 u d) S
( H1 n" y% j4 V( n m/ C: O8 o /* Initialize BSL */# A4 d" F7 R# D# H- |5 S
EVMC6747_init( );
, J1 J) q1 J8 x+ n /* Call evmc6747_intr function */" x1 o# P, |9 S2 `5 c$ f7 m
aic3106_init( );
/ A' R7 o: @. M& |- Z' | while(1); d8 d8 w3 L4 v$ y, U9 B
}3 I ^$ C$ ?! L2 l |; C# Y
6 r3 ?! G5 Y. d M2 J
: @& N$ {4 o/ N* s& D/ Saic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题% m) K: ^2 a! v2 E; K8 e
/* Initialize MCASP1 */
2 O! f6 Z1 U* P+ W mcasp = &MCASP_MODULE_1;
6 K2 m- E0 @+ P& I: y, ?' g s mcasp->regs->GBLCTL = 0; // Reset
5 M6 ]* {% J/ }0 o3 U3 A mcasp->regs->RGBLCTL = 0; // Reset RX
; e9 \6 Q& B" L" l0 f% h7 R; j mcasp->regs->XGBLCTL = 0; // Reset TX
) K% q9 b; y4 u4 ]- w mcasp->regs->PWRDEMU = 1; // Free-running
! j: w5 X' O( p9 b1 D8 E- B // configure McASP0 receive registers
) Z* U3 t& Y" g" t- \ mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used* |- b- Z$ j& E" @( j' D
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 f* X; |, j6 D! N- C' A/ Z8 X mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
/ |- }5 g, Z4 U4 J5 |- z6 b7 x mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
/ X' L/ _# e! f! ] mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
1 z* o" ^* }3 S4 e7 o3 ` mcasp->regs->RTDM = 0x00000003; // Slots 0,1; ], j# a$ Q1 C3 d& A) H) Y! ^
mcasp->regs->RINTCTL = 0x00000000; // Not used% L# V' W# L) x& T8 g/ p
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, v* t4 n, ~( E' w3 l
! e+ Z1 r8 g9 q" P, G mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
' n% O- ~7 a1 h$ y mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
9 }0 ^ P) z. B, [6 | mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word( m6 o, [2 m- g. X9 R
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16- r* E5 @3 O+ Q* R) Z6 x4 U: f
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK Q% m- B* y# q/ |! }
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
; }% W8 M h/ W7 Y mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit2 e" a" V0 e- Y8 ?5 _3 y
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256- M" r- W* N2 r# v# ?
9 Q/ x4 {1 R* Q. h
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN/ h( t+ @0 ], r) Y, H# U* ^) X1 p
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
" p+ V4 A3 f0 F P) \8 x mcasp->regs->PFUNC = 0; // All MCASPs5 d! g) Z# {* r% V- \( o
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1' `9 A3 C+ C( M# ^
! X4 w4 d; M8 g" \
mcasp->regs->DITCTL = 0x00000000; // Not used
. r; J, v6 \9 m" N$ ^ mcasp->regs->DLBCTL = 0x00000000; // Not used
# H. z# a! z* {- A mcasp->regs->AMUTE = 0x00000000; // Not used+ Y. y3 a, \) l* x8 |/ j
; |4 c" ^; w1 ?+ V, [/* Starting sections of the McASP*/* V: G; W( T( d% {: Y D# l
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ) X, u( Q, Y* {7 z! t. ^
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
( d1 t$ K$ F0 \; W* Q- G" G" ` mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
% R4 B2 }% k6 T4 L while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
G, z' @0 ^7 f2 x2 ~
3 G9 }' t ~9 Y5 [ mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 0 p/ v8 f" p r* `1 T& K" ^: o0 S
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );' \# @/ |/ k7 _. D. J% V
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ; u- u( p- e( N! _$ \6 ~
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );# h+ |$ `7 h$ x( ^) X
7 e$ p7 \2 z- N: d$ T) e" f
mcasp->regs->XSTAT = 0x0000ffff; 0 i \- H) Z/ C; h3 V' O9 s* a% M
mcasp->regs->RSTAT = 0x0000ffff; N0 T% @& P# K! Z& Y
0 y# O- e( U& X* [% q/ ?& l3 \
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;* w% N0 l' M9 |
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
+ {7 @; m/ j# R, V' ~/ n% l mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; J7 w# Q6 [7 {- Q( D
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
* r) E0 e7 v q0 K9 V3 _% S) o4 s1 }# P* }9 _5 |4 V
/* Write a 0, so that no underrun occurs after releasing the state machine */
3 L. @! i9 m: g0 ?$ g7 Z mcasp->regs->XBUF5 = 0;
1 A! @' L. a/ E& k3 D mcasp->regs->RBUF0 = 0;& ?" w" B3 b Y3 H: `
( N. I/ Z$ ^* V% y; Q9 `! N7 G+ R mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; " `8 S# L A) S' o2 h6 t0 a
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );/ H( J- \9 z, l7 o2 B; b7 [
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
" Q/ X# H% v* C2 r( { while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
5 }2 @3 Z. |) C2 E4 x) T1 j7 G' G. M' R, |+ I, G) T
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ! ]: M1 r; d. s% F; Z# ?
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON ); Z3 v# z9 l5 m2 B. _- I
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
3 G/ N/ L4 e& W: f2 V0 L$ J. E/ X while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
: h% W8 i% ]- G& ~" k* a! _- k( z$ x; Y
CSR = 0x0000;
1 M7 x$ @! D' Q* q INTC_INTMUX1 = 0x3d;0 X' ~4 b7 A2 w7 {
ISTP = (unsigned int)vectors;
G+ q! a0 L9 T& X" s. T, L ICR = 0xFFF0;
9 [4 [3 A z1 z* t# j& g IER |= 0x12;
$ `3 V# m* Y% B CSR |= 0x01;
5 ?1 }$ n! S" K1 Y% E2 q! Z* ^8 f! Z4 i6 w: r; `! Q* _
. z E* t! ^* H7 o9 c9 E9 {4 c
* j- V$ Z4 T6 {% ~8 ~$ l, H! [还有就是两个输入输出函数:7 c4 J: I {4 i
void output_sample(Int32 out_data)
# p: I, u+ r7 a7 K% r{
/ X. T5 D1 W/ A7 `: S( W AIC31_data.uint = out_data;
* m. }6 C, l% x5 ^* J3 ]1 u MCASP1_XBUF5_32BIT = AIC31_data.uint;- I2 v1 d. @2 J9 P
}
; @4 [1 I& ?6 U# q4 U
! ?1 O5 w& D4 s# M' p7 AInt32 input_sample(void)/ a( g/ K9 N* s8 r
{ . u, E0 d. [ E$ T% ?
AIC31_data.uint = MCASP1_RBUF0_32BIT;) Y, V* h8 O* \- J: c' w3 q! C9 g6 K* {
return (AIC31_data.uint);
6 [+ ?3 h/ q. {/ Y+ o) [% z}
$ S) S# X% A8 Q$ C' s7 A7 D
# J4 x: v, j) ]- C' _0 W |
|