|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
. K% |, X) c. W4 @* {, f, r& Z' |" [main文件:$ X" D3 y7 b% o5 r$ P+ ^
interrupt void interrupt4(void)
$ H7 L0 {) u1 X{7 \" M2 T0 _+ w. d2 @7 {% L: |
Uint32 sample;
! O/ x2 Y) ]4 W9 W6 |4 G( M- J; O7 c; C
sample = input_sample(); // read L + R samples from ADC
4 Y1 z* E% }0 n8 L: O6 Y0 p6 h output_sample(sample); // write L + R samples to DAC
$ U3 G4 L. h9 A M. Z+ Z# X. m return;+ R8 `1 I" ~1 w' ^. ]
}9 u3 j) U O6 {# i5 v, ]
4 ?/ L' J+ N) H' J
int main( void ). E+ E9 [2 {+ C! @; M$ x
{
% C4 l6 M( u0 j5 u
- [; D0 T3 E# r( I8 b3 X1 m /* Initialize BSL */' i( u* k, C/ c1 ^9 |" V
EVMC6747_init( );! P9 r2 J1 X9 T2 n! o M
/* Call evmc6747_intr function */: p$ h! p ~, h" Q3 |! I) @
aic3106_init( );
T" u0 f* g2 Z8 _ while(1);
: y h; e! G% `9 o}! R" z6 c$ G8 x5 v; f
" E% c7 ^7 m1 b' ?
- f- [$ m* }9 \5 t3 }! h' Y3 aaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题 f3 O8 y, @# l6 I5 m7 Q
/* Initialize MCASP1 */4 @! q" p' G1 _
mcasp = &MCASP_MODULE_1;
/ Q. a- A$ G _" T8 h/ x mcasp->regs->GBLCTL = 0; // Reset2 o% U. ^' S" J. s
mcasp->regs->RGBLCTL = 0; // Reset RX( k; u0 Y& }- M. [- T0 c! W+ T
mcasp->regs->XGBLCTL = 0; // Reset TX% i X, H4 l I! T& g {
mcasp->regs->PWRDEMU = 1; // Free-running/ q a1 n) s' n3 [
// configure McASP0 receive registers
! N. ?3 V0 p0 n- {9 X( E# b/ N mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used) V( s- m* K- s& K
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 T- f3 c; R9 y1 H; B6 [ mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word2 o$ ]' e' N4 n& l( E) o
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)0 ~3 ]& }! v$ P
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)0 X: n; U8 b1 ?3 b" V, f4 W6 `. B/ z
mcasp->regs->RTDM = 0x00000003; // Slots 0,11 ?( E6 b+ X, v3 V, x* G
mcasp->regs->RINTCTL = 0x00000000; // Not used
' J+ z% y6 c; N$ ~3 O- Q) M, U mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256* y9 _5 q! ?% K% G# i* R
- O9 o$ {) J0 C" ^9 s
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used3 r4 n: F3 ~8 ?0 A- v# Q6 S
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus3 e( X- a2 T+ V8 s/ `8 L
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word- I6 f$ K8 \1 ?9 x+ f! l
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
k/ C& M& c* ? mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
& w/ p T4 f# S* ~8 C3 J mcasp->regs->XTDM = 0x00000003; // Slots 0,1
% E- W, m8 W2 n7 Y mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
# i: d' R% ]. \ mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2561 R; @* T+ w ~1 { Z9 q! o4 ^" a4 r
" `/ L7 D" c! z4 t, R mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
8 z5 g, M7 D( B4 t5 @" _ mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
8 H! [9 y. x0 y+ D. N mcasp->regs->PFUNC = 0; // All MCASPs3 [4 O. T6 y& \3 g9 }' v- v+ o3 L
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1" l9 a. Y2 X2 ~- t- E6 }1 P( s
* O/ u5 a9 y" ]0 @
mcasp->regs->DITCTL = 0x00000000; // Not used
2 n) C3 j: S& z7 }& ]2 o# w mcasp->regs->DLBCTL = 0x00000000; // Not used
1 A! j$ y. w$ T" `, {; R mcasp->regs->AMUTE = 0x00000000; // Not used
1 z& |6 p Y5 A8 v/ j2 s! T" k/ J! {; a
/* Starting sections of the McASP*/
s5 z. A5 p- A9 R B- A0 S) M mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
u; ~: O' ~; v/ ]5 m1 E while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
3 @( {. o/ x r* j$ C$ D( n4 ^ mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 2 r2 ~+ A8 X" ]! J2 C2 O0 X
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
' U$ J7 ~2 F# B" Y+ J& a$ Y# ]5 _: Z* _8 }& n# s( h6 I {; v+ ~
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
\9 a S! C( G5 C: ~7 ^/ f, I while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
( H0 z9 H) G. X mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
3 @# u a1 z; D" |% M9 F7 ~; S while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );4 D' F7 {' T$ e# W
& y2 R9 q0 g9 n9 @ mcasp->regs->XSTAT = 0x0000ffff; 7 Q/ f1 S- e; H" W9 ?% J
mcasp->regs->RSTAT = 0x0000ffff; " W; b4 |% {# {! ]. j
8 Y2 G5 q- w+ W, W7 Z+ M7 U H
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;; r' k/ `5 @; n
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
4 p; L6 U% S$ [ mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
: e% K; k/ R6 g' u5 m1 l* j while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );3 t: w$ w+ l' Z h' U
0 C5 p% r {: r# p
/* Write a 0, so that no underrun occurs after releasing the state machine */
) h. ^7 f4 v- `" D: R% k mcasp->regs->XBUF5 = 0;
$ m8 @+ Y0 X( |; }$ S mcasp->regs->RBUF0 = 0;
: r% P% R- V" \
0 \% k: s- s$ [% ?, E3 \/ r( I% ~ mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
# d$ s3 z9 n, T& ], W9 k9 _% @ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );$ S, Z V- q, F
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; - E6 v2 J) O. V5 D) B# U; V- \
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );1 v# j: p6 H5 x y; g
0 i8 l; F; |( v# t( g6 W mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ) Z' I. s" T3 ?0 m$ u. d
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );( A8 A) \! A4 E* n. Y) g
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ) {) D) f, s# X, L, `$ N* l( y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
4 P) h0 A# \7 r) S) C1 n& q+ i( o4 Q5 f5 [
CSR = 0x0000;+ v+ q; V, A# C
INTC_INTMUX1 = 0x3d;6 w3 A( g: f( z
ISTP = (unsigned int)vectors;
- q5 |% m& e# r5 F& q5 i ICR = 0xFFF0; + U' O2 ]6 P3 r% H+ J2 z$ s a0 L
IER |= 0x12;
+ V5 V. F! j2 K CSR |= 0x01; " B* W6 \2 x% K! h3 {3 Q8 U: c
3 J& h2 @/ C& r; S/ O$ ^) x- e9 }- \4 S6 L; r5 _4 C! J: g* P0 J* C
. R2 S/ c3 P0 Y3 Q( |
还有就是两个输入输出函数:
: [* P: D/ t' ~- m* }void output_sample(Int32 out_data)5 {, s9 v5 D2 w$ O- Y- j
{
" H+ u" b7 G! s& z AIC31_data.uint = out_data; ' I6 p* _' X6 }: U
MCASP1_XBUF5_32BIT = AIC31_data.uint;
: D S( A9 V- C+ L}
. [8 y% d, ]3 X2 i* o9 u/ `5 p8 c+ ^1 W4 z
Int32 input_sample(void)
4 H# o3 j Z! X f( v ?! M: ]* v% A{
& u% b$ U/ f6 Y5 G! H) } AIC31_data.uint = MCASP1_RBUF0_32BIT;
% n, ]- M* Y/ T+ z4 t, W; p3 V& B return (AIC31_data.uint);2 H$ q2 q. {3 _5 j. v
}
5 y1 F3 \" E I: X4 I# a1 c% X+ G" P5 O8 `: p9 j, w
|
|