|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
2 g- V* s1 p2 T! b! o/ t; {3 Ymain文件:5 c$ a" E P# ^" K# g# s9 t) [
interrupt void interrupt4(void) & G3 y) ?" k Q. g5 z3 F% L
{0 X$ a' G/ I8 P7 i! v
Uint32 sample;
b. L( H! K! v( ]# N& M! Q! g9 W) e A& d
sample = input_sample(); // read L + R samples from ADC
# d6 R# D( j/ x9 [) R1 d5 E output_sample(sample); // write L + R samples to DAC
; Q4 w$ p, r) V+ V4 F return;/ o* M. u) d: B2 S) f. v2 \. T2 Y
}' c- d/ o: P; U
8 U* ~2 y" v1 W/ [
int main( void )) q( g' ?9 H! a- p
{8 P' T5 f2 A4 r! `0 Z& O
* \- `$ F! `; E+ }+ s' ]. I
/* Initialize BSL */
/ T; d7 V3 j0 }% S P7 Q EVMC6747_init( );: m0 X4 O) L2 o
/* Call evmc6747_intr function */5 p, c. E F5 b& l- y
aic3106_init( );8 Y' S* ]+ O+ v4 Y/ r
while(1);! v1 r" l. d3 W0 S6 u3 ^' G) a6 H
}/ X8 ?: E9 ^0 a
+ _. v2 s- [4 J+ x
* b: X" S8 ]7 A) O+ \; z7 ] Q/ laic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
* y8 p8 d: d- M, f/* Initialize MCASP1 */0 e- ? E, I; t0 a+ n
mcasp = &MCASP_MODULE_1;
$ y3 b: ` L% }9 |" z$ x4 K" g/ t8 [ mcasp->regs->GBLCTL = 0; // Reset
$ t8 w8 j: k/ @; j( v3 o mcasp->regs->RGBLCTL = 0; // Reset RX5 x( K) n: N/ t3 D1 m/ {
mcasp->regs->XGBLCTL = 0; // Reset TX
- l, y m9 H: f7 H( z3 g mcasp->regs->PWRDEMU = 1; // Free-running+ l' \4 t! s6 h2 M
// configure McASP0 receive registers
7 P/ L8 Y) \7 N! q2 R4 Q+ P, o/ } mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
3 K% d% `3 L% X. e mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus9 t' v/ x# A: L2 W+ a% Y' G
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word5 |# Z1 x# d' Y7 J6 o
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)- s) K" p1 w. a j3 d
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)4 E/ c- v$ f0 j# ]
mcasp->regs->RTDM = 0x00000003; // Slots 0,1# f4 O9 J( ]. D5 r3 }1 L
mcasp->regs->RINTCTL = 0x00000000; // Not used" p8 A1 p! ?* j8 a$ Y
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
' _( r) k/ S* C4 g& L/ h2 G+ G# E$ | H3 ?" }3 F7 `
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used4 N' h) N4 O3 H4 _& u* L
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus# K0 W8 G" i9 a, Q) A1 Z
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word7 H+ T7 D) p" U I
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16# z+ ~% o$ t0 U' x: l
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK) F$ A2 o4 R1 e
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
* S. T4 Z* q& Q' V+ r4 B mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
9 z* a& j f6 q. ^: D ]" b mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256+ [6 [/ D, p! r2 g% n2 r1 |8 m
3 j/ ~, Q4 e8 R
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
/ Y: E. c# u1 L5 _! ` mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT$ h' Q& N8 y" S3 x2 _
mcasp->regs->PFUNC = 0; // All MCASPs, a4 x6 D+ t$ Q. z, G6 |7 R
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1' G) O( g) D0 N5 g, c {8 x
/ W l2 {! _. Y! T/ W- O8 a
mcasp->regs->DITCTL = 0x00000000; // Not used
+ z T( q. m# T mcasp->regs->DLBCTL = 0x00000000; // Not used
0 L0 o) t, A' }9 D! Q- l+ y mcasp->regs->AMUTE = 0x00000000; // Not used$ F6 P$ w/ [! M* n2 Z
2 ? z. f2 n5 T2 ~* v
/* Starting sections of the McASP*/
2 z. C1 ]" [9 t. c8 k1 L mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; , Q9 H: h, L: K0 G
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); / Y* m. t; G4 _# k0 J
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
6 J' X) z0 T. C3 F" r while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );. p5 x& o: _( J: L3 d% }/ A
7 Z; o* v# b5 w( F- @8 u mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
$ t5 }2 K7 ` X' f6 n) j! g while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );; u+ L6 }: q4 z. _9 j9 Z( B' d
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; % [9 W I! M9 G( m7 r
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );+ v$ K; `' Z0 W& t( A' {
: M" X% I5 C+ P! H
mcasp->regs->XSTAT = 0x0000ffff; - `: w& \; m0 C2 X8 [
mcasp->regs->RSTAT = 0x0000ffff;
2 ]: w2 |' p9 l9 j+ }4 T( ^! C) s, V; x7 K. K8 G
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
) l( T* ^% m2 j( n9 d while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );5 @( K( P, @# X
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; T5 \1 i. k8 @" Y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );9 |7 Y# ~. ?. n; w: S+ E
) P* |/ V2 ]- c% g6 k/ F g6 B [; l /* Write a 0, so that no underrun occurs after releasing the state machine */
. \1 \. e/ T$ h; p mcasp->regs->XBUF5 = 0;
: r" t; g* W9 C2 [; A mcasp->regs->RBUF0 = 0;* v) i4 J# e Y! L0 r _5 g
0 x; [ F( D( o$ u% C
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
3 f2 a- G0 u& u: Y& q% O while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );+ `$ A. V4 |, o2 z8 @( ]) j3 x
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
, T9 ]( A9 X; ^ s, r3 }; f while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );0 n# z+ v1 f9 `; g) \9 ^
+ x( {+ T8 G. R7 H mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; " Q& p+ E: {0 a7 f
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
0 r: X) ?7 s3 l, p+ G mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
8 j$ T/ ^( s I5 R. v6 {& u' t while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );2 [4 P! Q: B; S; ~+ }: r
/ J8 y6 K6 p/ a1 w9 h# Y9 ~
CSR = 0x0000;
6 w4 O) z \2 q* v. l X0 Y* L" B INTC_INTMUX1 = 0x3d;
& T! I, @1 U- ? ISTP = (unsigned int)vectors;
& {5 x* \7 p& r ICR = 0xFFF0; 7 W- `$ v( I5 C6 l/ ?
IER |= 0x12; l o6 Q1 p4 g/ ]8 h" g
CSR |= 0x01;
) P# r* h, J2 u$ k+ }6 |: Z3 s! j* o ]7 r
k! B# W8 w$ e9 R6 u8 ~8 n
4 n8 d# p" M# I7 V4 @ A还有就是两个输入输出函数:
1 [8 v& q# Y1 w9 y9 m9 Q1 v. E: jvoid output_sample(Int32 out_data)6 }: a$ Q7 Q* E2 T) k) P
{ q" |$ s+ a$ T# `
AIC31_data.uint = out_data;
% R F0 k( A+ |( t" `+ A G MCASP1_XBUF5_32BIT = AIC31_data.uint;
9 }9 h/ [! I# f( R) z0 a6 i( ~}# y; }- o; R( Y2 n8 ^" K. u
# X1 r, z+ b! B
Int32 input_sample(void)
2 H$ z! M# F+ F{
; j) m# p; g- m) w' [/ } AIC31_data.uint = MCASP1_RBUF0_32BIT;
4 v% D' r; T4 H) s3 R return (AIC31_data.uint);
, e, Q% ~6 v: l% z ]}& K3 E0 G8 N, U% l+ {
& X0 h" n! [$ T3 I
|
|