|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
+ X) _8 z9 q% f- u) X/ lmain文件:" l4 M! H' ^8 R1 x. B, y3 q- q
interrupt void interrupt4(void)
# [) Q. U6 F& `$ Q O/ _- G: L8 _{
2 i0 \ j& A4 n- ~: G Uint32 sample;% ?, a6 V/ G6 j5 N. E- C) u
0 v4 k$ J0 q7 F% z. _: r+ V5 V. ?8 G
sample = input_sample(); // read L + R samples from ADC
8 f1 ?+ S# B' D! C7 ?# @, Y output_sample(sample); // write L + R samples to DAC
: b0 `* `: T c" q$ t& ^ return;
/ x7 B. E) V. X$ }; m! N/ X/ z1 d' x}& b# v3 J& J- C1 ]
, v2 [+ M, B( h2 r
int main( void )
, k1 s3 V0 X/ e) j{
# o* s i' I- @- r% L
5 Z; Z( D; _4 t& f0 ?( c /* Initialize BSL */
/ ^* C1 K/ c% X7 y EVMC6747_init( );0 s: [5 U0 s! r/ E
/* Call evmc6747_intr function */
0 L% B1 u7 a8 d8 J aic3106_init( );
! a- b+ J# n, l% i7 x5 A" ^ while(1);9 t/ V. F$ p5 J
}
7 m5 l8 H/ _* |+ o2 Z y- P0 Z- F3 G' i1 o
2 z" Q: E, ?# U3 q2 t G. [% aaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
6 Y/ K% H9 h5 {* r' Y; A/* Initialize MCASP1 */
& k ] y. h. E mcasp = &MCASP_MODULE_1;( c7 F4 x* o8 M! R+ e
mcasp->regs->GBLCTL = 0; // Reset
1 q- M1 X' K P8 B2 |1 p. a mcasp->regs->RGBLCTL = 0; // Reset RX( o4 Y2 u( {! Z" x6 U/ V; N; B
mcasp->regs->XGBLCTL = 0; // Reset TX
7 b$ [& R1 r, e, E; H4 M0 Q mcasp->regs->PWRDEMU = 1; // Free-running
) j. P. i& U6 h; ^& j+ m# Z( A // configure McASP0 receive registers! Q& R# G9 {4 c0 ~4 l" ]
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used3 n% E! A/ I3 L: r7 \; d5 V
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus# _4 z* D5 L& c
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word8 ^4 W$ q8 M* s8 b3 b
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)5 I: t( Q- `, i3 d" n
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
. Y$ X2 Q: l+ x% w& ` mcasp->regs->RTDM = 0x00000003; // Slots 0,1& ^; B( H$ |& B! X+ Y
mcasp->regs->RINTCTL = 0x00000000; // Not used+ E* C- [, l( W; i( Q
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! K2 w$ Z7 o3 q* l+ O. N
. x$ @9 u( s( D4 G) x3 \) }9 a& v mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
o$ G7 U r7 @, `: v0 q( W mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus) `. Q9 \/ c$ m3 Q0 i9 l
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
/ i: I+ @- r0 H3 G7 h mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16% {9 A! J" ?# T# @: b% J4 q6 Y- ]
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK1 Y# n5 ~1 w9 S+ N5 z4 m* r# ^7 v
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
; v; O- C7 l& J e9 Z4 B mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit9 M; j3 L7 e. u0 n9 w' p
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2567 [. U6 f6 A d% O9 R, _
& z5 {4 ]" N; r- e4 v mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN* f, Y4 x3 J* g" W+ {7 \, b+ ^
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
/ e$ u8 k4 B2 P, ~ mcasp->regs->PFUNC = 0; // All MCASPs0 P7 a: w) N0 I, @2 Q
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1+ S8 c* \4 ?$ W" r
/ }0 k( U; G' i2 O% ~1 N! {& i mcasp->regs->DITCTL = 0x00000000; // Not used
( g6 u' B8 P& l mcasp->regs->DLBCTL = 0x00000000; // Not used6 p2 S* \5 L! S) l. Z6 i
mcasp->regs->AMUTE = 0x00000000; // Not used' D) i9 q) m) }' I3 c; R
0 x$ A, b! M: `' R
/* Starting sections of the McASP*/8 v! _; I$ B) U$ P
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
1 l' G1 a8 a8 Y ]. M& F( [1 M# V4 W while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
K0 d7 c# `( P5 c mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
4 j" G% f, K5 M; f3 g, m( Q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );$ q: D! C' M* C+ W3 C
3 P" |% E4 G i- @$ w+ ~6 c
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; - y# A0 M( c# ^" L& }6 }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );$ p1 s7 J& n9 G7 s; l4 t4 q6 @: I
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
2 g( g' x+ d b while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
5 n5 i$ x- I$ a3 [8 t5 h+ `0 d6 w3 `8 n Y7 G
mcasp->regs->XSTAT = 0x0000ffff;
. m1 D9 R; _$ G9 E3 w+ C) Y mcasp->regs->RSTAT = 0x0000ffff;
1 D( j0 `' ?7 _2 E
: [) E* s5 w; Y mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
3 [# c9 Q, s: _: A3 s while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );2 C y0 ]6 b+ m" K
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
9 V7 a! K4 R/ D5 H3 L Y) w7 ? while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );3 {! {: V, B! |3 m/ w p( g8 U
. c, _ k" ~4 H3 ]+ B) P /* Write a 0, so that no underrun occurs after releasing the state machine */8 r( j, ^% V4 r5 }# u
mcasp->regs->XBUF5 = 0;
. l7 }& q& j9 q9 h! P! n9 ^ mcasp->regs->RBUF0 = 0;
$ U$ J( ]/ D; J! g7 @9 i% A W' `, \- E( m: b0 H
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; : c- e5 z$ V9 {$ s7 l2 L. g; ~
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
6 M1 ]4 c9 C. w' Z+ ^ mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
$ t U8 s7 \ a( B5 Y0 ` while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
9 o) k# N6 n# x/ z9 H8 _. c4 N8 z! n) W N
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
8 X( M1 f: J8 j2 H9 `. @7 L while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );0 D/ u4 A. `/ j |, p3 E! _' z* ^
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 0 i. {, [ q, Q$ l" k5 ~" w% W* m
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );9 C$ S' [& [0 a! _/ x
5 e+ ?0 p& R j- G& H CSR = 0x0000;* z8 [/ S! O( N0 u! u7 N
INTC_INTMUX1 = 0x3d;* [4 L/ T K1 B7 J& O9 q
ISTP = (unsigned int)vectors;
, U( T- `- \: ^& | Y+ _4 [: F9 O ICR = 0xFFF0; 1 Y' h; I# ?0 Z( Y, S3 j
IER |= 0x12;
% d! l, E9 j- e1 ~! p CSR |= 0x01;
# x' r- Q2 U0 q2 i Q) O5 L; ^
6 G& |- _% P" r* J7 U0 Y! u ]8 _
8 n8 |& Y" m8 ` I
还有就是两个输入输出函数:
. O5 s2 F6 d$ m4 p4 w$ G. mvoid output_sample(Int32 out_data)
7 m% j5 H6 f" d# M+ c4 M& A{
: ?; x {7 O) K% ?- N9 u+ {! j5 i AIC31_data.uint = out_data; 7 M6 ]* w1 P0 a9 ]8 }
MCASP1_XBUF5_32BIT = AIC31_data.uint;* h+ E) f( o9 V) t
}
% R2 l$ A$ G b' [& v1 f$ h' R: C: _6 U& Q
Int32 input_sample(void)8 M+ i: H) m1 N1 ~2 d' v
{
/ d I$ R, _, f( `+ W- n/ w AIC31_data.uint = MCASP1_RBUF0_32BIT;
; F4 A7 B+ Q6 H, Y return (AIC31_data.uint);
7 e' S4 |3 b7 J# N$ v) X}
: l; a( v+ j5 Z3 c& V, a* N
7 w I* p v6 O+ k+ g- ~ |
|