|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:: l7 g8 W- P' g& J, B8 E+ i% b7 e/ O
main文件:' m$ U+ ?) T% E: ~# c
interrupt void interrupt4(void) 2 o/ ~6 j( @0 @7 x# ]
{
, T, ^' J* Y* g9 ?, n5 z9 |$ K1 y Uint32 sample;
" Q& @# D0 p# e: `1 X" o7 M
5 x: V/ o5 c: a! Y* b4 h$ @ sample = input_sample(); // read L + R samples from ADC
3 x- c0 ^; o; ]- F1 D9 L" S" ] output_sample(sample); // write L + R samples to DAC 4 j9 P; l {6 Y" G6 D4 Y
return;
9 K5 z7 h) W5 }) F4 ]# p}
7 V/ i( C3 J6 _2 i2 R; U1 Y
" v' E" n \# d3 Q% jint main( void )
2 x/ m* m- b$ u7 S& `5 o( l _{- W/ y7 B" ]+ {: n% x6 U
7 T) s$ Q. S, P) x5 m8 t' d4 k /* Initialize BSL */5 A7 @' E, e8 I) ^6 W2 k, N
EVMC6747_init( );- m, { n3 E$ C/ p4 ~" m
/* Call evmc6747_intr function */8 M' W* m0 [" @+ T
aic3106_init( );: D7 D- s$ M% y& O
while(1);7 Z+ C9 ^ B0 P" X
}
4 |% O. W2 i) V7 }" P1 {/ k5 p2 ]7 S$ w/ k2 `* R4 _: e
3 }0 M, e& E: h; I+ I& `! Q$ X
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
# \4 s' W. g2 r/* Initialize MCASP1 */
; Q& l& t. A5 L' F. \8 Y mcasp = &MCASP_MODULE_1;
3 w Z/ f6 \" C' n mcasp->regs->GBLCTL = 0; // Reset) \3 F# q6 B M2 U9 f
mcasp->regs->RGBLCTL = 0; // Reset RX# P# y& o8 e0 b; J
mcasp->regs->XGBLCTL = 0; // Reset TX8 y+ _7 k9 N! J3 j0 `! Q- S
mcasp->regs->PWRDEMU = 1; // Free-running0 j3 ?. v" P& N/ M
// configure McASP0 receive registers
6 ~. M3 C4 ~8 E( n$ Q9 k4 R mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used, m1 Q- R* { Y$ J
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus5 L' A: Q3 V) _( s/ ^0 M# M
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word3 D6 ?, e" V; Z, @6 k
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)" l; }1 X3 w8 h5 Q" t7 ~. z8 J
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)( H P; ]6 m. d
mcasp->regs->RTDM = 0x00000003; // Slots 0,1: h0 U; J9 u1 q
mcasp->regs->RINTCTL = 0x00000000; // Not used
1 ?& ^' @+ b5 \% {! G% z! E4 F) A# p mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 W( e2 s1 X7 {9 D y: O& n! x5 c) D( o2 _$ L4 a9 O( h
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
6 y+ A$ \. C/ z+ ]" I2 n mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
5 M( J# q4 U$ N6 t mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word% L! n8 t1 [. A& w* A
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
, I0 A6 Y# G' j+ D mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
6 ^, Z( ^; M" u* X. | mcasp->regs->XTDM = 0x00000003; // Slots 0,1
; Y" r9 r& c# X. X0 n+ H mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit. X7 W2 H, N( K& g$ e1 r
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
( w) O5 B& H% [
4 i: }; Z! H. Y0 w8 k mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
9 s' q' o4 F7 p- d* W9 P, p7 `6 S mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT" f5 Y6 v6 h' S. E. R$ i, S
mcasp->regs->PFUNC = 0; // All MCASPs% U5 _# }$ ^ M N
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX11 u# j0 N* g6 F6 n6 r, K3 V: m, D
) W* J9 o! |) a! W$ P mcasp->regs->DITCTL = 0x00000000; // Not used
+ a$ S- s5 a4 U/ Z mcasp->regs->DLBCTL = 0x00000000; // Not used
* L% m7 w1 \ F0 E mcasp->regs->AMUTE = 0x00000000; // Not used
3 L; T. ?' h/ x: @. \6 C$ s# J& F3 w# r+ `
/* Starting sections of the McASP*/
u2 z6 D7 V: k mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 4 [, {5 `+ P# b, n% Y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
; U! d5 k ~9 B3 \9 g( c/ b mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; / ]$ V Z8 t* E; L" h
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
) C7 D, }5 N/ l: w
1 ]1 f7 \" @4 T; Q+ @6 J( j mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; / X/ s$ W3 @6 C
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );7 E& ?/ L& b9 w
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ; H* Q: t6 U7 v$ ~
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
2 ] t6 l1 G; T$ j: b& f- B: _5 O( Z' D4 g$ @0 s* {1 `
mcasp->regs->XSTAT = 0x0000ffff;
" i8 O& k# [( B# _" E mcasp->regs->RSTAT = 0x0000ffff;
' u5 E! F z4 F- ^
; l5 j) H* N/ C1 B1 Y, L mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;% j1 E$ b* Y! |# `9 g
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );( X e( A2 m9 R7 z. `
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
( F, [4 J# Y2 y while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
- f& k7 q% M6 e B+ g' T9 z8 C+ P( x
0 N* G- y j* K L! |4 | /* Write a 0, so that no underrun occurs after releasing the state machine */0 n( s- w# b5 }' s8 j* B
mcasp->regs->XBUF5 = 0;
$ l) s" N' _" a$ E: o mcasp->regs->RBUF0 = 0;9 c8 s' Y* o$ {/ }% x
8 z+ l4 M) O9 Y, }* d
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
, M; G9 }9 y3 W" {# I while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
6 ~0 @; S& L; v6 O' b# ~# c# K mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; . S- Q6 g. n8 b# V7 {8 `; w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
+ i6 J+ M5 a; a ]+ I% L
. |8 |; q4 Q4 p0 ?. E5 o mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ) c1 H: M% _' a. o* i
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
, U [0 A$ L' ?' T T mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; / Z2 _- s4 t& q! _& T8 ?
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
6 `- f, P6 Y: _) i6 c. @- t
4 K% x1 D& Q: i5 Y3 Z2 }4 ?9 ~ CSR = 0x0000;: Q2 \* p. F7 L
INTC_INTMUX1 = 0x3d;
9 |9 }5 c0 ?, T6 G0 o4 `7 {1 m ISTP = (unsigned int)vectors;
5 a* J; {' A. j$ k+ D ICR = 0xFFF0; - r( n, y, _5 I8 C0 Q
IER |= 0x12; ; d5 \" x0 r/ p1 o9 U
CSR |= 0x01;
2 w5 X# _- }/ K0 _! ] K
" @* H$ L# v5 X% ?8 C: f
3 |& n5 x# v5 ^4 s+ |( ^/ j1 L. y
& U8 Y1 r0 W0 [5 i还有就是两个输入输出函数:
9 `; c7 p, l# E+ a. Nvoid output_sample(Int32 out_data)
& R4 U& W5 n; \ ^8 J* U/ K{1 X4 b w7 D9 M$ F5 p$ K4 X9 I! }
AIC31_data.uint = out_data;
; I/ g! w8 T1 m4 s! T MCASP1_XBUF5_32BIT = AIC31_data.uint;) }+ P' M- a, q' m# ?' e
}# O$ @* d' |" t
# J6 P$ T; r% a6 C0 S2 xInt32 input_sample(void)
' ^! w S3 f, S# h0 j& K1 L{ 6 t+ n5 q6 E& m' } R Z
AIC31_data.uint = MCASP1_RBUF0_32BIT;" K, o* s4 Q/ I$ c& |( E
return (AIC31_data.uint);# s' _% k; Q2 \: ~5 F6 m" J) [
}( R6 ?+ d- ] }. v3 K, B
" [1 U) Z. H+ {% {; d; C: k |
|