|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:1 w; U& e7 L& w( r0 m
main文件:
" G1 }1 E+ b. m$ i+ s# f b: `interrupt void interrupt4(void) / X6 i" z) C, G% ]# f& c9 h: f
{# O8 v3 B1 Z5 N( ]1 g! E
Uint32 sample;
4 G4 F4 M0 s3 H4 a" y7 L" O& ~+ e1 J$ q# n! d
sample = input_sample(); // read L + R samples from ADC
2 K; ~1 c7 n' y: \- S- _ output_sample(sample); // write L + R samples to DAC " f2 o' k8 B1 e
return;
y8 B: L9 D. T$ ^$ K}
8 e" M$ n m/ ]3 h4 Q
7 y' H) `( ^& W" d9 T3 w( C( f( M3 Hint main( void )
; N" r) _2 `& z+ [{( M$ u: X: n |# ~5 Z1 J
- {5 \- d4 z) z0 G /* Initialize BSL *// I0 \ z. f9 N8 A4 }
EVMC6747_init( );
, ]" B# |* p1 G8 M7 |, } /* Call evmc6747_intr function */; y0 P' G% `. C- |9 o% _
aic3106_init( ); O- Z: ?5 O8 j
while(1);; K3 C: |4 `; V% \; L B+ }; X
}
" w& n8 [. N) R: l/ [1 S7 S$ p& p% @% z9 G# y' U r
3 I% {5 n* r, P
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
* x$ l# @9 o$ N& L* ~( p9 ?9 ~6 U/* Initialize MCASP1 */5 J6 l/ p5 S3 {* ]- H- ?
mcasp = &MCASP_MODULE_1;
/ f# Z6 j! _/ }" m0 O1 d mcasp->regs->GBLCTL = 0; // Reset$ C8 S4 q: `5 g, x% a. I
mcasp->regs->RGBLCTL = 0; // Reset RX+ ^# }' {$ k7 V7 o& \- c# E0 m
mcasp->regs->XGBLCTL = 0; // Reset TX
2 q3 n \1 N: F1 u8 F mcasp->regs->PWRDEMU = 1; // Free-running( W- ?2 f. m4 ?- F c
// configure McASP0 receive registers
, C3 t' ^/ M8 Y. C mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used* W5 U% g3 W- N9 M& }, S
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
, E' f! e( L* r' C. c mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
$ p) z+ h( a- J5 A% Y3 ?0 K6 k9 P1 m mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)) x2 _3 l3 b7 f& B5 r
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
( R' \1 Q5 ]8 M/ h8 l: R5 z. I! Y mcasp->regs->RTDM = 0x00000003; // Slots 0,1# L/ X0 P! w" b3 a
mcasp->regs->RINTCTL = 0x00000000; // Not used& l. I1 L8 l1 K( e+ R' @* \6 `
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, O" z: h: ]6 _) W7 I5 [6 `
o( F Z& m# V# [/ P mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used4 x0 o7 o! [1 k
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus5 A" o9 p& o* _. G
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word* U- m# {+ p5 N* l( b+ u6 N/ L- b
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
6 w+ o4 l6 H' H0 s6 b9 ?. E- D: \* p mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK2 ^& V/ |& L4 i' Y! x4 m" q
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
* }* o8 l+ s; n* C mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit8 e( p# P$ y4 I2 S; A5 Z; x
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256, ]5 E0 w5 j! s& K0 ^/ X
# d9 L9 Y+ l k' a! E) P" C/ g mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN4 Q- o0 ]9 n: p- Z# c4 u# L
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
7 X! Z8 v' H _5 A( G mcasp->regs->PFUNC = 0; // All MCASPs3 R( v( y, N, v& T$ j! a
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX18 k1 r: L# ~4 X' ^ w& h
3 K& V# M0 A2 l% k% b" X mcasp->regs->DITCTL = 0x00000000; // Not used4 D5 X0 u4 c# L' P* _
mcasp->regs->DLBCTL = 0x00000000; // Not used
- @& d' L/ D- l3 i' c mcasp->regs->AMUTE = 0x00000000; // Not used
: }# C1 l" P+ m- A8 n/ `: j7 i$ w w6 ?2 N. J
/* Starting sections of the McASP*/
/ v) R3 V5 s$ I! I! ~ mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
- ?# Y6 {' G2 i' q2 l! K; h! Y" \ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
a! z! z: u6 o" i* G mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; - e, E x0 @7 m, K$ b' ]
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
6 o, P4 U# e) f! j) _% m* r( Z. J: y4 T- Q. n1 N1 d
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
, v0 K% w1 A6 c while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );4 K2 S7 Z/ W/ v8 n4 H4 w
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
% C( a+ o$ f" l3 h, O5 \ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
8 `$ a( A& P) [9 _* o8 _* ^+ l" ^3 x* T, Q/ a3 i2 O6 H! R& l: c
mcasp->regs->XSTAT = 0x0000ffff;
2 w* n W, X+ r6 }5 T% Q S# S mcasp->regs->RSTAT = 0x0000ffff; 7 u4 u* J9 T- ?& w
6 p* |! I5 j% Q/ M3 v5 f! F
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;3 ]$ P0 B2 ~9 w% N5 r! ^) k
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
. @) ^$ M% p- y0 q" A mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; - w5 w! V2 u6 i& p& n
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );- K( M% b) R& n6 v4 w1 q
1 g* K1 Q# E: L4 d
/* Write a 0, so that no underrun occurs after releasing the state machine */! G5 b" R U' R, D" q+ w6 M% j
mcasp->regs->XBUF5 = 0;
7 {: p$ W: B, ]0 C0 a6 b$ v mcasp->regs->RBUF0 = 0;5 G5 j( Z/ @% T! W B% ~
8 W. J( a, ^9 Y3 I( i mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
# c# V" m* J( _. M' z. V while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );4 G$ `7 H5 D; J$ x/ J! Y5 [
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; : a, |% h. s) C/ D+ A
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );% {' c! g, A/ e8 z1 U
& H8 G4 H" t1 O
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; " \9 R: R _- i/ G
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
* f. ?9 C E) T- O mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; . a4 ~# s7 C, f# {! l- ~( O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
5 U( T( ]3 R5 M8 `& H9 W3 A1 W9 y$ h I, M9 W
CSR = 0x0000;
( s% f! L j. `( R, M" w8 l INTC_INTMUX1 = 0x3d;" |5 j7 v4 M% `5 G: l8 ^
ISTP = (unsigned int)vectors;% [; c- p7 Q# [3 J, F1 l
ICR = 0xFFF0;
% a( c5 s2 Q5 t( ^; T) e IER |= 0x12; 3 f: |5 b2 w4 y: e
CSR |= 0x01; % x0 G" B7 d7 |( C
6 v, ^8 X1 l6 ~
% Z3 b5 D7 C: H% n+ ]1 l4 c; m; u
% k/ s3 P+ K9 H: k; z8 \" p5 R' b% D9 u还有就是两个输入输出函数:9 A n; S, |4 |4 d
void output_sample(Int32 out_data)' y$ T5 e% `% T7 T/ N% d9 ]* r+ U
{5 u" g' o4 Z* Q3 T9 D3 N; V: W; A
AIC31_data.uint = out_data; ) |. X, G2 f/ c: b/ J! ?
MCASP1_XBUF5_32BIT = AIC31_data.uint;
+ ]) }$ [& P: Y9 Y$ f}' u3 {+ M/ h) ^3 z! m* `1 F
9 j& A. h) F5 {4 d
Int32 input_sample(void)
; x- D+ X1 N; X% N0 ~6 ?{ , `8 b$ ~3 z# l- _
AIC31_data.uint = MCASP1_RBUF0_32BIT;) x3 e y; |) B! @, C1 k
return (AIC31_data.uint);1 {/ S% ]0 u% Y
}# Q3 {5 K5 w2 z5 b
2 z2 n- s; [; [6 p1 u |
|