|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:. [( L8 I: H5 [! P# e: U/ _1 e
main文件:% z; |' k) v1 v! ^$ C
interrupt void interrupt4(void) 8 E/ N% s: w% N$ H3 w7 M# X
{
2 H" o& t3 L, ]$ E/ f Uint32 sample;
0 b* C7 b* w/ C- S: @9 Y! F6 @) e. b* f* D8 u# w7 P1 } U( q# H
sample = input_sample(); // read L + R samples from ADC9 ]* Z; ~, y' ]
output_sample(sample); // write L + R samples to DAC
( T; @: c+ p3 k return;
/ P9 y, `% R3 j9 g}! u7 W3 Z0 V$ V3 x
- Q% A( J& n* \8 u% G- X
int main( void )
: j7 p U- Z8 C/ }{! o1 w; E$ d0 y4 _8 l5 m* \! J: p
: Q; G7 M5 z2 ?% L
/* Initialize BSL */9 O) V% O; |- o ^! G
EVMC6747_init( );
* a) u4 z# t( z% O) K /* Call evmc6747_intr function */
/ b) ]# p+ }6 B1 C% W aic3106_init( );
% ?5 J J7 w" _$ r while(1);
V# o3 n1 s2 i. b5 m5 q6 b2 n2 _7 E}) m5 P; X) S) } Q# K8 g
$ @. t) U" L8 ?" o1 b
7 M2 D/ C4 b, X( ^9 x3 U1 [% Naic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
5 o* E* `1 Q% E1 G2 X) k, h7 C/* Initialize MCASP1 */8 R+ L& P1 } N% Z5 X
mcasp = &MCASP_MODULE_1;' _( \) X5 @+ {9 u8 v7 {) P6 O' X
mcasp->regs->GBLCTL = 0; // Reset7 Z$ w, E7 D4 `: T. q5 x
mcasp->regs->RGBLCTL = 0; // Reset RX5 ]; n8 z C- v6 M1 s- j; m# H" R
mcasp->regs->XGBLCTL = 0; // Reset TX
. W! H! c$ W4 |1 [% i# W mcasp->regs->PWRDEMU = 1; // Free-running$ k' \& L+ V: m s8 u" u
// configure McASP0 receive registers
% Y6 s* V1 L9 f2 M8 f mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
# b! L; ^- }$ q1 x mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus( H$ q% Y# b! @- m2 F% Z
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word6 E( [$ ]# S* {0 k& n
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
/ m# l1 {) P1 P9 l1 M. g; R* P mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
6 u* [4 c- ? \0 ~" D- \: R+ J1 v; Y mcasp->regs->RTDM = 0x00000003; // Slots 0,1
; {2 |, ^; t9 |- [ D" w mcasp->regs->RINTCTL = 0x00000000; // Not used
9 S( S+ u6 C9 x9 S ~6 C" }: C% | mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256" `6 b' [6 b3 d c% L& Z# ?
' H/ w$ p5 M, J
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
1 U7 u2 K: L4 `+ w0 V mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
, t' L- p( z, Q; C mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
7 W2 b4 Z3 f' z mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-162 ^5 P, e8 [) L
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
* R8 U! ~* O J8 e% u mcasp->regs->XTDM = 0x00000003; // Slots 0,1/ n$ h7 v |1 G }+ i
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit$ T2 g3 b1 Y1 x. j3 i
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256' v( F! C5 f8 K& B% e! X
& ]$ `) U' H6 x! \. L4 U
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN3 d4 P( W+ `3 i1 r
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT" ]+ K9 s4 k- b0 A! X8 b7 L$ R$ o
mcasp->regs->PFUNC = 0; // All MCASPs( l' x& I+ ]* |$ y4 A
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1- R$ U! _1 S& U" F
" ~, f# z8 s0 W1 U+ M2 L. P
mcasp->regs->DITCTL = 0x00000000; // Not used
2 J0 B+ \) L1 V+ x+ L' q% K- E- M* q4 K mcasp->regs->DLBCTL = 0x00000000; // Not used
. u& o5 m& S7 H mcasp->regs->AMUTE = 0x00000000; // Not used2 k8 a/ U# R7 C# X
8 ?. P! X2 j' r4 c+ ^- q+ h6 @/* Starting sections of the McASP*/0 g [! r4 o5 e
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 6 `: D! ^# `) H, g( D
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
6 P6 j0 P) T7 E3 W mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; # I' ]) ]4 e; P$ P" a
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );- m! W; g/ n, I" w7 w$ h+ w8 ~
& t" N" O/ ]$ P! T" T# \* D0 Z9 y mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ) }# t+ }- g+ z2 M
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
% X; {/ x8 x) W T; W& S1 R mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
8 n3 O- u" m l while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );& N# N$ H- W1 D: j% R3 ^3 a1 j5 s
8 Z3 H( |0 S$ B0 D5 L1 u# h9 l
mcasp->regs->XSTAT = 0x0000ffff;
" r8 }' G3 } s, S2 ?7 l0 } a; e mcasp->regs->RSTAT = 0x0000ffff; 0 K) E( h& L/ Z+ n. V: V- j
8 Q9 R. i+ m3 d$ g9 G+ S. W2 \( k
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;% ^7 P$ G) C8 l% j7 w7 K
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );- O5 ]; V7 x5 O7 {6 {4 s0 ^
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 7 x; m a# f6 B
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
0 @- E4 M4 w- X/ S: m+ }+ r+ q+ [( S, M* h6 ]+ R
/* Write a 0, so that no underrun occurs after releasing the state machine */! H" F- t% e; v9 _$ o- }
mcasp->regs->XBUF5 = 0;" R2 M/ W0 z9 N! O0 E' P
mcasp->regs->RBUF0 = 0;6 q6 s( Y l2 f4 h* P' L6 J6 A
# `* v" j, z9 U, i3 I
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 6 d% j" d6 | z% x( ], c; A, `
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );! Z2 D; Y1 u3 L! B
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
4 e8 @; X& d& O6 ?% _$ Z while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );- C! I; o0 T9 z
* E6 F+ w9 k+ H2 f) g mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 0 y' F+ Y4 V/ b( ^. E
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );) D5 B b7 F5 E6 H* k/ @
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
5 F. d6 P, l, z e& H4 | while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );& ^% }; W/ G2 ~6 G. u
% C! I5 | s4 ~; U) f3 g8 z1 l2 C CSR = 0x0000;
$ c j" o/ ?4 K, G$ [ M& N9 } INTC_INTMUX1 = 0x3d;5 c+ ]& \5 [. g( S' m3 S
ISTP = (unsigned int)vectors;* N) _9 B" v8 d' [
ICR = 0xFFF0;
6 N4 a# Q$ X" {- [ IER |= 0x12;
% n2 ]' Z3 e6 q+ b+ C' S/ u CSR |= 0x01;
9 p0 z" @+ d. b/ {; C7 J
9 a. r9 q3 W; H, D: a
5 ?- _; {9 l# h5 N: B7 Q: x
) g. @3 m$ P+ u6 p+ x还有就是两个输入输出函数:7 f; Z7 y& L/ h, }( R6 P
void output_sample(Int32 out_data)
) l. E6 @/ R% y9 N& d( j% C* c{ E( O) z; C2 |5 _, E/ o+ _
AIC31_data.uint = out_data; 5 P: T& f# y$ ^% q! g/ J4 Y
MCASP1_XBUF5_32BIT = AIC31_data.uint;
8 q8 ? L9 f6 J6 M' H}
' a8 K1 b) ~! v0 [; D
2 z9 x% _/ p0 c) A' {: OInt32 input_sample(void)5 g* Y: G3 a2 j' E) w' _$ p( R
{
' M; O6 m' e9 b( k% E+ Y AIC31_data.uint = MCASP1_RBUF0_32BIT;& ^$ T" Z; C$ |$ A3 w0 H. s: `
return (AIC31_data.uint);; d N1 C h( P' Q) K+ D6 [4 y
}) _- L2 c5 a* M# q# w/ _
' `1 @- J* i& Y" m3 G& `3 f
|
|