|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
) J7 `* H4 n) P: Xmain文件:/ Z0 ~9 j& [" ?! W. B7 [) x
interrupt void interrupt4(void) 3 o" S9 J) t7 |; I. `9 s! }& U! ^
{
# ?1 c; T) z( B4 K, J* m" O: k Uint32 sample;
2 ~& a, I) a( ^
2 }$ c' x1 C- V: ?" F! p0 c( l) s sample = input_sample(); // read L + R samples from ADC
4 C, R2 ^# `9 d6 g2 H1 Z6 q9 t output_sample(sample); // write L + R samples to DAC
( p, b- n9 K) w; W/ Y; V' x0 j! }/ R return;0 b1 y1 ^6 G1 V: }5 V9 N; y! z) \
} \* A% B/ y# e9 s2 E
! @4 J' c9 N9 {
int main( void )
^9 C- g' r% x( o, U' o{, ^5 B- L6 k! Y
) i% F. k0 x0 l( K# e+ y0 C
/* Initialize BSL */3 ?$ H9 r5 ^) |
EVMC6747_init( );; M" ~! \1 j1 D/ u
/* Call evmc6747_intr function */
- H& C. {5 Q2 c/ J( |: A aic3106_init( );' M' E. C t' v; q" D2 Z
while(1);
3 U! q% F) W$ y8 A" d$ Y}! u z- w. ~1 P
, `+ B" C3 r, D/ _
) U# r% J! B) m+ n" e! Z% H6 Jaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
4 m8 f& @" l6 m; Y6 P+ y) {% n/* Initialize MCASP1 */- J. J C; ?9 \% @9 s1 s* w5 v7 O* {
mcasp = &MCASP_MODULE_1;
2 e( S) x; B3 R5 F2 S# o" @1 L; P7 l mcasp->regs->GBLCTL = 0; // Reset
: g7 J' q. B5 o8 v: i6 @2 u mcasp->regs->RGBLCTL = 0; // Reset RX5 J/ h4 k: k# S9 Q; Q) @4 I2 M& d
mcasp->regs->XGBLCTL = 0; // Reset TX# z* b$ o8 a" d" @
mcasp->regs->PWRDEMU = 1; // Free-running# W9 F: F, ^# k" H! f* }5 Y3 y
// configure McASP0 receive registers
: A7 V; @6 l+ \ mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used, g$ E3 q5 ]4 v; y* R2 g9 G
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 U5 c( l+ w( {7 w# O mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word$ r4 v K- H8 ^3 k. L. S/ H* R3 h, z
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)$ n1 K2 _3 w: _6 W; y! Q0 ] w
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)$ h) v/ r: H4 _: Q
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
7 ?4 A3 |6 w5 H7 l( Q P) a3 [& {. V mcasp->regs->RINTCTL = 0x00000000; // Not used3 F( u% [' \6 q) ^2 c O& [
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2567 J4 B5 k7 |. P9 J3 }4 l& G& v$ K6 d
# V( F- ], [/ {4 C1 t8 K mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
$ U$ J( E) V' R" o mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus4 V- _. J" {2 I) ]
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word/ Y9 h! Y- m6 e' K
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
& x2 {. k. f5 U+ V n* x mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
) n3 k. y) m, j v# c8 g. K' M mcasp->regs->XTDM = 0x00000003; // Slots 0,1
& Z- A& l+ G k8 U3 k, G- x$ T1 M mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit+ Z1 k9 a5 c2 [1 \4 S' o* V/ I
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
% f4 m& O- u$ a4 u* z: ]
8 ~* ?8 S% Y! M! R9 m G0 ^( N mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN( c, F# ]) _ V
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT5 W* ?8 w6 N& @; I8 }9 y
mcasp->regs->PFUNC = 0; // All MCASPs* z+ m; [! A0 s% P+ Z) D% }0 ?
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
! } c. m; W- c8 A
" x& i3 T' p. i6 U. U1 L2 s mcasp->regs->DITCTL = 0x00000000; // Not used t; s1 b) ?4 x5 }8 E& W
mcasp->regs->DLBCTL = 0x00000000; // Not used
! I" Q* T- N# G; w& P mcasp->regs->AMUTE = 0x00000000; // Not used
! n- y& W0 D9 |6 E9 {/ j* [4 a v# i
/* Starting sections of the McASP*/
0 L* L+ J: S9 q2 I0 s mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 9 {* z/ D2 l: \" p5 u2 J% Y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
1 t7 i f4 F9 ?% ? mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
' Z7 J3 C/ M$ O" N$ W8 P while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
5 q8 Z0 U4 {1 w* M. w$ ~ i/ _- b/ C' T2 X- {( t6 \- }* L
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; : V/ q# j/ d# v8 f' B
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );5 c9 @$ E, `2 J# C( w
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
4 U: ^1 M6 }- v3 }8 ] while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );6 L/ x, \' }- ^7 B
) S& X# E# n. H6 f; T7 [ mcasp->regs->XSTAT = 0x0000ffff;
% g A3 }8 D" _4 E& o6 n5 v! f mcasp->regs->RSTAT = 0x0000ffff;
$ l6 `! |* r3 w! o
& s: G1 t9 U5 U4 m( y* Z( p mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
& m: k6 W0 A, i7 F1 ] while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
, w1 P2 W7 c; H! w mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
' q' X: j l% s1 Q$ i: Q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
1 a) @ O$ h% K# u8 F0 U9 v; ?: k/ d2 t* J. t
/* Write a 0, so that no underrun occurs after releasing the state machine */) N# ]. t$ }7 v& u8 g. O7 @8 s
mcasp->regs->XBUF5 = 0;. `6 x0 Z# R% x4 l. {$ S% o
mcasp->regs->RBUF0 = 0;2 m% J: [0 i$ K
0 @6 u. b! n1 @ e mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; " c- U: m! E7 M S* c" A* R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
* D% N) ]4 j7 l mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; / t7 K1 V: B1 t) N1 K
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
4 ?. i) \. U0 ~# E: G( f+ d- j3 l4 v; j# p u2 w( s! z
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 9 R$ I: M1 t4 |" P, N& ^; i* ?
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );! I. k: e0 {9 \- f' Z) l: j: t0 I% c
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 8 K. G& I/ G9 Q, L! |8 y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );) \; D- B( ^2 O0 m" A: u' Y
7 Y8 E1 Q9 c4 F* `4 \0 p
CSR = 0x0000;/ ?: g+ T& e- j5 \3 ?; h4 L
INTC_INTMUX1 = 0x3d;
2 }$ V* H( t& w7 ^5 @4 K ISTP = (unsigned int)vectors;
5 P7 \0 A3 o* m$ v* ]1 M5 v ICR = 0xFFF0; / G. F2 S" i9 |& y8 Z7 k+ `
IER |= 0x12; / S/ g) \' R/ F" o& ]" B7 E
CSR |= 0x01;
& _& b* }; h4 ~8 _9 X$ W7 \3 T
6 _6 x2 O5 E/ Y' t, L- [2 g# g6 y0 B* r9 M5 f% h2 m2 D
1 _8 b8 j; I% A. g还有就是两个输入输出函数:
4 V& y* }0 M4 o/ {8 vvoid output_sample(Int32 out_data)
! a( s6 ~- Y7 h4 h{5 [+ e: @6 U9 U- G( @! a
AIC31_data.uint = out_data; + O. K3 U; o2 M
MCASP1_XBUF5_32BIT = AIC31_data.uint;
/ c8 A a( g( A; D1 Y* U2 t" c}: L0 l6 R( d' I( X% k7 q7 w. \
! T+ J8 F( ~% a$ p8 Z7 CInt32 input_sample(void)6 }: y1 B, h, i; ?
{
6 d1 C7 S2 W, b4 b! v& R AIC31_data.uint = MCASP1_RBUF0_32BIT;; D7 i' Z% V s7 J0 d& a
return (AIC31_data.uint);- s4 r6 @& o# x* N" B0 F" S5 c
}( T. ]3 v1 G$ n, L: J
2 h9 B. A( j; b- r* w9 |6 L/ [ |
|