|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:0 I/ }7 Z' J' K- E
main文件:/ O4 [" g' ~1 I' _) ^8 @2 S7 t7 A
interrupt void interrupt4(void)
$ E9 c& ^7 P4 W! E6 R5 U9 e{
1 M, K) a% L7 |6 e" N Uint32 sample;& I8 B9 T3 l j) U. ? G0 [
9 `. D) P( y" F: {: d! R: a
sample = input_sample(); // read L + R samples from ADC
$ V* n! x" @; q2 {' h output_sample(sample); // write L + R samples to DAC
6 U) p4 a/ N( l$ r: ^" L return;+ b; u& O& r$ m0 W/ Y! f
}4 y, b5 j$ N2 [0 I& K& M
. \/ O$ D9 i/ _
int main( void )% g5 g U4 _+ y2 \! W' F( l
{: A6 q9 C3 C* ^' E: p
) [& | C. q6 }( A, a G- g /* Initialize BSL */9 d) M0 d) d; z+ j
EVMC6747_init( );; t- r: P6 @' f7 l% t
/* Call evmc6747_intr function */
\5 _% o& d; r4 l D; j aic3106_init( );
) j/ h+ W G0 E$ }- t while(1);
1 H# ~6 I2 k3 G}
, A5 A2 ]3 B: [9 y. R4 i* ^7 G) m% d' U5 ^
! f0 t7 O; t# B9 W
3 i% w! E0 U( paic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
2 j1 n" E1 k( U3 g+ o/* Initialize MCASP1 */
5 y: ~7 a$ K( C mcasp = &MCASP_MODULE_1;8 Y; y8 F/ X# V0 G
mcasp->regs->GBLCTL = 0; // Reset
8 y- m# ?! N( p- G: g! k1 Y3 T mcasp->regs->RGBLCTL = 0; // Reset RX) w5 \ u7 ?1 }0 Z% f' x
mcasp->regs->XGBLCTL = 0; // Reset TX
; P4 n3 w- k$ H7 O M1 M mcasp->regs->PWRDEMU = 1; // Free-running3 P) T i4 q6 H- ]% \2 o2 n
// configure McASP0 receive registers& V% J# y7 n0 @) {5 I
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
$ p4 F+ ]7 ^; D+ |8 f: W% |1 u mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
+ y* [) X/ d; V# t; L mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word# z& x- ^0 i# S, e, v1 l7 i- I
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)! n* p1 x0 m3 g* _# Q( j
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
5 N( N/ q' R5 } Q" Q# z- H& K5 E mcasp->regs->RTDM = 0x00000003; // Slots 0,1. d8 C8 Y) M, I5 \
mcasp->regs->RINTCTL = 0x00000000; // Not used# C- b m( {/ ^0 R0 A- i
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: p2 l& y) I N) G4 B, i
; [4 z7 v' m/ p2 n4 y7 S* V T mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used) W6 Z5 E9 u" E! k
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
- h( P \4 w) b$ h" k1 \! ] mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
8 H/ o( }0 O4 v j: n( @0 f mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16! O f# Z9 h4 N6 p6 b( q! k8 q% L
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK. k0 p5 k* h# D$ c' u; M
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
4 t8 J! U2 d0 T* o0 ~( P mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
) a& R# c& {+ D/ Q+ X0 a' u mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ z9 K; W# ~/ E' R! M2 |* G5 t# L: ~) u( Z
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN! C- |$ d) U; `: U
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
# \, G8 e, r0 s% W. E1 ^% \ mcasp->regs->PFUNC = 0; // All MCASPs
% ^' U8 s6 b% z) ?( @0 @* Q5 D mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
0 ~5 }, ~' U9 C8 J( d0 `
) |: a* r) Q2 L8 { mcasp->regs->DITCTL = 0x00000000; // Not used
3 i) I7 `5 Q. c" \9 G# `1 y, ^+ ^ mcasp->regs->DLBCTL = 0x00000000; // Not used
5 p4 h6 ~. n6 M( k$ k; v mcasp->regs->AMUTE = 0x00000000; // Not used
, ?$ E5 S$ a, y
' N$ u0 i: `+ B* X# w/* Starting sections of the McASP*/) Q a$ L6 M: U0 u* M3 H. l, o& Z
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ; H" Z2 C; [$ x2 ]: m8 C
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 8 @4 z! l, o2 P& W
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
& R: \6 k2 R6 i# z while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
( `# W6 [) `( t6 ]6 }4 D7 p$ s; M+ |7 {8 E. ^; g
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
+ g& w# R+ D& U6 V3 p# J& _" k while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
* \$ k. F4 z2 e3 Q7 J mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ' F* G. @& j/ L6 C5 u) J
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
8 y2 Q2 s7 j+ X) q/ ]: l
- l, L9 x, `" K% | mcasp->regs->XSTAT = 0x0000ffff;
( V# f( j4 g) w) ^& }$ T! d7 ^ mcasp->regs->RSTAT = 0x0000ffff; 9 _' i1 V- l4 ^+ \/ k. {
+ r; q) V7 Y3 A2 D" G
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;2 `/ y v- H" d( H8 p& P
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );, s( _. Z: ?/ }' t+ s7 O8 P
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; : s/ S8 g: C5 n2 x; c. V8 V
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );, H8 ~7 M" X% ]+ s; \- B) y
! ~: ^! \6 A0 {( ~% Y+ b7 t& |2 V( {* L
/* Write a 0, so that no underrun occurs after releasing the state machine */' A. N+ V$ C1 u0 \7 p
mcasp->regs->XBUF5 = 0;
5 R4 x, {9 M: a$ N/ I2 `) V mcasp->regs->RBUF0 = 0;
0 l! Q# g/ s9 {: {/ m3 W2 d$ [; d' R
' ]' U+ [$ `4 G/ {0 X, [; t' H mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
! E4 S* z# O7 c" L; K8 r) W while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );9 i ^; M: I& {/ j) ~
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ! U( d$ _& q* B, h
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
! u ]3 z' I# m3 G% b X+ |6 [/ P9 G9 q& f9 Z
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 0 p. r1 K* A u, V$ ~; g, D6 S
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );1 r: t7 f3 j" q$ X A m% L8 c
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
% b E- f; q9 K( Y- z: Q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );& W* T/ t$ `' Q/ h" s! C3 T
* r, x0 n' D) z8 h( _4 p CSR = 0x0000;
6 S3 | e/ t+ r5 b, y INTC_INTMUX1 = 0x3d;
$ ^& n$ e. G* d2 v* R! Q* o ISTP = (unsigned int)vectors;
( D. U; E) f4 u, x8 C8 d; e ICR = 0xFFF0;
; B& Y9 u& N( D( V" ` IER |= 0x12; % Y8 V/ }6 K+ b: G* C0 X3 B5 E
CSR |= 0x01;
7 ?, j5 z% Y: P9 }5 w0 F/ c0 ^2 z* i2 p3 Q
9 l2 N; i7 C0 T) ?
/ W. q9 Q7 @" M+ ]" x
还有就是两个输入输出函数:& B% |) d2 \- ^7 _
void output_sample(Int32 out_data) Y' C! f6 M1 S) i! m! f
{
0 I- L" {9 O) F: e5 t8 L AIC31_data.uint = out_data;
3 |" c N5 T, t/ N5 c MCASP1_XBUF5_32BIT = AIC31_data.uint;6 x& b6 ^4 f# C3 w! }2 e j
}0 v+ J5 S/ Q" b+ I$ b- f
0 P+ J2 G1 y1 O+ u; fInt32 input_sample(void)
; A& K7 s. c- ~% Y, w9 K3 j) a{
* W5 h$ K0 Z6 V. h4 G0 A# @ AIC31_data.uint = MCASP1_RBUF0_32BIT;! q9 Z$ A4 P `
return (AIC31_data.uint);, a/ M; G5 }. c. I) H% y
}
$ y* ]# d, D5 r; g' l3 @9 i2 f
/ |& e" H% t0 m. h1 C9 G |
|