|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
& a3 U" H) U7 X* N; h5 Pmain文件:
2 P& R. [' V$ x3 i0 f5 Uinterrupt void interrupt4(void) , t+ H6 p' E( o" l; A6 \9 G5 s" W
{
' _5 _( S/ C' r2 z' m q Uint32 sample;7 X p3 h% m @% w/ `
' C, \! S3 V2 F2 o4 T+ h' z sample = input_sample(); // read L + R samples from ADC3 r1 X) M6 Z0 M
output_sample(sample); // write L + R samples to DAC 3 x) l1 v! ^- e) A4 ]3 X1 S
return;; l, R& u! [. F) s7 _
}' i5 U P* R1 e- F! \* h
. q& \. q( N, W9 S% D# F
int main( void ) P9 X# I. j$ q z
{
D$ v4 ^% I# Z. }/ v/ M" E, t0 \4 s% ?* ]( w$ `$ v- X( V
/* Initialize BSL */
7 A: l! ^ D8 q EVMC6747_init( );; }- ?/ @6 \2 n) @; I8 T
/* Call evmc6747_intr function */! H. Q+ _6 t3 X! y
aic3106_init( );
7 D8 u- _ h. P6 W4 q; m while(1);
& b+ Y* f9 k; Z: \! I; X}
* I: q0 ^3 ]# y! x( S, z. n! j0 }
: j+ Z: |, i! [# ~% p' M; g3 Z! V+ E4 f8 N. X$ D3 F
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
# M4 q/ d. b) i! u6 }/* Initialize MCASP1 */) t \- c( H7 N: }9 C
mcasp = &MCASP_MODULE_1;4 `+ y& s4 J% y/ Q4 d8 l
mcasp->regs->GBLCTL = 0; // Reset
4 H+ Y2 n# s; i# ~1 ] mcasp->regs->RGBLCTL = 0; // Reset RX
% U! S8 t( n- o mcasp->regs->XGBLCTL = 0; // Reset TX
7 n: p/ ~# Y, M3 R mcasp->regs->PWRDEMU = 1; // Free-running, p' E$ U- K0 M3 P6 S
// configure McASP0 receive registers
: T4 t5 z) @, L/ P/ `- ]* `9 ? mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used! R8 s* o& C: k0 @+ D9 }9 h
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
! ?; @, }( R9 ^5 | mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
$ b5 D2 |* ]& }" S w$ B mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)6 W) t3 E; R8 g* G0 _6 ~; [
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
' J H5 l& z; Q3 G/ u mcasp->regs->RTDM = 0x00000003; // Slots 0,14 x. d# T4 E1 M7 H) q# w
mcasp->regs->RINTCTL = 0x00000000; // Not used- `( w. }; X- S5 T5 P% w% X% l
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
' p( H* {6 G" B$ |2 f, `2 V9 c. m7 e* G$ c' b9 N
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
9 @/ P$ Y2 I- C0 Z6 X2 ? mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus) O6 J/ \0 d2 _& ]7 F" n" ?7 r: Z
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word0 P1 p& g( d# D' I
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
+ \" i2 U' m' ?' o- t- V mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
: s8 J0 C0 `* o mcasp->regs->XTDM = 0x00000003; // Slots 0,1
3 W$ G+ {6 x- B" j. H* l mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
0 W( q* m/ d/ t' r6 e mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: W) P$ Z* h& s* `& w" m. v2 p/ e% A- y! A
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
* _+ p! Y: D4 A U mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
2 o& @: s8 K# x mcasp->regs->PFUNC = 0; // All MCASPs
$ V9 g4 I: r+ E mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1% p/ ]2 j5 O8 n$ w3 h9 ^
, |8 h9 [. D. A5 _ K2 u7 r4 a
mcasp->regs->DITCTL = 0x00000000; // Not used
/ |& U: |' s. I7 K mcasp->regs->DLBCTL = 0x00000000; // Not used
& {& r5 ~$ `: H T9 v8 K mcasp->regs->AMUTE = 0x00000000; // Not used: T! m: V+ i6 [8 F8 x7 L
! \' |, i1 ^2 U3 p* p( X- f1 ]/* Starting sections of the McASP*/
3 F8 n5 F+ G. f2 p' r. z1 D mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; $ [! B& m/ x9 y0 V% `6 i
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 7 Z; M2 l4 f# ^* q5 {* U# j
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
2 t. M J* Z8 X8 j q5 e, Q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );9 [ i: }, ?0 z: J0 }9 H
! ?: M) H2 i& [. } mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
- K+ j/ e N3 y- F! H) v3 z- G while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );* j& y; N$ f' E. Y2 \" z
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
' L9 v& j0 N- ~* Z: S while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON ); E0 y( `5 f9 v! z$ {+ d! [" H
8 h0 _5 a2 q, f) U
mcasp->regs->XSTAT = 0x0000ffff; . {" M0 V2 f5 u# N$ c8 Y6 q f9 ~
mcasp->regs->RSTAT = 0x0000ffff;
+ A3 v: C! y2 G7 H% b. c6 ^5 N/ _/ B
5 ?2 n, V0 u$ U" I& B) P+ e$ Q8 U mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
7 {: c( @( T$ ~: r5 q& v$ | while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );! _9 s) g5 y2 ?1 j
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 2 U# t. ]7 Z3 z$ S! O' c
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );! K, \3 S! Y" c& B# Z4 ]$ `
H* u- }( d2 Y+ _& T9 x /* Write a 0, so that no underrun occurs after releasing the state machine */; [- Q1 p* W# S3 c
mcasp->regs->XBUF5 = 0;) u5 J' F6 g k8 |
mcasp->regs->RBUF0 = 0;
p* t. M+ f C- v( r0 V0 H& S5 Q' C: I% D0 z
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; + d) w# W& { n) Q3 K' z; y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
( @% @5 p) Y' \; z( A/ T' a mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
( F% S$ t1 b. D- K; F: s while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
* Y$ u0 g. f- T+ x9 e8 Q
; I7 u9 m3 U- t mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
z4 m& ]0 l% R) m7 q2 K while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
+ m' W2 P! ]: D& A mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
0 B, z7 \/ Y+ ~ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );2 `! h3 [: p/ w" z: e2 [, n5 b
7 [( `' F9 I# H; Y8 `) ^+ E1 q CSR = 0x0000;9 i9 A! d3 \0 h. ^ H5 F8 S( Y
INTC_INTMUX1 = 0x3d;+ @! Z% {! Q: i
ISTP = (unsigned int)vectors;
4 D/ K R4 J9 f9 h" L% B ICR = 0xFFF0;
; {7 v. E3 N; K4 A g IER |= 0x12; * G$ Z( V8 a7 B0 `
CSR |= 0x01;
. y: w- V, f' v* F. E& o- e q# V' u o8 p2 a
+ w! N, h- ^+ [3 I
, D" r" x& b, m4 H' x9 ?. y
还有就是两个输入输出函数:: l0 {+ l$ F2 q
void output_sample(Int32 out_data)" [' {& i9 M6 c2 v$ H9 d( S9 m7 U& |
{
6 F# B! Q, z, @; S2 I& A AIC31_data.uint = out_data;
. ~ r# Z1 E6 F+ R1 v MCASP1_XBUF5_32BIT = AIC31_data.uint;
2 N1 N- U8 ~3 o7 w}+ h9 I# e6 I3 j1 k5 K
P& n% s2 A% W3 s/ IInt32 input_sample(void)* N* B9 O8 x5 e
{ 2 I7 y+ M! m8 y8 I2 j4 I
AIC31_data.uint = MCASP1_RBUF0_32BIT;
; v8 X# U6 a' s' ^8 N% N3 B return (AIC31_data.uint);" c8 y( I7 `1 |" h, n" n6 k
}
, |, R: P$ ~) M8 ?3 S! r# g' j. R0 N2 R6 z$ [2 s) z
|
|