|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
/ M! m! e0 x7 b% E7 k- ]main文件:
7 l. e8 p% r0 J' b& b4 U2 V5 Pinterrupt void interrupt4(void)
/ G1 T- a7 P3 X6 V$ c, Z{- ]' G0 S, o3 [; @
Uint32 sample;
6 ?' o# U& z5 s& }6 v! S: I0 x" t2 J
8 W2 I% ]" r0 `( V, s9 L# b sample = input_sample(); // read L + R samples from ADC
" z/ C# j0 m0 h4 J# x& ` output_sample(sample); // write L + R samples to DAC % n% i5 g: {0 R) G
return;
' `* P: z# F/ b# {, s. A}* H1 o( C7 f7 V: ^& |
" }1 s, i3 P. D/ E; O: P( q
int main( void )3 ^. \% f n2 R% k5 @
{. b! K# A( L- ` R ^7 E& P7 R& m! S
& j: n* x- q* @8 z+ H: k /* Initialize BSL */1 z( m9 o5 G+ H' [) z
EVMC6747_init( );
) A8 \0 O9 n' [" J/ k* ^+ b /* Call evmc6747_intr function */
, w; ^! w/ W& E. o: Y+ X aic3106_init( );
7 d% v# q9 p+ T; l9 Y- E while(1);# N$ `3 X% n! B# o! W6 S
}
: I4 ^% a. P4 M, v# m H( {( s# i' s6 Z P/ P( v3 q: g
6 G- R" q7 q1 \7 D: t
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
* g7 D- J# I/ }3 A+ W/* Initialize MCASP1 */
. F9 l3 S9 t! t* j4 S3 P& V mcasp = &MCASP_MODULE_1;, ?! K- r8 i I# ~. j7 l: L* ]
mcasp->regs->GBLCTL = 0; // Reset" M, U, }' k) x7 I5 n# j. x( t
mcasp->regs->RGBLCTL = 0; // Reset RX
/ o7 Y' W* D! H9 L, T mcasp->regs->XGBLCTL = 0; // Reset TX, n5 z- V/ J2 c! x7 ~/ v
mcasp->regs->PWRDEMU = 1; // Free-running
u2 `7 `+ o0 e$ U" I# Q // configure McASP0 receive registers# x9 S2 ?' R3 W8 s \4 r
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used4 X! h0 f1 \* D8 h+ h1 l
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus' q& L6 Z' `2 A/ _5 g
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word, J j+ o" t8 S) i; t* @; H2 ]
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
! U* _ x( Y- V. z4 ~$ ]6 r mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
0 |! e2 o. O3 v7 O; @; [ mcasp->regs->RTDM = 0x00000003; // Slots 0,1
9 p; c* P3 F f6 q! I# v/ ] mcasp->regs->RINTCTL = 0x00000000; // Not used
) D' `4 D/ L; ]. r, U& h9 f mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 b" i( m1 I# N7 p" ^7 Q1 z
2 K* z! w g* Q mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
* h2 W" p) M: B! W9 ?: |9 T mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus9 M; J* z4 Z2 b- E" N, O x
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word. k' V7 H/ `5 J7 }$ x
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
$ x- O8 w9 {: ^+ |* K. ^ mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
- n* [$ K2 I. N/ [- ]' W8 I$ N3 J( A- X mcasp->regs->XTDM = 0x00000003; // Slots 0,13 S' q" C1 h# F3 j# V ?! D
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
; N3 ~' z( v4 Q5 } mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256: c& I* p3 x( V K8 m
# o4 X0 V5 _5 x* h8 T a5 B" I: C mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN; `9 Y/ O. i' J; B' P% t
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT3 j2 k Z% I( i
mcasp->regs->PFUNC = 0; // All MCASPs
5 K$ J: Z8 B- y9 T, G; X mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1) R% _6 R2 o- J9 D* e* v
, x8 ]; \( P8 @& K
mcasp->regs->DITCTL = 0x00000000; // Not used
1 R; J K( H' n& i9 W mcasp->regs->DLBCTL = 0x00000000; // Not used
% w* }% N+ X& h% R3 _5 U9 W mcasp->regs->AMUTE = 0x00000000; // Not used" n/ h* X% @6 C+ _
5 Y2 k, f/ f" P: R, A$ p2 f8 y4 `/* Starting sections of the McASP*/
+ o- ~6 L% r$ W7 C/ [' [! V mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ; J' e6 ?6 v- X( f* [
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); / l: `% _) E% w( y3 j- p
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; / C( X5 }0 \( W |0 u- N# R
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
$ p7 l2 u: c4 v, D
+ r6 v; O+ P# k# [! \) c mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 1 ~( Y( n7 o6 _! t
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
8 o! g4 f: @4 M9 c# a mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 7 ~! c. O7 `6 f
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON ); x6 |9 `$ r6 U$ j9 F4 r
/ R1 ^ S4 S4 }4 ] B( @3 S mcasp->regs->XSTAT = 0x0000ffff; 8 d; W: U) ^7 b. p. ^4 ]
mcasp->regs->RSTAT = 0x0000ffff;
- B i( |* V' D3 C
7 f3 {5 v# P8 |# ?& K$ n& k mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON; _- e+ d, I( k: ?0 P1 N; V
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );3 G- |' t% Q% c; o' F3 |5 u
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
+ ^& |0 D. v _- M+ G4 v5 ? while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
: p6 A' D9 b) y& S. h/ J
% X- o4 I% {/ z5 h, Z u5 I /* Write a 0, so that no underrun occurs after releasing the state machine */% ?0 C1 h9 i3 Q1 W7 P; Z6 {, J
mcasp->regs->XBUF5 = 0;& C* k+ l2 F4 G
mcasp->regs->RBUF0 = 0;+ ?/ J, o$ x! Y l( y2 E2 f' r. {+ }
# ]- Z- C& ?5 H7 B4 I
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; - E N! ]& y6 b- [ K4 r- e
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );5 S. G4 h' H$ D
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
7 T [$ t/ n* N& H/ e: z" f3 S8 W while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
9 \- e8 C/ z- d$ ^) f4 s/ L
& G$ W/ V U% q2 o5 ]9 r mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 1 v0 W' I& i% e8 U0 n. r
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
- _7 L# |6 d3 X; w& D2 r mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
! J6 L* _- E+ u" i while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );) h( U- H6 L. p+ ?
, j4 ?/ k: m2 s5 z CSR = 0x0000;' B1 e' p7 k( A
INTC_INTMUX1 = 0x3d;
: A; f- Y/ t- ]3 U" \- S) h8 e ISTP = (unsigned int)vectors;2 a* y, B5 I) w/ ]8 T3 |
ICR = 0xFFF0; 7 b6 l: S) S2 y6 x8 Q0 ]9 h- @5 x! O
IER |= 0x12;
V3 Q4 G& }$ E: f CSR |= 0x01; 0 u1 i& q5 Q# \( U. f
! }2 _9 v0 b! p7 ~) O( K! y
- P9 K3 V x- q
' V5 f8 f8 w# j8 ] C
还有就是两个输入输出函数:- j' t8 J( S o: h) d4 |7 b
void output_sample(Int32 out_data)
$ X# u* ], u9 }* O{
8 a# x4 L* U7 F9 D AIC31_data.uint = out_data; 6 h( M$ A2 |0 _: R8 f0 _$ F/ _
MCASP1_XBUF5_32BIT = AIC31_data.uint;0 P6 j6 c( X4 U1 R' N
}
* V4 A2 n! d- D
+ }& w: H" y+ J! _* \Int32 input_sample(void)* V, ~$ z7 C; L% o, O
{ 2 I/ ?5 `3 `/ u3 q9 |, }
AIC31_data.uint = MCASP1_RBUF0_32BIT;
4 [; P# ]: C i& S. u/ X# N return (AIC31_data.uint);
( v4 J! F. H. M* K}* q4 l& K! p1 ]' G& ]/ z) V% i
6 T) d/ ]* h8 c6 W6 e
|
|