|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
- o7 S. ] d# I1 D' Lmain文件:$ ^6 y" C# e* l5 i: m
interrupt void interrupt4(void) # h1 A2 Z+ U. s2 V& p
{
, ~. r3 A+ G9 Z0 u# l Uint32 sample;
" C8 J, T# h! r$ R) ], D! U, w. y+ [- E: U8 G$ E- o' w" r
sample = input_sample(); // read L + R samples from ADC2 K/ N/ x, ^: v0 @2 Z
output_sample(sample); // write L + R samples to DAC
& c& }/ N# v' k! G* B return;) I$ v) f7 e6 t y d
}
8 ]% _0 Z A. {% C9 Q V- A
6 P5 _+ X1 T8 E5 bint main( void )
4 O. P6 {; ^: J, I* i4 A, g{1 y; [7 |: G& J, ]4 b. X
3 f% s$ i: [- d# ^( p4 L; m* B /* Initialize BSL */; e7 R8 P- o2 \( j! {
EVMC6747_init( );! P4 l4 Y! L4 \; h- U- I
/* Call evmc6747_intr function */
; [, ^1 e8 B* u aic3106_init( );
8 {6 u X7 s/ F3 a- V- P while(1);
- T3 j" J( L: _}
0 h* i: q9 y+ p4 i
: o' W# a7 X1 n4 X1 }
4 f% A( T2 |( r8 T9 ]5 _& Eaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题. W0 F. L k* G2 T/ n0 V
/* Initialize MCASP1 */
. J( P) ?8 C- B; I' j$ e8 A' j mcasp = &MCASP_MODULE_1;, d/ R6 K9 V5 f; ~3 t
mcasp->regs->GBLCTL = 0; // Reset1 P3 P6 J$ H6 _2 W) k
mcasp->regs->RGBLCTL = 0; // Reset RX! S. O0 W" d( H
mcasp->regs->XGBLCTL = 0; // Reset TX6 `$ v5 N7 b$ I8 r
mcasp->regs->PWRDEMU = 1; // Free-running8 E+ Z G& D. x( t3 w* j
// configure McASP0 receive registers. p+ g, s2 g/ e
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used/ D5 A' z6 E0 F Q
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus" X6 w0 [. i- K6 f% m7 g9 ^
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word. f1 U2 v7 G6 T- Z1 Y
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
A3 e" T! I$ P' v& X* p% _ mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)% Z5 s$ z. n1 ?0 [. V
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
- U! O3 B! v+ [3 L# u mcasp->regs->RINTCTL = 0x00000000; // Not used
/ P! i& R3 Z0 g3 K9 k mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
t# s$ R- H4 m# ~& u( I
1 Q; f4 W7 }; u$ v. l1 B# Y* S mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used$ l. Y# m1 n/ f8 H0 y. \6 M$ h
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus3 P J+ W9 A/ ?5 i
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
) j) k$ m7 }- [3 ~& Y7 Z5 ]4 w7 A mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-167 L1 m& g# ?1 S- T: r1 l6 Q
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK+ C( r V) a: j; B. _" m
mcasp->regs->XTDM = 0x00000003; // Slots 0,16 J6 F: ?7 e* `/ ]; I; H. M
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
6 q) e$ V. a: i9 c c mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 {4 I% ?4 ~! ~# w {& Q$ D" L; y: [
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
5 e& m4 b/ q, \# v9 }8 h5 V' f mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT; s$ `9 l0 }, J! K6 l+ d. k& @8 R1 J- V
mcasp->regs->PFUNC = 0; // All MCASPs8 e7 a1 o) ^! v; B8 Q+ }$ d d
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1" m9 {" _5 V5 J" b* e; @) y
& D; B* f* U5 \7 N) [ mcasp->regs->DITCTL = 0x00000000; // Not used
7 B9 _8 |" V; f% p. B% F: `- f! V! J mcasp->regs->DLBCTL = 0x00000000; // Not used
- W( {7 ^* ?. y4 x! p2 M mcasp->regs->AMUTE = 0x00000000; // Not used/ V7 f3 y5 \/ B1 r- O' I
% F, d% x/ O7 v8 Y% I" v3 i/* Starting sections of the McASP*/5 D9 K4 |( g4 E& ^6 ~
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 8 P8 \6 E% ~4 T( g) f$ b' Z; ]
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); ! W: q% [* ?. r, c2 b
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 6 E7 q# F& o' S/ D# ^# _
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
1 H8 \& e" z4 F, `! K* F7 e! E: p& x9 a- g4 H0 i: [; x7 }
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
# `# b4 I* G3 E" d5 V1 P while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
7 V* [! F* X/ }8 _ mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
% q {; S; f: k% |4 s while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
: Q* x* b: w, ]% \6 w5 F/ P6 |; w) ?. \$ `
mcasp->regs->XSTAT = 0x0000ffff; * a+ L/ V) {3 ~1 y' q' I
mcasp->regs->RSTAT = 0x0000ffff;
3 W2 |3 ]6 O( _! v) N/ w, @3 t( D* @8 F5 O; B
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
( |$ h0 f5 Y, U; m6 ^& o/ \9 P while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
+ G+ y% k4 ~# ~9 ], t2 K mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
$ ]' p5 g1 h9 e# Y# z8 _, f3 E while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );7 b2 d( [( j+ {; N
( p) X+ [6 {* @9 z' D/ h /* Write a 0, so that no underrun occurs after releasing the state machine */: _: _! a$ w4 H; o2 k' M- p
mcasp->regs->XBUF5 = 0;# Z7 o7 K/ }" Z5 u6 |2 I" S' |
mcasp->regs->RBUF0 = 0;
$ ~& t7 Z, @- ` L
& W. X& M8 Y6 y( H3 [5 R0 c mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
8 m4 O' w+ r# p0 Z1 u while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );( O$ k0 e- p2 `0 r
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
9 g4 u& B8 @/ B$ B3 x. A& J while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
- C( r+ e' I# g# N8 A/ u& C8 D. Z
* T* @" t9 L- n1 x; W2 j& | mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 9 ^# b/ A6 Z- r- H; ^
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );! V$ h* K' I" v B, B, o+ [& V/ V
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
1 P" j5 }7 A3 L; i# k while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );6 ~8 c' r! H. N3 L/ x
6 s; ]% [9 u& b% k" z' \5 ~
CSR = 0x0000;. P3 M# b: N- ]$ ^ `0 R3 V
INTC_INTMUX1 = 0x3d;
' |; z# ?8 R. L% \" {+ N0 h, ?- b5 J8 b ISTP = (unsigned int)vectors;
4 o9 o9 o; Y7 q1 J: C- f ICR = 0xFFF0; * B, ?4 F6 h9 j& Q
IER |= 0x12; $ l- l) I% Z+ Z$ E; ?, t
CSR |= 0x01; 0 r1 E6 l' F& @' [: c2 T1 q9 _
1 @: B/ t: f% D) Y6 h. K2 b3 ?& E: T
7 r) W) I5 U9 x% v7 u( R3 _. q2 Q
5 o2 V; L g6 a/ `' N- |7 S还有就是两个输入输出函数:7 T0 A' q$ A; \! K- a" T
void output_sample(Int32 out_data)# J7 w% l7 L& q W$ p$ O2 w
{' w; _; A5 \( I# C8 m, d
AIC31_data.uint = out_data;
8 f0 D' P, E+ K6 } MCASP1_XBUF5_32BIT = AIC31_data.uint;
& {( n2 F3 Y) E+ h8 a$ {& f}
+ S3 o& {' @2 W2 S! _7 @3 D0 n" M/ g1 {
Int32 input_sample(void)
+ B% ?( m4 B; T; f5 Q{ # P3 Q% X9 Q7 c: e% h2 A% B. n
AIC31_data.uint = MCASP1_RBUF0_32BIT;
; y- p1 w& B5 \* d return (AIC31_data.uint);
- O2 ^# t6 d& I}% C- h9 j3 ^5 `3 n, E& i
4 l0 m. r8 @& O: w* n7 {& C |
|