|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
6 u! S) H; m5 b/ rmain文件:
6 L8 q- {6 [; o# x7 i2 u7 qinterrupt void interrupt4(void) U- b% X+ r( Q3 B
{
8 y* F1 ?0 h0 z# r1 { f& B, E( h& l! z Uint32 sample;$ I9 G8 q8 b4 Z A7 G1 \
) e; u+ a. F: J; W
sample = input_sample(); // read L + R samples from ADC
- N& V" s3 P8 _ output_sample(sample); // write L + R samples to DAC 1 J- l5 X- s/ `9 I
return;
" a0 @) | Z2 ?- W2 r. h}
: m* T7 u; ^6 R
9 b+ u- M9 R" f" tint main( void )
`" b) N( V& d! e, }7 U8 I{3 v. _1 `$ z( T: }( w
7 g0 a9 {" g' T4 t
/* Initialize BSL */2 v) N& W5 Z) C5 {
EVMC6747_init( ); v" A$ {' Q7 p9 X- Z B j
/* Call evmc6747_intr function */' p* Z' L& v3 A5 B' i
aic3106_init( );
% \. T- L! \. z- \4 \7 i. } while(1);
& | `6 ]7 T5 M; p) o( G, U}7 C" g( _- l( S' F; o$ `" d
8 }$ W' C0 Z0 f- c. D
, t7 R }; S" a7 l" z4 _aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
, K J: `3 \3 a" _/* Initialize MCASP1 */0 u3 h, a7 K3 j( ^# {) t! r+ e7 H7 U# b
mcasp = &MCASP_MODULE_1;
% d6 I- r- p' t$ ?. I2 `2 [, m mcasp->regs->GBLCTL = 0; // Reset4 y) y, ?( a: ?/ j a
mcasp->regs->RGBLCTL = 0; // Reset RX
% C. ^2 R" Y# @3 m, o3 O mcasp->regs->XGBLCTL = 0; // Reset TX$ Y3 g8 C% u$ T; J( E. p5 E
mcasp->regs->PWRDEMU = 1; // Free-running
1 X9 m- a1 M% K( x // configure McASP0 receive registers% K3 ?1 \3 r) [0 w# \5 q# ^
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
# R; y8 @% o+ k. Y9 g: z mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus* Y u% d" w: L3 w
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
$ M6 {6 r7 h/ B8 k mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)( w% i& Q+ I# w9 Q+ k# K+ a& i
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)- q' k% Z- P5 G
mcasp->regs->RTDM = 0x00000003; // Slots 0,1+ z& r1 s. M+ ?& G' I/ W+ G
mcasp->regs->RINTCTL = 0x00000000; // Not used- g8 _6 U: P e6 \6 K% ~/ F: d
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
% p, \+ u6 ^# o) v5 ~9 }! M ^6 P# Z; y
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used L8 g: ] c# L7 N* H6 H
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* G5 g( H: |4 S7 _, a8 X+ U mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
' X( r" v' K0 q# A/ {" C: e. e mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
. J, t# x- d9 O, P8 l4 l mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK5 a8 B- e/ ^4 |3 A2 p2 v: k
mcasp->regs->XTDM = 0x00000003; // Slots 0,1+ R1 O& I8 g5 J$ u) Q+ @& z0 i
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
/ x4 s1 y1 R4 J0 i mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! k* `, j) F4 \( p
) A4 i9 ~( n# } m mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN8 b* }7 V6 Q- H s" n# E! ^
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT- M+ n. r9 t- D2 D: E
mcasp->regs->PFUNC = 0; // All MCASPs
+ J8 B1 C; J: M mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
4 B L9 Z" V+ b# q' w8 y& V: \* r! C9 g/ ~ b0 |* i9 y
mcasp->regs->DITCTL = 0x00000000; // Not used1 Y- ^$ i8 h9 ^8 I1 d
mcasp->regs->DLBCTL = 0x00000000; // Not used; o# u6 Q+ y, D8 z2 V* `; g
mcasp->regs->AMUTE = 0x00000000; // Not used; w, s) l& M( T p) B/ a
# b" f5 G" H, }% N: d- A/* Starting sections of the McASP*// N0 r# f2 C. c
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
: q; q7 k! O& y9 k8 q& S5 h' G while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); ( F+ @& g5 s( W- n2 w
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
! _& _( U7 P% P( {5 T. J- a while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON ); d8 z. f9 Z- A" }2 c6 T' C; g3 u
% J: ?/ |% s8 v3 H& P- V mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; # V* _ r7 l$ L
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );, D* v8 c. ?% p
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; , N$ b; R* h( {( }/ o$ m5 s
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
7 E% Y. f X7 K8 d* N6 ~+ G
9 E5 F7 P- h. f7 g mcasp->regs->XSTAT = 0x0000ffff;
/ l2 O0 C6 G3 n8 s mcasp->regs->RSTAT = 0x0000ffff; * }/ }- u: J/ ~4 H- C3 F
4 L. l- _8 D. f) h$ k mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
6 g( H6 j* j. m3 T3 }0 X while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );8 Q1 |$ v7 o& W9 ^2 a0 f' ~
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ' B) W3 }2 s1 L) `# ?
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
& p0 J: W0 n# w. _" y- U% b5 C
' W1 P9 _ F. O9 H+ s. _. ~ /* Write a 0, so that no underrun occurs after releasing the state machine */' X0 F( S9 |: t' v
mcasp->regs->XBUF5 = 0;8 Z" h5 Q5 N. s
mcasp->regs->RBUF0 = 0;+ U4 @9 L' J) X- }
) B( R: T3 e6 V- |/ [ mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
0 a- o4 C! Y# F/ z1 k while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );; T$ G0 g- r7 h% @" \ t# K
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; - z9 X: E* v: t' j7 r$ F A2 L
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
% c# f$ U/ w# P. x; B' B
8 y6 V( v7 ]$ @+ M o' q mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; / \# M. v6 i9 m& d- a6 N& ?
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
6 N. H. K+ b9 r; e% G; N! N1 |" i5 P mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
9 H9 V _4 y: h- E' p while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
1 y9 \, h e6 j$ l. o, Y) q$ I( d# H+ Z
CSR = 0x0000;2 @* x' B& z; L/ O
INTC_INTMUX1 = 0x3d;3 j# R0 N0 u S; F O1 Z o. X
ISTP = (unsigned int)vectors;
' J+ ?' _. ?3 E$ \0 X. C ICR = 0xFFF0;
8 r7 d( ]9 \) ~- t# N" Z IER |= 0x12; ) T6 `- {5 U1 r; \2 V
CSR |= 0x01; 4 k V$ }4 p8 L
) R O8 Q4 Y4 b2 x
' P6 L Y6 b) @% `& L4 R
' Q+ u6 j* z1 H) M; X还有就是两个输入输出函数:0 I* g0 M- {; j
void output_sample(Int32 out_data)
" g9 j- u* \" |! p1 _5 Y% L' f; f{* b3 p7 P. \- T& X
AIC31_data.uint = out_data; + F$ }" T7 P' |1 V) k
MCASP1_XBUF5_32BIT = AIC31_data.uint;
: G" }/ a" G: O/ J, \* o}. h& ]2 } e$ g' U6 x& a
3 t/ B5 N6 t5 p& C3 [- r
Int32 input_sample(void)
% u5 I3 q" M& k{ ) M4 {6 L9 r; L% c: z
AIC31_data.uint = MCASP1_RBUF0_32BIT;
# z! @0 I) ~7 f return (AIC31_data.uint); z3 d) K- @& m7 P5 \, Q4 }
}
, u! e$ z* U8 w2 n9 v; K, {
2 k# I+ ]" U' G5 g6 d5 f |
|