|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:. e& ]' c7 }# D
main文件:
0 ], P; p3 e3 k8 u: Ointerrupt void interrupt4(void)
( w5 V' P' a; n) b5 }5 \! Z{
) g% Z" u6 u& L, z, W Uint32 sample;% D9 U- I. `: R! ?+ C3 h5 n/ h" S
* i8 Y a% h2 c3 ^$ v sample = input_sample(); // read L + R samples from ADC ~, T6 V2 ?7 w0 D& {$ U" W# A
output_sample(sample); // write L + R samples to DAC
" C% E, t6 H% r4 j7 o5 f return;0 {* K; }2 F, G% `+ b( Q, P
}
8 I# b4 g$ y" _2 f. G8 S) M4 w& D
, C( L( U j( o- b9 Qint main( void )
% M4 ~3 a8 o5 I, i% P4 B{, n* h9 t N8 s* w7 y. i) I+ p
& }- S9 i2 Q7 g) [) V4 L/ q f$ l1 s
/* Initialize BSL */$ ^( m. o7 g; D1 M
EVMC6747_init( );! Q5 ^4 Q! ]1 A! G" W3 M, T6 z
/* Call evmc6747_intr function */
. y; s( V/ {* X aic3106_init( );
; @/ j& A# i3 v, V a3 f while(1);
~' E4 D! A2 \. q, J}
' ? F7 W/ G( Q0 W& T$ \$ n' E: W+ S
2 i$ a+ G) Y. w1 u8 L/ ]/ t+ i4 l, E
+ H! G3 K/ W) L9 U: V, q7 F. jaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题0 y! p, q# g- [9 [& w4 @5 L
/* Initialize MCASP1 */( c0 Z( l. ~8 v6 \' `2 C Z
mcasp = &MCASP_MODULE_1;
. s( B% J% p3 K d$ ?0 w7 Y! u mcasp->regs->GBLCTL = 0; // Reset
& Q" y* ^# c/ Q; E mcasp->regs->RGBLCTL = 0; // Reset RX
$ M5 f* F8 D$ O) P3 c- T+ _" r* d mcasp->regs->XGBLCTL = 0; // Reset TX
S6 ~5 y/ N& q# b+ P1 r mcasp->regs->PWRDEMU = 1; // Free-running! o- b* x4 o- P D, D$ ~
// configure McASP0 receive registers6 i0 P$ f: t1 k Y* B
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
- z8 {/ e1 `3 ?8 u mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus U$ {9 M4 _& {6 z3 N; L+ U- o3 m; U
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word. I7 J7 o9 b3 x. N( J
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
2 v: g5 x# E7 P5 ]4 q" \ mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
9 u) ]( |: P7 l9 ` z! [, F mcasp->regs->RTDM = 0x00000003; // Slots 0,1& [, e8 X$ P4 i7 ^ ^0 b
mcasp->regs->RINTCTL = 0x00000000; // Not used, m! f3 \0 e8 Y; v" `3 }
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256# h/ }/ a# g4 `% F) p# A
" J& ^7 P4 q+ c# ?) [0 A; C+ k( v
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
4 O8 p9 T, W# I/ R/ g mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 e( x Z4 F- ~ mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word2 }9 V! k; A7 v; b+ g; W
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
8 K* q2 p/ D% A. p! N2 ~3 n0 R mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK5 P, a5 @% H# @- p+ S
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
* S7 i/ f4 h6 o+ H" _ mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit5 y& X% H1 A! w2 E4 Z
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 M. V0 W. D' R3 [. L L
5 X& `/ S# |6 `1 d mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN9 ?1 S+ ^$ o/ X, ?
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT, | E0 o# S+ D/ ]* H8 g! @* q( \) r
mcasp->regs->PFUNC = 0; // All MCASPs1 v- \3 s$ `3 g* ?- v( X
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
1 }& F/ D1 T7 o1 t4 Z
% y0 a/ H' X# U* N4 {, b" g mcasp->regs->DITCTL = 0x00000000; // Not used% _& |' u% t$ @* L
mcasp->regs->DLBCTL = 0x00000000; // Not used: L2 o1 _4 V; K" y Q& Q: T
mcasp->regs->AMUTE = 0x00000000; // Not used- _ f7 Z# x! z3 T4 X
; b( q; F! A0 y$ ^/ h$ B/* Starting sections of the McASP*/6 u7 U" Y5 E/ K0 J4 s4 g Z! N
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
4 M$ l. |! f% w0 } while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
& V, P% S- z+ r* ]# n$ i K mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
. P4 E$ `. i+ [% F: D9 V8 h; O while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );" M8 s# m# ~. T
+ t3 O! d, }/ @$ a y0 y5 q; ~3 _" Q
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
5 `2 j1 u: W+ C/ k$ I while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );& C' i& o1 |) c2 r+ x
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 0 {% F6 M' ^5 c' p- D% I/ D! X" B3 J
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );4 z) r) ~7 d) O; x# ?
" |/ H8 {( _- K- ] mcasp->regs->XSTAT = 0x0000ffff; ; [& \3 p. `, `
mcasp->regs->RSTAT = 0x0000ffff; ; u) i" y; d& A/ U
9 M* x" b' R1 L9 P" Z
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;2 G$ r, f0 y, y" _! m* a
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );. d5 F% v4 z V& T0 {6 J
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
8 m4 u$ B4 c9 }/ z while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
8 W5 v' Y5 o% r3 U$ C; P. i
, w3 G2 E! F# v+ v8 i" A /* Write a 0, so that no underrun occurs after releasing the state machine */( ?. r' p$ Y) [. M. S/ J( W# {4 I
mcasp->regs->XBUF5 = 0;
- W; \; l; d9 X! R/ P* l mcasp->regs->RBUF0 = 0;
$ \ d, y: R/ \ A0 }8 v! q: x
: ~3 F# A/ q& }. S& h8 ` mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
0 s' S: e2 Z, a7 g& ~8 Q& y& _, H2 ~ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
* X0 T2 ^8 H- _8 G2 Q mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 3 `8 K4 e1 |# r2 s2 G/ Y* r/ N
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
" W6 t7 X: {# g* @* S5 j& Q; {) [( i7 A( E6 a
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
/ q0 {% g0 k& b+ X1 r( g while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
1 H: @5 E$ h, q' B" e% y9 K mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ! @1 s* y- @% o* R+ F, e' B9 T
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );' m) O( H- S% z( j. Y. b: J* h
8 f1 a! N) H& J1 P* @0 E
CSR = 0x0000;& Q Q( Y" O. w, e$ a% @
INTC_INTMUX1 = 0x3d;" Y! ~( V g' W2 j/ n7 [ ?: z: E
ISTP = (unsigned int)vectors;
0 l6 ]+ F, Z+ j' U& R; V4 ` ICR = 0xFFF0; ' h& j8 w' A2 L" J+ Y
IER |= 0x12;
# @# j# l1 |0 B' t CSR |= 0x01;
2 p2 r- n \0 b% S' o# X
: X- b1 _9 j% q: x; f. D5 D/ z z3 E! }1 A# B: N4 [
1 ]: C0 ?7 i- Z) x
还有就是两个输入输出函数:1 _, q+ D; z: n
void output_sample(Int32 out_data)
! C* k! r0 w4 R* ^+ u/ F( a{4 s) v" l. @2 k
AIC31_data.uint = out_data; 3 G. k' }& \$ F3 E6 o! k
MCASP1_XBUF5_32BIT = AIC31_data.uint;
6 m: H! A+ M" n' f* k A}
! C2 X3 P# h# R7 @$ j$ z4 d m+ N! A( f Z( y+ i& l" O
Int32 input_sample(void)2 P: C+ j2 ^+ |) i+ f: O. z
{ ! v) r; u# u5 D; v
AIC31_data.uint = MCASP1_RBUF0_32BIT;( t% Y8 ?9 g1 X* s5 {+ g
return (AIC31_data.uint);
8 O/ i9 G- k& g9 [( C}9 P5 Y5 g9 L9 Q; p" @9 U
+ H# _# s* {: j6 p1 E+ C
|
|