|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:, J7 \5 \. m4 |& ]" H% G; y
main文件:) n( O2 o5 k! {
interrupt void interrupt4(void) z( l8 t3 K( _; L! @: p5 g
{
+ y; w9 l+ ~. T. k+ a } Uint32 sample;: i8 H) f' J' T c: h% c
/ l1 n+ r C8 k9 x
sample = input_sample(); // read L + R samples from ADC5 a9 D% e' s3 T
output_sample(sample); // write L + R samples to DAC
+ [5 K/ I% u) a- j% c* I return;- m% f* ]7 ]& b& k' X' ~9 F
}
: d8 b! H' ^: S2 @ B5 r9 B% S% X8 [3 ~# O; v* R$ U% ~/ h
int main( void )
8 j/ I. G' c# h# E. V# N7 }2 j{, \! K( F, y. \. N' y
; E1 ]% g8 s! X; \0 W /* Initialize BSL */
* e: l4 j, ^* [! z EVMC6747_init( );
9 t4 p. t4 m4 l# S. x /* Call evmc6747_intr function */7 t, u8 j- ^ [$ b! d
aic3106_init( );
* c9 X9 p) l$ b while(1);2 \2 H5 C( g* Q( o
}, \/ y8 `# ?" n
2 c# x) D" i+ a0 o- J8 m# X" v, }: _) P' R3 [& }9 I
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
: z& [& s8 \" H6 Y# D6 Q/* Initialize MCASP1 */* I' x: j q; d% i5 ^
mcasp = &MCASP_MODULE_1;, S/ G$ G5 G: l4 g
mcasp->regs->GBLCTL = 0; // Reset) d* D1 }3 W! c* q d6 z& J3 v
mcasp->regs->RGBLCTL = 0; // Reset RX
1 c* H4 L3 T7 s# T& g mcasp->regs->XGBLCTL = 0; // Reset TX
0 W2 E, p% L# r3 o mcasp->regs->PWRDEMU = 1; // Free-running
5 U' B6 q6 u( x // configure McASP0 receive registers
) k: H6 p {( ?/ C+ y5 x S& y5 z mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used! r% ~- \ O4 J2 ^, W* q5 t
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus5 A+ S9 J3 t: e! a: ^; k4 @
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
" u5 u* S* T( e* P mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
" G5 d0 \0 E4 X9 E mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side) V! w9 t% }; k6 f; H
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
7 | ^6 {1 B- j mcasp->regs->RINTCTL = 0x00000000; // Not used
; \& y% @0 X' p6 G& m" d( K# f mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
- T/ V$ @) |: c0 @. G l" r' ^4 G
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
' d; [% a# S' J6 _$ O; c6 q6 ] mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus$ Q/ \7 Z, n) v* c0 c
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
7 P* L8 V) `/ N0 w4 g% J$ R; w7 s mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
2 O3 T- m( G3 e) c, a mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK% @) \9 J6 m( x) K; i0 d$ _
mcasp->regs->XTDM = 0x00000003; // Slots 0,1# z& }1 t; i( ^& ^) W
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
4 w, ?: j3 g( D) V: n0 m5 }5 j mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 ]8 G4 ~ n$ s1 H1 P8 {7 b3 }8 l5 T8 Q
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
5 g* u* _' E) P$ c$ I mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT% @+ j1 m1 J W
mcasp->regs->PFUNC = 0; // All MCASPs
$ P' ?% i5 M6 S, U0 M+ i mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1 \1 a5 _6 H* C( o9 P
* t6 z' ]8 Q, F( t mcasp->regs->DITCTL = 0x00000000; // Not used
. f! @) n6 v( e5 F. p8 Y4 l) y mcasp->regs->DLBCTL = 0x00000000; // Not used
) S% T4 ]7 X4 G% T0 C mcasp->regs->AMUTE = 0x00000000; // Not used) Z2 w7 w6 j3 i) b
# s0 m: J/ A ?& Q E/* Starting sections of the McASP*/5 Z7 Z) `5 [- I: M
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 1 O; O. ]: f9 F6 J- Z! T3 n; l
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
' @! G9 z' D: q; S9 c- y mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
; q4 M5 e8 v, B0 r" C$ I3 b/ V" W; R while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );' V" e# d$ n& A% C3 c; |# d9 L. x
, }6 B) \* g3 V. c% S/ h
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ' k' F$ g9 k& a) s' q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
( W7 |; U. m! |4 x1 f mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
4 E* t$ J5 r" J) A6 |" I while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
6 K( |& d0 F) n! v; a, o, B: D! {( R" Y/ I6 ?2 L
mcasp->regs->XSTAT = 0x0000ffff; / I* ?% Z2 N* h6 T! ^
mcasp->regs->RSTAT = 0x0000ffff;
; D1 q) |- X* r! c$ h; Q7 j; ]: D( P, c- b( a
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
" j1 ]0 n! K& Y+ @$ X$ ] while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
& v# r8 ?4 }' R" x4 s8 D, K mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
: e$ |7 ~7 t% P8 A+ \1 f& _8 Y while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
+ E( D4 ^+ o+ P! o
2 \! ?2 K* K0 M: I /* Write a 0, so that no underrun occurs after releasing the state machine */. Z& x% [' _" s7 Z0 _) N
mcasp->regs->XBUF5 = 0;
6 O8 h( A: S, Q3 l D" L mcasp->regs->RBUF0 = 0;
9 v0 ~7 E* K7 t) \9 O ~
- U' ~9 S9 ~7 k mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ( s& P4 x& H& R! H! v7 Z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
5 z$ p/ A& ~1 v! |( `' \ mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 5 [( G' b4 i# ]8 }& ]7 g
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );' F% {+ H& }' d+ I8 T
# J0 @7 o l" g4 b mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
( O1 r$ o" Z) J& ]0 ]8 k" K while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
) q3 c- \5 u" W, e/ | mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
6 O$ K: ]7 @$ @5 \ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );' t C% g1 f' o- l4 ~# E8 H3 w( N6 l1 E
% T2 C+ I7 c% ]& _2 N3 L$ u$ \$ j
CSR = 0x0000;
% E+ u/ M; T. w+ Q4 L- O& a) h. s INTC_INTMUX1 = 0x3d;
7 c% s0 m5 p4 q2 W( a1 Z# [/ X ISTP = (unsigned int)vectors;
5 H! A' E1 _& H7 U0 V. z* ] ICR = 0xFFF0;
" M8 ?: N) P* S- B# M3 t IER |= 0x12; & I9 ?/ M7 O1 v0 l( o, h
CSR |= 0x01;
; K- i# V1 J( W% L" j6 `- H* T4 ?8 V5 F s: X+ v' p
8 d P k8 R/ o9 J' Z
8 O9 Y8 L; T" i4 z. T. u
还有就是两个输入输出函数:( t5 S7 i) ], o& M
void output_sample(Int32 out_data)
. W' u, q4 B- ~& i" k) W% x# J5 P{4 |/ W. I) R, @8 _7 x" ?' _5 D* H
AIC31_data.uint = out_data; ) x8 ~& f1 j) {# ^: N) O
MCASP1_XBUF5_32BIT = AIC31_data.uint;
/ S) D; T) C4 S4 S) e; e* Q}
# \% O. Y' x. z4 C2 d9 E8 X- ~- h" i' u P; M Q
Int32 input_sample(void)
2 O% C2 S0 B. X |{ / r! G( Y4 M% e3 f' B: i
AIC31_data.uint = MCASP1_RBUF0_32BIT;
4 o+ X$ h0 t7 J return (AIC31_data.uint);
* n$ h! e0 C/ l4 Q}5 D5 w7 c; s; F$ T7 F
2 |2 I% F# d& B9 V' [& D9 l+ H |
|