|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
: o" [, y; A) `: ~4 ~6 fmain文件:
: P) Z# h- e2 ]1 B5 S- t" L, Cinterrupt void interrupt4(void) 2 s! o& U3 a! z( ^0 F
{
, X$ A& P3 t; Y/ b* t$ w Uint32 sample;
3 e' K+ m/ _- d7 ^! ^
6 o5 n( Y+ X, [) J) { sample = input_sample(); // read L + R samples from ADC
3 Y$ b. l5 z4 `. @3 Q$ |) b output_sample(sample); // write L + R samples to DAC
# _2 a" X( M) m return;5 c+ w, L4 l0 A2 N
}
2 X5 ]! J/ \1 H; V" R
2 R( X2 N1 H/ c0 f9 Cint main( void )! M; h& V( R( g* Y% w+ J
{9 y) P0 O; o# |
9 L% O% ?' N9 L* Z, ]
/* Initialize BSL */' W* s: l4 M+ X4 J0 ]
EVMC6747_init( );9 }. ~8 b5 N7 D8 H, C7 I
/* Call evmc6747_intr function */+ E9 [' V+ C$ ~1 G$ u% y% f O
aic3106_init( );
& m9 q7 \5 T# {/ j$ f9 V while(1);
. B( \ g5 i9 t: U: W( a, \5 Y4 J}$ }# [7 N, H+ A, c
/ ?- o% A2 d: F" B- I+ P8 o5 K7 o0 Q5 b& B- q! {7 v) c+ i& ?5 g, y
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
8 ~0 _, d9 H( q# s# m9 j# m/* Initialize MCASP1 */
7 p- W3 M: n$ ^, n. H) q" P mcasp = &MCASP_MODULE_1;! X- ]" C G1 P$ ]3 Q
mcasp->regs->GBLCTL = 0; // Reset( N8 ?6 v, k- |! L
mcasp->regs->RGBLCTL = 0; // Reset RX: P: P( s1 _ ]# X4 e
mcasp->regs->XGBLCTL = 0; // Reset TX
. E+ Z8 V7 I b mcasp->regs->PWRDEMU = 1; // Free-running6 N8 e1 v: B$ U: M" S. j0 i0 t. `
// configure McASP0 receive registers' \2 A. B5 G# w. |3 h6 m; W7 N4 \
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used5 \+ I$ _1 x/ w! q. J2 c
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* G6 n' \, ^# G& t0 ` mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word' J7 U8 A" m" Y0 t5 \* O
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)1 I6 O* G: v* l3 E
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)3 W, O6 |3 R9 M3 v
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
- `, p: p* S! I# \4 W# U" d1 b( h5 X$ d mcasp->regs->RINTCTL = 0x00000000; // Not used, P8 E, {1 d* T; }* U/ d
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 U1 x2 A/ k- J' a9 s: \: `5 ~& {, H8 z; F9 d8 ?' I
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used. ?+ f; o7 a$ y8 @' p% Y* S0 D
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: m+ v# m4 I0 _( y% K mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
1 `. o1 c9 }! R mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-164 `; m* w* s( K1 a9 g
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK% U; ^. `1 {* P" a+ Z' a
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
$ l3 P E9 p! w; B1 @ mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit- A0 ~# @1 m8 A; C/ s! H0 [
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 S! {, C6 H" b- K
6 \! Z: c' a5 W4 U' l( `" C3 n
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
6 F* |$ h6 Y6 V0 d( b mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
% G: y1 V" Z5 U5 P8 S9 ~; Y! O( x mcasp->regs->PFUNC = 0; // All MCASPs% m* U+ n- k2 M) ?% ~9 Z$ Q3 d
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
$ a. R' I$ i8 j+ x4 g% A: O* H9 v
6 {6 L) A7 L' X* J0 Y- A3 J mcasp->regs->DITCTL = 0x00000000; // Not used
1 H6 q" N1 a2 u3 {2 ^- w9 E- q mcasp->regs->DLBCTL = 0x00000000; // Not used
$ l Z; Y* j; i- E9 w4 w6 _ mcasp->regs->AMUTE = 0x00000000; // Not used, l) Z( ~: W# P" s O- P4 c; F& |
" ]- W7 b7 k9 l7 i; H8 @/* Starting sections of the McASP*/& r: T4 m' H+ S+ U: ^$ }! C, w
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
5 V5 o0 U; H; m" ` while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
( ^4 s; c4 N- N6 V* n; O8 e1 k mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ' v3 R3 k9 H# Y9 v! c
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
' B& m1 L; \( h: V" }" [# [8 ~. e$ X5 X" Y8 R% c
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
9 J6 Q6 E. f2 U3 t' t8 Z I& L while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );7 t; E3 k0 E# \
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; : p$ E" Z6 e. n
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );0 r( W& c* h5 B7 O
6 X" o& A* z/ u ?' j mcasp->regs->XSTAT = 0x0000ffff;
% j% r0 j# }) a: H mcasp->regs->RSTAT = 0x0000ffff; 1 X7 N* P( T" @, {9 k
0 A/ t5 o/ r% L4 P* u/ e! V x
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;7 G/ b1 e* p4 m8 W' b
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );- Y& v! V h+ D
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
3 o: B6 o* ]2 ]' J& y5 e while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
2 V6 F! z" S, b, `. z7 V; v/ U8 P
/* Write a 0, so that no underrun occurs after releasing the state machine */
- v9 F* W1 @0 e. w0 L mcasp->regs->XBUF5 = 0;1 q, }# T$ N! h
mcasp->regs->RBUF0 = 0;9 d; F* M3 R# g% b6 d( J
7 k" i$ v6 M. P' N
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
8 b: z% Q5 K6 D* s, z while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );/ j5 c! R3 v. Q: d
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
: b6 C4 R) f" t/ ^; d: V2 ~. X+ ^( Z while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );% A- \) L! y9 j3 A ]# |2 f
( _1 t" N, A3 j4 O: o2 T# C, N, I mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
: F0 O& @ I& M$ c7 l while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );0 n& ~- M9 |2 F' w
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 9 Q& d! Y$ g6 o9 W: m/ L
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );# f* k9 [% N' ^- Z+ y- i
' Q( u# c( A8 P/ b3 \$ o% ^
CSR = 0x0000;
; L8 D; c* h, P% F INTC_INTMUX1 = 0x3d;
/ x2 ?' m5 n; s, J ISTP = (unsigned int)vectors;
: C( X; ]: e( c: S ICR = 0xFFF0; ' U0 { t& N8 L/ t
IER |= 0x12;
% n x, v7 b4 i5 S: F8 L& Z CSR |= 0x01; ; H8 J3 |! Q7 }- I
& b9 @+ y6 S9 {7 l; q {7 u8 r4 |; o0 t( S7 S. }
6 A7 j; s3 L4 O: P o K0 |; [还有就是两个输入输出函数:+ @/ ?: v) x. u5 N
void output_sample(Int32 out_data)
6 U& y9 G, o8 k6 f{5 P! I- t# ]5 x/ S4 L9 ?
AIC31_data.uint = out_data;
$ G. s* |. n" x MCASP1_XBUF5_32BIT = AIC31_data.uint;- Y0 t8 D% u/ N+ T. j1 V6 S1 F
}
6 I+ C$ t1 P$ [% f# E8 ~4 ]' G5 s' W2 @; T6 n, T
Int32 input_sample(void)
" P$ r' B) B+ C' b: N{
8 g: V; W; [9 E* S/ J4 s1 j AIC31_data.uint = MCASP1_RBUF0_32BIT;
8 ^8 O+ H S8 H+ O6 y7 O4 u! Z return (AIC31_data.uint);8 _8 C! I5 U4 \/ e& H; {8 n3 C b
}
0 Z6 E0 [; \( I7 `4 }
1 ?5 b7 T: @( @, F |
|