|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
1 l- u* ^' o* }9 O+ x* q* _main文件:
: p# e5 u& Z$ S1 _% M3 B' _7 Winterrupt void interrupt4(void) 4 m- N7 Q2 G+ q. a! u) D
{
% l! C9 e; T6 R/ R- J, i. h, h Uint32 sample;1 `7 t2 E& V ?1 g2 S* E
& t* K O5 \& K" v
sample = input_sample(); // read L + R samples from ADC
2 ?# C) L8 ^* X9 ~! e$ W output_sample(sample); // write L + R samples to DAC ; w: p8 R5 ^ y2 [ W7 c
return;
* e: Y i6 l& C V9 X, N}1 W+ I' j/ {5 |& y- O
* d5 _% N7 Q4 Q
int main( void )
: v" R- h6 ^5 s{
! T: T9 ?& }! }3 m- I2 b, R4 V4 i; W* g. q1 Z! }" f
/* Initialize BSL */" L% S2 b' q8 ^: E% X( f# T/ m
EVMC6747_init( );. v6 p( o, w& ^+ H7 ]6 X4 r
/* Call evmc6747_intr function */
! d* z/ L" _+ w aic3106_init( );
( C- q* G8 F" I7 w; Y7 u while(1);& n* D; h; k+ R- I
}
; R, D f: S) o3 H) r2 D# o
# ?/ k* W; B* Y% s2 ?8 ^! M3 p9 f* x8 s: z
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
$ a( k0 b2 j' ?+ ~& W/* Initialize MCASP1 */0 Z; K6 W2 J1 Y, q* M8 B6 l9 k/ T
mcasp = &MCASP_MODULE_1;
+ b4 Q9 X9 s; y mcasp->regs->GBLCTL = 0; // Reset
7 [8 b; m- h1 ], g0 o. K8 ]% p mcasp->regs->RGBLCTL = 0; // Reset RX
) f9 M+ G$ D8 ]2 @4 [! J mcasp->regs->XGBLCTL = 0; // Reset TX
/ u. X" j& b, t! \8 R% G* M mcasp->regs->PWRDEMU = 1; // Free-running
* l) i' M4 u, v/ o0 z1 s! ` // configure McASP0 receive registers, o8 c9 @$ h2 E( Y: R2 Q
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
( N) J/ Z1 ?$ o9 G1 [/ H# y mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 w3 g' f) |9 B( V8 P, N" K5 \ mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word- G0 U# B, @, h& H- h
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side). y. K, F" ^: `6 l) U9 c! v7 J
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
0 e6 l4 q9 I. Q* n2 G mcasp->regs->RTDM = 0x00000003; // Slots 0,1% H8 Q R1 H1 l; ^- g' X
mcasp->regs->RINTCTL = 0x00000000; // Not used
3 F7 D" m! p: X1 v+ ]% D- R mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
$ t1 D6 C3 X+ x2 N" M+ C5 e4 z6 r5 d4 b* D
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
' Q4 P8 B5 i/ A mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. j) ^' D, l% p, z; m, g" g mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
7 }0 w) _0 |8 T, c mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
* A" h1 u$ o: a. \+ P: Q+ r mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
# f1 m6 g$ ^. G" g6 X4 J$ K mcasp->regs->XTDM = 0x00000003; // Slots 0,1
0 H/ H7 _& N. S0 E mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit5 {6 `, x+ U% R, z4 {
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2566 Q5 S" u3 ~. l
+ K0 _! o0 V- L- F
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
) x3 I2 x* I" X, z3 P; P+ G mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
) {* g6 B5 Q: Q- @" l* ` mcasp->regs->PFUNC = 0; // All MCASPs
/ `3 C' C( S. M& ~3 f o- d mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
1 K" p& r8 Z' B& w& h: g" A
/ |; S+ K- f G* B. v& }6 j mcasp->regs->DITCTL = 0x00000000; // Not used& o( u5 M W5 Z" E2 Z }
mcasp->regs->DLBCTL = 0x00000000; // Not used
& l0 X# G$ g6 b/ I) v1 y mcasp->regs->AMUTE = 0x00000000; // Not used7 {# }% Q; Y1 V' t
% i% L# S+ a( {
/* Starting sections of the McASP*/6 A' z! K) v7 j2 r% Z
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 8 f1 R: S# g+ c2 z# b
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 0 g* a& i5 v4 a1 }, K: {
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
; n% _! m- _6 y( J) I" G1 j9 W& j while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );( U- e* A+ t: d- l. r7 _
, _% O g; J: T+ h
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
5 r6 c% S M7 S M7 J! q. v8 W while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );& j- N0 W- z; ^8 X
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
# T1 F5 B; ~% C: b$ U while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
3 `5 m+ J8 m w: J' f2 V6 J; F$ j: A" B ]3 G6 j; C
mcasp->regs->XSTAT = 0x0000ffff;
4 Q6 M4 p. T P2 W2 c( | mcasp->regs->RSTAT = 0x0000ffff;
1 M+ K9 | i+ x5 v, i+ ?: j0 {9 ^
9 |7 r7 o2 k2 p3 z* T% V! a% i4 j mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
- u" G. n1 O8 O" ]; z+ [3 N$ I while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );- ]# Z% X$ X: o) b2 ~5 J
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 0 E( `" E, S# ]4 }
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON ); ^' \1 O+ a+ l0 `/ g; c) B+ f
2 ^' P1 n$ z' d7 Q6 I /* Write a 0, so that no underrun occurs after releasing the state machine *// d: f+ r! q% A e
mcasp->regs->XBUF5 = 0;
; m3 D" b! r3 m% s; {9 r mcasp->regs->RBUF0 = 0;
$ I: O; J" B' [. b0 u6 O4 h+ n @6 N/ F9 q* p" r/ t) y
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ! S: ~+ V5 G1 M* }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
. @2 x4 B% I. P1 q6 R3 R$ u mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
& p: g/ l0 U, [/ I# Z: j; h while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
8 ^3 ]: I* U9 X
o( G; b4 L, e% i8 r# I* m mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
$ D- p+ z. n4 C2 S6 p while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );/ l3 s6 w! ?$ G7 S% `: @& f4 i/ k
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ; y4 \ ~% E$ E
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );0 n3 b9 X2 I6 o! c2 r: j# C
' N' t) ]6 a+ A2 q- c3 @; J# v# h" D CSR = 0x0000;
) S0 ]# C+ ^8 ]0 |/ }) B: S5 s INTC_INTMUX1 = 0x3d;
1 c/ Z/ n. z5 W( r9 ?) n ISTP = (unsigned int)vectors;) Q0 ^$ k/ y; m r) K7 W
ICR = 0xFFF0; + k. |5 ?0 v: V. }* W2 H
IER |= 0x12;
# i; S8 _, @! h' K3 c CSR |= 0x01; 5 \! C2 O+ A: l z9 G1 f0 v; i" `% y
7 ]* [+ Y' d% D" g3 m5 m, K* M
/ x2 O7 B. n4 R0 L% w' o2 C
; u; I6 J' ?. m7 q# Y1 r* p; t0 u" m
还有就是两个输入输出函数:
+ r) s B* E6 b5 q3 vvoid output_sample(Int32 out_data)
0 q c# Z2 x. d" t$ \. n{) W9 q8 c# l7 Y1 I4 C: a
AIC31_data.uint = out_data;
`% k# G3 ~6 N- o; y* p MCASP1_XBUF5_32BIT = AIC31_data.uint;: h. S7 ]9 i5 o+ ?+ X3 V
}- p. P0 \9 m/ p* Q) k/ V
* z* P, \2 @' i& @! U4 z
Int32 input_sample(void)
+ F1 e" u8 D2 i( ?/ _4 Q" |% ?2 Q{
6 {3 X4 j% n4 N- a- N+ w! m$ f" c AIC31_data.uint = MCASP1_RBUF0_32BIT;' \+ n; o1 i, S3 p4 ~
return (AIC31_data.uint);
' `5 P0 a3 p( I1 Z) Y}
, G( N8 o1 _ e" v6 p% w7 m
) _/ ~& ^: N4 X0 u, J; O, D% L2 ^ |
|