|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
+ r7 M: R1 \" k: r- ` @main文件:
% N8 E+ x4 n$ minterrupt void interrupt4(void)
+ L6 v0 \8 D0 p+ f! X- C8 u2 f{2 J) S4 P) D; Y7 y0 A
Uint32 sample;
R) N% C$ d9 W4 Q0 P6 M; y: E5 D+ ^, |
sample = input_sample(); // read L + R samples from ADC
; D! @3 t) x" V# r5 | output_sample(sample); // write L + R samples to DAC 9 v# H- t; k, ?
return;1 b" ~6 Q3 s7 M# n' D
}7 G5 i# h5 T$ ]
5 P7 U9 b6 J) F8 W
int main( void )2 H/ v* w. B% k- g/ v+ A* j
{! p' z6 _2 m4 T& v0 {# l" h& b
" K) t( s" O. W0 C/ F /* Initialize BSL */2 b1 W! Z2 @3 _/ }- g
EVMC6747_init( );
$ c1 D m4 R$ i+ A% s /* Call evmc6747_intr function */, q2 L( h1 F, F9 U) x2 V6 R
aic3106_init( );1 R/ l p' z& \
while(1);$ e2 z f; k; a* c
}0 h ` j( W/ v) Z5 e6 Q
# _* Q2 Z R, \& f0 Z2 d
4 | N- Q3 D8 {6 K- j
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
) G7 v6 |5 D% O3 B; ~' ]' T9 W/* Initialize MCASP1 */; B6 M2 Q9 h; {% I" P
mcasp = &MCASP_MODULE_1;0 {# k7 U" i4 o* o. b7 _1 y* e, G
mcasp->regs->GBLCTL = 0; // Reset% ]# a" E3 ~. Z. ?
mcasp->regs->RGBLCTL = 0; // Reset RX) w6 a/ T; R/ L2 G% ^! }( ~
mcasp->regs->XGBLCTL = 0; // Reset TX
% h3 Q4 f& x# j) ~, ]7 t' Y mcasp->regs->PWRDEMU = 1; // Free-running' ^1 X3 X" z$ c, f
// configure McASP0 receive registers- Q$ `- |9 k0 P/ E6 W- ^
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used# a) u) J9 M; B; \
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 @& K6 M3 P6 o: b6 e- U mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word0 M! a+ N9 |3 i1 N. N) s
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
3 X, D6 }# V Z8 j7 Z mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
: u7 P5 R: B! \: Y# } mcasp->regs->RTDM = 0x00000003; // Slots 0,1- T7 o+ v4 f B0 [. f4 h8 d; t" m+ Y
mcasp->regs->RINTCTL = 0x00000000; // Not used
; `2 p8 I% `* q mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256" n% g% y: s9 e& n
- ^. ^: s/ u0 W& l mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used3 M5 a V- Z# N. h
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
- f+ I6 k' i% g6 c# r" T6 R$ f mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word, k# Y6 D9 i! V! j( m
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-163 P3 U* H }2 k& m
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK3 K$ P0 c+ u% w
mcasp->regs->XTDM = 0x00000003; // Slots 0,1' v" R# O1 ?" \6 U7 \+ I# W
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
^+ _ t1 B" H% h mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 t! D* i$ K! V& W
7 |5 m8 l4 [6 A! ?$ B mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
# E1 P ?: V9 J mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
8 D a! F; t0 D$ k mcasp->regs->PFUNC = 0; // All MCASPs
+ o( M4 m$ [, c: n( n: d7 p mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX18 F* { E& Y1 a+ W1 l- K" Q
: u9 {; d6 H) Y) n1 N mcasp->regs->DITCTL = 0x00000000; // Not used8 q, A2 R( ~/ C% x$ b* e' }
mcasp->regs->DLBCTL = 0x00000000; // Not used
[! x8 Q2 P7 [+ S' N mcasp->regs->AMUTE = 0x00000000; // Not used
' c9 P. l' w8 z. p9 i
6 Z! \+ z* S7 N6 g+ w# u' E/* Starting sections of the McASP*/
) k* h, {* y2 h0 B+ W( J9 K4 P- f mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; - E! Q- K" K2 B& i
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); $ S# i5 V T6 o2 q. Q c
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; " T. R* G3 F" ~: i0 c% c, T
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );* i- M: ]# ]% c% b8 p5 s
: j" W: v4 t0 \1 b8 |
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
$ x7 d! ^) }' e5 A& K# w' P t while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );+ }! z" E7 L7 Q; i+ e" v
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 1 h. o D+ Y5 z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
+ M u9 z3 [: E, T- ` ^. t
( j8 ^3 s j0 B! a i$ N6 ` mcasp->regs->XSTAT = 0x0000ffff; " [' ^5 m' k7 D
mcasp->regs->RSTAT = 0x0000ffff; # Z8 v9 e, f) ]2 p
4 n, v6 h+ E( f6 b- c/ V mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
5 s6 ]( o' O7 ~: {* t while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );& A3 F) z+ T* I3 Z2 ?
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; $ ^; w6 `# ~" M$ S/ F2 ?
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );- q2 u2 B. q# r# F6 X" K
% Y1 I# E' m2 {+ h* d /* Write a 0, so that no underrun occurs after releasing the state machine */
7 o; A2 b* {7 m9 f! P2 q% b mcasp->regs->XBUF5 = 0;
" r5 [3 k' A' q3 ~! v+ M mcasp->regs->RBUF0 = 0;
9 D+ [9 [' D. R8 p
9 T) c7 _! j: |; |6 g* d- v% r mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; # W" Q: }1 T7 v" f q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );" m8 f! H$ f6 X! N! G2 W
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; # ?5 `5 t' O( \, b2 L9 `
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
# ?; F5 j. c, T4 w$ o7 y! d
: M' G; J0 P) S0 c# x( H% G mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
0 Y% g$ I! f: q' M while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );% w8 b, U- a% `5 j7 G
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 5 F. t9 a$ A: t/ D+ H$ F3 |
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );" [ U3 p6 ~" X8 W
) i5 \/ `. E# f9 M1 Q; F2 L$ D" L
CSR = 0x0000;
8 G% c( A3 o7 \/ Y INTC_INTMUX1 = 0x3d;( X: c4 C' K4 v0 [% C& w
ISTP = (unsigned int)vectors;& I5 g! p5 _* u8 {
ICR = 0xFFF0;
/ U2 Y/ X: h/ W+ ]3 `+ t IER |= 0x12; 2 b6 {8 Z8 ]. `* _/ [1 T& R5 Y7 b5 Y
CSR |= 0x01;
8 B6 h: p5 X6 q! D/ J9 z w( t2 x$ j- h6 q2 G9 F& b$ l5 N* C5 g
8 r# \, u8 D+ u) M) ^* ?
9 y6 g5 d( S0 m* T3 Q. d6 P8 m9 b
还有就是两个输入输出函数:
/ X" i4 `; T" o" s7 l. _/ S6 Avoid output_sample(Int32 out_data)
' J5 d: a o3 Y6 Y, u5 C u{
% y8 K. }( f# X4 y8 z" ~) a AIC31_data.uint = out_data; ' g1 m! P" i4 T) ~! T h! T) O
MCASP1_XBUF5_32BIT = AIC31_data.uint;; |6 d$ d' V6 L. i
}
, Y, Q! R1 G: F4 [* I8 x) ?
) A, j' c* I, L" o+ [Int32 input_sample(void)
, V: D3 Z8 X, Y9 K* I. q4 \+ G) T+ G{
2 |& @3 d% y9 F" M" f7 `6 f AIC31_data.uint = MCASP1_RBUF0_32BIT;% v" M' r `% k( u+ ^; t6 F
return (AIC31_data.uint);$ p. b8 F) T1 c$ {9 v8 k) ?- d
}
& J5 }# ]! W1 V3 ?
' J; w& h4 |3 B* A |
|