|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
9 w7 k! q7 a0 w' _main文件:4 W, s% S4 Z) `8 M# c0 q
interrupt void interrupt4(void) 7 ]1 w1 R, ]4 ]: A
{
1 {' v, x& w: P# u4 }4 d# ~ Uint32 sample;
% w `, J y8 p) [# c2 A5 Q
7 e# W* t+ s! n+ L0 i- L% q1 a sample = input_sample(); // read L + R samples from ADC9 V; {% t% N1 \+ g1 `
output_sample(sample); // write L + R samples to DAC
5 J- e4 c1 q3 I8 B$ ^2 h# X return;
- L5 b8 [" P U R) H3 J}
4 R& Z3 K# O3 ~9 x [2 n/ [+ W! |, {; {
int main( void )' C% i& {. n, v( [2 F
{+ j$ d' o: i* {) N/ [- s6 r) H
0 B- \" [- `: F% w/ `' }( k3 W
/* Initialize BSL */
# n# I' f2 ^1 ]) o$ [ EVMC6747_init( );) h6 P- G; _) }8 G8 i
/* Call evmc6747_intr function */7 h' B! {5 }9 E( |- W
aic3106_init( );
" F+ h- y; |6 r5 N5 E7 n1 `, r6 o while(1);
8 C# v+ ]/ O& N, Q5 z- V}
1 h. l1 D; S$ |9 l( [( S& P: \7 g/ H: I2 ~; A+ u+ J
2 d x' Y$ x& X- {1 J: z7 H1 Taic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
2 T2 {8 O- _; [2 Z- K1 j4 n/* Initialize MCASP1 */! B0 K1 k* S! b. Y! e) X& `+ `
mcasp = &MCASP_MODULE_1;6 m1 ?4 v" f7 H/ N! j+ I5 e% n3 ]
mcasp->regs->GBLCTL = 0; // Reset; S/ G7 E* p5 ?& J
mcasp->regs->RGBLCTL = 0; // Reset RX
8 _& d9 H6 z W# Q! `& S mcasp->regs->XGBLCTL = 0; // Reset TX2 T, a0 u3 g9 K; h4 a) K5 ?
mcasp->regs->PWRDEMU = 1; // Free-running" N: A2 v- P. @1 u. q6 l' J$ A6 Z1 \+ _
// configure McASP0 receive registers
1 i* H9 `' j6 t: b8 S0 q! [; L mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
0 S: o$ Y( @$ }6 d6 T mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
8 s' E/ R e. m7 ] mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
% m- f3 B9 P3 ^& _( ` mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
, k' q: v/ c- R! p7 s( O; r mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
: I5 k$ x: j( t" D* N1 y mcasp->regs->RTDM = 0x00000003; // Slots 0,1
6 T, f7 }1 ?; Z( e! X, G G mcasp->regs->RINTCTL = 0x00000000; // Not used! `# V' f' B7 t# \, A) g
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256: U1 e& g! q& x% } _! [
: d7 x/ t# x, M. h mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
& o3 ], y6 B5 B; {! ^& u mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 }; N& ?& w7 X! n3 N mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word$ _6 d; h+ }3 E" z$ }
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
+ i* M, z) R$ t mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK2 x, v! ^, ?" Z3 s) b" C% }
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
\3 A. U A2 v; D( \- k mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit+ K) P9 M) p; q: @3 F$ J& @
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2563 d8 J, F1 V. l- b
" b% n5 s2 D' F% Y1 O mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
( X$ q9 n" M$ V- _ mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT1 e; x* J u( A. u1 L P
mcasp->regs->PFUNC = 0; // All MCASPs
1 a# x5 d4 A' d" [8 F& Q& H9 h mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1 X& C( w' X9 N9 S* c. v' _' e
' |1 E9 G/ {, m1 R4 ^# q; x mcasp->regs->DITCTL = 0x00000000; // Not used) M. ]6 M& f8 i* m2 G
mcasp->regs->DLBCTL = 0x00000000; // Not used6 N% w6 D o$ W1 D1 r/ J4 f B
mcasp->regs->AMUTE = 0x00000000; // Not used1 b3 h7 @* W" K
% J& _9 j$ k, S9 d
/* Starting sections of the McASP*/# E6 a/ z2 J6 A+ |# Y
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
U: Q% V- T( E- o/ R! G$ D/ b while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
# x/ D# B9 u" v mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 1 A1 k2 k0 A1 T' y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
8 W _3 o$ s: @. i; J. P7 z4 y" N, I' D* B& m0 T" c- I
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; % H, T; f9 i. N$ V! ]# |7 d! ~! D
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );7 g& T5 t Q; }! q2 w
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
; D* H. o. v+ I6 a5 C while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
{! R N% C& n7 B! V0 S
. S$ q/ l5 a9 M& P, U mcasp->regs->XSTAT = 0x0000ffff; / u/ a/ s2 x4 c# g& |/ H8 \
mcasp->regs->RSTAT = 0x0000ffff; * Q0 w8 Z6 C8 T1 j+ o
( |* D8 P, G5 A- b6 l2 Z
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON; Z. y5 H% j% X8 N
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
( U) ]3 R$ m7 N6 F3 L mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
9 h; e# q; ^- M6 V6 q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
* V# j8 J2 _# U; X; I- F* h3 A0 J! T& A: j1 J" o
/* Write a 0, so that no underrun occurs after releasing the state machine */
/ U4 I9 ?3 k6 o+ c0 K% z mcasp->regs->XBUF5 = 0;$ r/ g- q/ R0 s9 L& o, ]5 J9 x
mcasp->regs->RBUF0 = 0;. ^' x) r% s$ h& W8 J ]
3 U7 @. M0 T# [) _$ j* {
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
4 |! G q; e) R3 I3 c while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );6 v r- [( {. U$ ?9 ?5 e1 z
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; / |* g; T$ Y" r' b9 P
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
2 i6 y5 E. i( p; }3 H' \, M
" I6 Q7 R0 S0 x0 [. c mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 2 V6 z- E9 @: }4 R2 r
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
m2 J2 \' k- j9 |( _ mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; A! \' Z! T2 w' f- R
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
7 S2 D M( A8 w! g& l+ C% p& p6 \3 I
' f" w. r+ Q& `. m5 Z: B- s4 S* | CSR = 0x0000;+ ~6 w6 J3 M8 @& d1 h
INTC_INTMUX1 = 0x3d;
" c$ O y- o" R, I ISTP = (unsigned int)vectors;" f# }( [2 G" X% Z7 y; b, [
ICR = 0xFFF0; ; H; Z$ [4 T ^
IER |= 0x12; 8 F9 K4 y; ?% Q
CSR |= 0x01; E9 i0 a( T. m; n5 F
6 N4 [ @4 R# \; d$ p8 d
3 ?# y0 e7 ]. O& [$ |/ m" F% ]1 ^& I$ P, H4 G1 S3 V' f( |# X0 V
还有就是两个输入输出函数:
# L8 A2 N5 Q2 m) @ a4 n2 d2 @void output_sample(Int32 out_data)' A ]$ q8 ~, r) }3 f
{
3 a4 u. ?$ J4 Q8 A% K/ _0 b AIC31_data.uint = out_data; ' w* m2 I; {. C9 y7 _; o
MCASP1_XBUF5_32BIT = AIC31_data.uint;
) [* o c! V6 @! r}0 m7 b: \/ [1 {0 ^2 g+ I) P
( C5 }; C, W) {2 L+ q
Int32 input_sample(void)# y8 d3 D- M4 O$ k
{
+ \: }0 t' L) B- H2 ` AIC31_data.uint = MCASP1_RBUF0_32BIT;
& ~" \9 v9 X1 d) [5 L return (AIC31_data.uint);# d" }* R% g5 {* W; y
}: f) C! l# [. a) p+ h
1 X/ _0 r* j' V1 } |
|