|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
7 X p" ]! O, Q8 Y. Emain文件:
3 R. u) `& w2 [: ninterrupt void interrupt4(void)
, E. z2 P* a" y; \3 n4 f9 L; {{
; l7 Q3 {+ U( i- j4 ?- O Uint32 sample;5 K1 T( \" u- @
3 X5 x; q* Z$ E( y0 }7 j& c
sample = input_sample(); // read L + R samples from ADC) M" W, X6 w' G7 Y& z
output_sample(sample); // write L + R samples to DAC
$ C! `( b2 N4 z+ h" { return;
# Y( d2 j. i+ a" V}
$ V9 I& y; I" c# n! [
! O1 T$ D2 A5 x4 r4 \$ m" ~int main( void )/ R" f3 V" G" K) l+ s
{
' r7 o8 y& e+ h4 o7 i7 j% b& G+ G0 S) P% D; E7 T- l
/* Initialize BSL */6 b. d9 s/ D7 @; U+ G
EVMC6747_init( );
6 T. c3 P1 Y1 z( U9 l' L* y9 ` /* Call evmc6747_intr function */
: d" Y. ^8 H' l6 x: q4 u aic3106_init( );! @1 B' T8 Q. `
while(1);
; H: T; {2 B2 c}
e# X5 |2 [! j6 s4 p8 h |2 N: s: f
; Q1 C) v8 Q/ F% o6 k" paic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题 \0 m0 r" r0 U+ t0 K# t. {: U g
/* Initialize MCASP1 */" ^( d8 z' L; d: R/ T& ~1 w3 U
mcasp = &MCASP_MODULE_1;
+ V! w( i$ {. n) ` mcasp->regs->GBLCTL = 0; // Reset8 c- {$ B+ A @5 I- Z
mcasp->regs->RGBLCTL = 0; // Reset RX. C: ?* H& y! r, ?4 @) O. K- Y& R4 }
mcasp->regs->XGBLCTL = 0; // Reset TX
. {" r# w: J% G. t( T7 w mcasp->regs->PWRDEMU = 1; // Free-running, o! s1 v" M! V
// configure McASP0 receive registers
1 u" \! K2 }( ?( K+ Q mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used9 x+ U: F, H! [
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
3 ]5 @/ X' t, X1 Y! q5 g6 X/ y mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word' z: l: q& S& b. u) l0 O
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
8 x2 ?+ R _' i3 }& b; E. C# o: W mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
$ Z' V' q4 v7 \' h mcasp->regs->RTDM = 0x00000003; // Slots 0,1
- p- u7 B9 |! a+ i f8 v( c7 Q mcasp->regs->RINTCTL = 0x00000000; // Not used7 l7 X$ W1 }2 G1 y0 B5 p* B
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 J1 D& \4 U# f
# E2 G) m5 Q' z; ~ mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
0 v" s% s' c7 w2 R! a+ _ mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ v/ l3 ?: ?$ o- B mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
8 f) v7 H ^# c, f mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16( Q0 ` d1 g |: \1 |. P# |) G- U8 i
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
7 h* D" T7 s3 [; Q' y3 E& c, R! g R/ _ mcasp->regs->XTDM = 0x00000003; // Slots 0,1 c( ~% G5 j8 l
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
$ F- X+ R% X( r- C" n- C7 i mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
; c1 U. h% D- U0 H) Y
$ K x( U9 L/ Y2 c mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
# |4 ` q0 {9 p6 {+ J6 A: F. T mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT" r6 R7 T, p/ y
mcasp->regs->PFUNC = 0; // All MCASPs {2 O2 K& J5 x. @
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX18 f: N8 h$ v4 l
" r4 @* Q. b* p: Y( K+ i
mcasp->regs->DITCTL = 0x00000000; // Not used/ I) n' ]$ t% R/ I, F
mcasp->regs->DLBCTL = 0x00000000; // Not used
! E! T% a f% c# |& y mcasp->regs->AMUTE = 0x00000000; // Not used
/ q$ D4 A1 k; v f& N: K( c8 ]# ]) m' H4 a
/* Starting sections of the McASP*/) H) L: V' K/ c3 t! {0 F( w3 s/ C0 J+ E2 K
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
# s1 M$ M( F3 u3 O! M. r/ X while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
1 F! K" l# Z' b" p7 n; [7 Z: M$ D mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 1 I3 m' z; a+ Z( f
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );3 j' E- ^" ^9 A b5 i' D
7 O8 A, Q) A) Y6 U) ?/ v mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
; N3 c' i" o0 ?8 _. Y) K while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );9 ~! d% x6 n. L) @" z
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ( L& _; O. U# i' T( g, A
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
% B; t1 M* I: _4 b4 e, ~! Y4 G6 w1 y N4 P- O4 e' E
mcasp->regs->XSTAT = 0x0000ffff; ' K& ]7 ?/ s5 Y, L) }9 o. P' R
mcasp->regs->RSTAT = 0x0000ffff;
J; V: O" s+ b4 Q6 {. Y( d/ T1 x
: u1 r3 K2 I& c3 ~! C5 l mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;; ^: `" l& ^4 O5 T0 a4 _/ {% Y2 ^
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
/ ]2 A( R* J& s/ i7 w1 _& N' s+ [ mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
, o; s8 p6 D0 ~6 Z x7 n while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );3 a& I. \$ i( s- E$ ^6 a$ @1 H1 G
6 R3 f0 ~8 z; P! T5 N0 F/ Y$ z! o
/* Write a 0, so that no underrun occurs after releasing the state machine */
) f! [" y9 u, B, {5 W mcasp->regs->XBUF5 = 0;
+ _, ]# S% ^) r3 y mcasp->regs->RBUF0 = 0; E; Q0 x7 O3 h7 X9 B7 E
' m( K( L6 L+ e) t S1 ~7 ?9 {% M
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; - K& ^5 S! B! l9 e
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
& e4 r( v% P" v: s mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ' z" L3 n: q' T+ w+ ?
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
: u9 o& p3 ]0 J* n9 L
) z0 L/ u% i7 I mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 6 _& p7 K, g ~! {& l4 x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );6 ~+ N# J. j; o
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; * y7 ]; e3 ~! n2 U
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );3 S0 H' B8 Q0 h" J, T
8 ?7 E) i3 g* N: S' \
CSR = 0x0000;
& z! e; M' J4 d4 W. c INTC_INTMUX1 = 0x3d;
1 l& x4 P: D- g8 G ISTP = (unsigned int)vectors;. _: x2 e4 t- _/ D3 [! P1 n
ICR = 0xFFF0; ' ?, l _8 Y* N/ W& G
IER |= 0x12;
7 W7 v) m! }* N CSR |= 0x01;
0 G- K( Q, Z2 z, J
; R& M+ Q4 j' N2 j% y; S
2 J8 t/ N! C) B2 U4 _
& v& @2 z8 A2 x9 s还有就是两个输入输出函数:
) `- N! S4 E0 P. t3 |( i* Tvoid output_sample(Int32 out_data)
( d: J" B4 G. o" k{5 z9 O- R# j% |8 x e3 k
AIC31_data.uint = out_data;
# f9 k! q: S4 e+ w& l- y U MCASP1_XBUF5_32BIT = AIC31_data.uint;
" e8 ], i2 l5 O; Y}7 s& }* m6 b/ A0 v# ~" d
* s* A: ]+ ]) \ Q! i5 [, o0 VInt32 input_sample(void)
5 ^# C! i2 C! A4 u{
. x' W# ]8 V- v$ x' l AIC31_data.uint = MCASP1_RBUF0_32BIT;9 B3 } r4 c6 Y
return (AIC31_data.uint);; A! X) i" M8 l7 ~ U7 c S
}
u! C G9 R( ~7 C( r J) s
/ u0 ^* z. l- T6 e6 v |
|