|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
% J6 h. s+ p0 P% ]. l/ jmain文件:
8 [8 c4 z" G8 x+ \; e2 Y$ X9 Yinterrupt void interrupt4(void) ) d/ I. ]. ^- y/ K' F! R
{$ o7 z; l+ U# ]8 i$ ~% C
Uint32 sample;
8 ? R' x/ E% X3 m B% ?5 k9 R* U& p6 J3 B
sample = input_sample(); // read L + R samples from ADC
v# m; l2 \, H6 i8 f1 U3 Q+ ? output_sample(sample); // write L + R samples to DAC % w0 j4 K- z+ d; ^
return;9 B. {) w- `, L4 D. _4 `# w
}
+ z& e, D* r+ x- Q$ p6 T" G! u+ e& Q$ p8 K( ]
int main( void )
% E; \: L; c+ i. _+ k5 r& ]+ Z{3 P$ K+ h5 U- c5 D* O
0 U4 f8 z* N2 g4 R5 t" S /* Initialize BSL */
1 R( W3 I4 y3 u: x8 l+ S# z- r EVMC6747_init( );, c+ R3 J; O: E3 u+ w. m; ~
/* Call evmc6747_intr function */
$ l4 W0 h3 b; I% M E" g+ ]+ ]7 N7 X1 ? aic3106_init( );
: ^ f# ]: D" H4 @+ Y% ~ while(1);) S% N3 s& k: t8 k l9 Z! w
}" p& s% N2 g5 s w
) l% `- a( s8 L. C# c6 F
) @ U# T$ ^/ j9 s$ D4 ]4 baic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题) J; m1 N$ s& ^. ^% ]* z1 a8 E; m3 u
/* Initialize MCASP1 */6 G/ Y( W# R3 @) Q4 Z
mcasp = &MCASP_MODULE_1;2 r) ^6 _5 M: b2 o( m8 V6 i- I
mcasp->regs->GBLCTL = 0; // Reset
3 h2 o* F( [4 h/ }9 M; v mcasp->regs->RGBLCTL = 0; // Reset RX6 _9 S- ^) |3 O! q6 h! x3 g2 f
mcasp->regs->XGBLCTL = 0; // Reset TX3 X' W+ I/ k. _. p5 Q2 M
mcasp->regs->PWRDEMU = 1; // Free-running! Y* ~8 r. y) m
// configure McASP0 receive registers
) F" h0 t5 B1 R mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used5 U. W# b' I. l) c
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus2 D, d4 s3 y1 m
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
& M! g9 c$ O8 a" q* \% h" |6 }* i mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
! z: h, h/ h, E4 u" N' d( B mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)9 m+ K# u6 a; l2 m, M
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
% o7 D k& W: Y, q4 u% P) e mcasp->regs->RINTCTL = 0x00000000; // Not used
j$ ^- A6 Y1 i# y+ }$ f mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2563 B. Z1 S) s P+ G& L# U' B
! P. `' ^! ?2 k
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
, c& P$ e# @5 O, C! h, S mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 l- Y, ^$ \/ s8 U0 u mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word4 ] q5 c! r7 e: p* P5 _
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16: J( Q P6 M' p4 r
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
: Q; \1 ^9 ], o6 \3 \( F7 i mcasp->regs->XTDM = 0x00000003; // Slots 0,15 n* |6 }$ H( k. r, M: v1 L- ?
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
& n, V( R8 w) a: N8 `( w mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. ?4 s6 a7 f9 b( c& v3 @
o+ s7 S6 E8 D mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN( L. j2 T P4 ]8 C2 w" A
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT" B( A3 s5 w: g
mcasp->regs->PFUNC = 0; // All MCASPs
U5 n9 D) y% p, n mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1. i; z7 e# A8 s" r! @9 \: E
) S, ?, q1 B6 r* b% y
mcasp->regs->DITCTL = 0x00000000; // Not used
0 X" e# N* y: ?1 y3 V/ P( L8 s mcasp->regs->DLBCTL = 0x00000000; // Not used
/ `* q7 Z% {( f% x3 h mcasp->regs->AMUTE = 0x00000000; // Not used
7 G G% @! Y" x2 E1 W. h w/ Y0 O2 R% _& x/ P! A
/* Starting sections of the McASP*/
b% Q* d9 c% r" @; g mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
2 Y5 Q9 r' L' c' i& N3 I+ ~' ] while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 5 ]7 P% S8 j, n+ z+ K% E, U9 ^
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
8 T& }9 i3 U" H, a3 G# S while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );, e/ T- H5 h' s$ r6 [9 W! l$ H
: R8 J$ Z2 V5 R0 T" P
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
% a1 E% O( s' m( s3 y' r0 c while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
" Q/ n4 O4 e! l" @, X1 U! w mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 4 v0 J9 O$ y. z4 `+ F
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
0 H* L, T3 C1 ]5 m) b( ^- v3 I2 |
7 j! v; i3 l# b8 y5 ? mcasp->regs->XSTAT = 0x0000ffff; " ~: [# c+ u6 E5 O% ~+ |! Z7 w( O
mcasp->regs->RSTAT = 0x0000ffff;
5 E0 z1 h& ?& [5 M% u
% n: w- q9 Y* z mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
5 i( l' ]! j! k while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );0 F |! A5 \% L [ \) A9 I T0 R
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
6 n/ `0 ~/ h2 r9 [' J4 B/ q \ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );/ [+ n u: ^8 [& ~4 v
. o F7 l0 R ? u0 I- v0 a: e
/* Write a 0, so that no underrun occurs after releasing the state machine */. F1 o; }/ h ^4 P5 j0 [
mcasp->regs->XBUF5 = 0;4 a- P! Q q+ Y3 q
mcasp->regs->RBUF0 = 0;
, d# ?# V- b: q) Q: T `0 B I& j. h% P3 ?7 u! x
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
; g1 w# H V# Y) z2 z+ \: Q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );& K% O$ I4 T! Y5 r2 k+ z
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; + K. C# m U% U" ?8 ~/ J
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );9 t5 W" {! E+ Z) U1 H
; ~& ?+ x1 H8 l2 o& s" u; H% Q5 U2 q
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; # `7 w: O0 M0 e# B7 ]) ?' ~
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
1 k: x% |8 g4 \. U* r* W mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; & p/ n3 z/ b; @+ \% o8 v
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );- ?. s) v% I, q: p
. y8 z1 w3 o. n4 _' l U6 m CSR = 0x0000;" P$ C; [6 l6 o& ~8 u6 I2 o. a
INTC_INTMUX1 = 0x3d;
9 n$ {/ t' }$ y/ Y% ` ISTP = (unsigned int)vectors;$ H- W4 L( y* x
ICR = 0xFFF0; & l/ s! M/ B- V, c! C
IER |= 0x12;
2 B7 @! q' P/ {. p! Z8 ^ CSR |= 0x01; ' \" i# M0 _( e5 V
) L5 ]& i+ f2 T. v2 y: t* v, \5 I8 K
w$ [6 U, t1 P- q
还有就是两个输入输出函数:
# p5 t0 ~. _+ [8 c, Fvoid output_sample(Int32 out_data)* y* t* \# l' v J& k9 B0 G% |
{
" Z) p' z1 l4 q; ?3 m' W' d( V+ R0 m AIC31_data.uint = out_data; # S4 C/ p" Q, u1 W
MCASP1_XBUF5_32BIT = AIC31_data.uint;
: T: Y. D: `* z% _( e$ @; N}
2 i) {+ b5 v$ l
" o- L" ^+ u8 I6 Y' P+ ~9 K* p1 vInt32 input_sample(void)6 W* z! @$ G3 D
{
- {+ i6 \2 n9 \& q, X9 @% _: w AIC31_data.uint = MCASP1_RBUF0_32BIT;+ H# v/ i4 ~6 Z5 ]8 _+ o$ _& n
return (AIC31_data.uint);0 D; R1 l$ L' n
}
# W8 s8 E( ^" @$ A
6 V' d$ U8 S2 p* u3 K" J |
|