|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:% Y J; E- h/ T4 _6 T* {' e+ Q
main文件:# M- K% F5 C1 o0 h* r, c4 Z8 J
interrupt void interrupt4(void)
: n1 O2 q$ r6 m/ h% ?' V ~+ p) u{
) l; A1 Y' B2 F& H" t8 L' v+ Y4 m( F Uint32 sample;
8 {4 M; W: h/ j6 J2 _5 y$ K
& k8 g2 N* }* y- ~" ~7 l' O& r& G+ n sample = input_sample(); // read L + R samples from ADC
4 p& V! Y; W9 i3 G l5 ~ output_sample(sample); // write L + R samples to DAC
( j5 ~9 S7 h$ n9 A return;
* Q' L; k' N) ^0 u5 k) S}; B$ T+ I& u0 `! m7 U3 {
* ]8 i0 m: A1 P f# ?4 F, Lint main( void ); H6 L0 E6 [, I& C
{8 v( }* C6 ~4 C0 I
* ]6 R. ^" d0 K: T5 Y. ?& d1 _9 z4 y
/* Initialize BSL */
7 K0 W& T: O3 ?' Q4 v EVMC6747_init( );
3 _0 `" r9 F! N" g /* Call evmc6747_intr function */
9 Q& r+ X5 L2 R/ O" ^ aic3106_init( ); b( g# ~! `7 U2 v
while(1);% ]3 }. U* N$ K! a; @& x5 q9 C
}
. T8 H! Q8 l9 Y' R
/ L& g% _8 p7 \& }+ j! j( X' ]
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
2 n: i* n- Y ~# C: C" H+ C8 b( W$ e: ]/* Initialize MCASP1 */
, N8 r' I9 }* h# t5 }6 t mcasp = &MCASP_MODULE_1;1 q. `7 n: `+ _
mcasp->regs->GBLCTL = 0; // Reset
0 d( F; T$ i+ y ~8 G6 E9 C mcasp->regs->RGBLCTL = 0; // Reset RX9 g- X6 p9 w" _( X
mcasp->regs->XGBLCTL = 0; // Reset TX
* M3 w j: [* Y' N+ a mcasp->regs->PWRDEMU = 1; // Free-running
" M; N- A7 s6 y" Q G/ B$ B // configure McASP0 receive registers
3 L9 J- E1 O: G. i# m mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
" Q9 c) K: u3 u* z mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* ^0 j/ [$ Y# ^! |3 q mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word. i3 ?: R# c5 q. n
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
5 Y: W3 X. f6 \; }4 M- u9 U mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
7 D' W6 s e: _% ]% D8 { mcasp->regs->RTDM = 0x00000003; // Slots 0,18 h7 W1 G; H3 K3 v0 T
mcasp->regs->RINTCTL = 0x00000000; // Not used2 S! k2 T' V2 k' ]0 ~: J
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2560 h* N4 V9 \- J, D$ f. N5 A/ g. v
/ w& f# {& W3 m# M2 K+ ~ mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used8 `1 ^7 ?7 F1 x: g
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; b/ H- x$ E4 t; y( }% {+ W mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
; {; f; a* X% y: x4 L) z mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
' R7 T. d+ Y: [: B h) \ mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
4 ]) M( i( x2 X/ n& @ mcasp->regs->XTDM = 0x00000003; // Slots 0,1# E: h; N' z( z u4 r
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
/ @( {7 X! h) e3 b) E mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256! J; X. n2 U" z) q' y) Q
" x0 `, v1 S0 g, `: [4 G mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
" g! q7 {$ l2 U5 y: c mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
5 A) p! A) K8 k% @% q r mcasp->regs->PFUNC = 0; // All MCASPs, m. k8 o9 _8 k- ^; \8 J" Y# A
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1. j7 k) @( t8 v$ q3 Z
; V1 u& O( F# J7 c. p+ z
mcasp->regs->DITCTL = 0x00000000; // Not used
- B3 y: U2 t! u1 x( @- u* e mcasp->regs->DLBCTL = 0x00000000; // Not used9 F# |5 Z7 {$ }
mcasp->regs->AMUTE = 0x00000000; // Not used4 j. @ r. H9 j6 j- w0 [
/ C' Z! l0 V' M9 D# w+ s; R& j
/* Starting sections of the McASP*/$ {3 l+ z/ ~ G
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
8 B0 G+ R! ~$ p( ? ? while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); ! \7 S; ]8 |) r l
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 1 F ^+ N6 D X' M
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );) v( {6 |* N5 M3 F$ C4 J1 w
6 s7 E: {8 H; F7 b mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
4 Q- g8 N0 n; s |5 G while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );1 ?9 W0 m$ H5 m4 T$ P/ \
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 9 |1 P) S" D0 k1 T8 Q% A# `
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
d5 E3 b2 A* O; K0 N2 q1 x. n
# }% J2 @+ ]; f6 u mcasp->regs->XSTAT = 0x0000ffff; % a0 ^9 D% z! N+ o" B2 O. \: A) Y
mcasp->regs->RSTAT = 0x0000ffff;
h8 B* S& t8 x! _6 o' `. L/ v3 ~- z7 D" U+ N2 N
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
( U4 S& P9 R7 f, F while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
9 \" x8 d& N" a+ U6 j mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
/ @3 y8 i& |' g7 ^+ e# j while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );! B) U. X, @0 b
# A* c$ m; K1 M: z* r /* Write a 0, so that no underrun occurs after releasing the state machine */9 F2 j m# `# P: h- G' ^
mcasp->regs->XBUF5 = 0;
5 z. b* k9 M' R% L, d mcasp->regs->RBUF0 = 0;
; p- W% X# r. w8 u: C
, J N. f0 A, K+ ? mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
0 V% s* V' \+ u o& |2 S while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
; \& y. [4 ~" s% m u+ \- { mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
$ [1 m5 S: Q! K7 l while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
# z/ ], _7 M4 L. c" j
6 c- J1 M/ d9 P% {; {% x mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; R/ x& G( ^$ P0 R0 `" e/ o' d
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );2 ~. Y) I1 \ V- p$ W
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ! A% Z; E4 C% X# l* L% B" [
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );, h5 e" B3 T5 [1 X6 O: ?3 r* q
. d1 V; u3 K- q/ y: J
CSR = 0x0000;
9 J. w( |) Q' L- q) \ INTC_INTMUX1 = 0x3d;8 ]& S! [* g0 M& Q, u3 m+ c1 `
ISTP = (unsigned int)vectors;3 Y2 L; [( W! Y
ICR = 0xFFF0; + r$ {; O7 m; F! |
IER |= 0x12; $ U+ v; I; M* e T
CSR |= 0x01; $ I, l) d, s1 Z d5 v
6 }5 c; s# g9 ` m8 V3 r' R% O& L; i/ {9 h+ [( Q3 a" ?( V* L
8 B/ j' ?1 W+ g- O# e) z, n8 m! J* C- C还有就是两个输入输出函数:5 U5 |4 `4 j8 t) I
void output_sample(Int32 out_data)
2 T" ~6 N3 h1 v D5 v, n{ d/ n8 r3 O% j9 I9 U2 k
AIC31_data.uint = out_data; % {6 d0 d# [# N3 S8 F
MCASP1_XBUF5_32BIT = AIC31_data.uint;
7 H: m7 x5 Z2 O}" p8 N- ^1 o5 C; b1 @
* m# Y# o5 v/ U
Int32 input_sample(void)! o1 H/ a/ F& ?" D0 N0 B* r
{
3 D& F2 d& O* n AIC31_data.uint = MCASP1_RBUF0_32BIT;
7 H4 a! n* G' o- T/ Q% d1 L( W& A return (AIC31_data.uint);
/ b" [8 v/ ]: M6 N1 ~}
: p, t2 |% |+ `! Y& h
7 |" p6 f) ?1 ~4 W3 l: b |
|