|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
% s0 h( b4 l" |7 l0 Xmain文件:
6 Y: ^, H) _& Q5 a5 R. dinterrupt void interrupt4(void) Y$ ]0 b* g: U" B( Q) Q) A
{6 t, y m0 K- I1 e$ ~
Uint32 sample;
+ g- m, n* [! Q8 W7 i" d% z5 y
7 X$ N1 U9 Q2 t. m' R f/ a; O! l sample = input_sample(); // read L + R samples from ADC$ W' x) q# L" G* I; G8 N7 U* [
output_sample(sample); // write L + R samples to DAC
/ Z6 Y4 |: R: ~0 f9 x0 ?' q return;7 k* b! n' H0 s. t% ^3 C7 N/ f: S8 M
}) l- E M8 ~- @. M6 T0 m/ k3 n
0 K9 {+ B9 r" y; I$ {" L/ M
int main( void )
/ b+ Y0 R0 D$ Z8 x7 A O7 [{
# `) K# G: _" o: }% S
0 R O/ M7 C5 ^( G! r+ }) y /* Initialize BSL */
% E; {% Z, a& s0 u/ X EVMC6747_init( );! B: I1 K7 V, K! `; \
/* Call evmc6747_intr function */
9 Z# u# S: b& b& [3 T* h aic3106_init( );) \4 H1 V( F0 \4 m
while(1);
0 U8 j- L/ B& R7 r. d}
; Q' ?; ?6 R7 U( r$ q
( T# z. }/ H; P4 y% f9 ?: W
5 t# V8 y9 p6 p' C* Maic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题0 l/ ~; E) S/ `
/* Initialize MCASP1 */1 _6 Z/ l$ P" p3 U" p# S
mcasp = &MCASP_MODULE_1;; X6 O q I$ g% M3 R# p7 k
mcasp->regs->GBLCTL = 0; // Reset
' ^8 \$ n. t# E. W' X mcasp->regs->RGBLCTL = 0; // Reset RX
7 z8 X0 B, D! P mcasp->regs->XGBLCTL = 0; // Reset TX! |+ i8 W3 |5 X- |) Q1 W
mcasp->regs->PWRDEMU = 1; // Free-running
; ] F3 {/ ~* @, |3 F0 r+ A0 ~ // configure McASP0 receive registers5 Z+ g) Z3 Y8 n M3 e* g( C
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used0 k9 b( _) w- E: v
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
5 h0 U8 b8 ~* d) a' j2 | mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
# Y3 J" b" X& X mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)/ q( l. o4 A( }' K# W$ b
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
* Y7 T0 H2 h6 g! z: v+ f mcasp->regs->RTDM = 0x00000003; // Slots 0,1: U5 _1 _& L0 c; n- y: R# _
mcasp->regs->RINTCTL = 0x00000000; // Not used
5 s% e6 ?/ }3 K v1 x mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 o1 C+ P5 j8 N* M5 T, i( F0 f# O9 u; C: i
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
6 }8 t. d' i5 U) @ mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus/ l! I/ X' r+ {7 |
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
% c) h2 `6 Q1 T v* n( u mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-167 b& E' O7 s/ D- q, D- ~( c
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
; B/ m# D$ W9 p0 F; C2 W mcasp->regs->XTDM = 0x00000003; // Slots 0,1
8 R( j, E/ V/ [, A9 G5 y" A( u mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit' y( ?' P# _5 W3 V; q
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* P1 J6 `) L5 W& _
% G9 H" z- c# Q. T mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN: l" J1 l5 N% A8 ]7 a. M
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
! O- M- j0 C' ^) N% m& i9 Q mcasp->regs->PFUNC = 0; // All MCASPs* F0 E! z+ J& V1 K6 N+ h. K
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
0 I# v$ O/ b2 F/ x5 H# h: w. L# E5 W) `
mcasp->regs->DITCTL = 0x00000000; // Not used
) h! A6 G/ a' B- i; [ mcasp->regs->DLBCTL = 0x00000000; // Not used
t: `* R8 `+ }" Q" n5 A+ C mcasp->regs->AMUTE = 0x00000000; // Not used4 U& d7 |; O+ b, c9 d8 f, y
% u/ l R8 Q/ P6 f4 {/* Starting sections of the McASP*/
3 i: @ [, h8 h mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
: M" J) k; I& Y: s6 p0 O' E while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); : p( V. Q6 X( ~8 V/ m' A3 R& E
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; & B/ m6 M2 q2 S& p- {% s
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );& \" w5 a. ^/ S# ?' S+ R) e. F
9 d5 I' X+ f6 [
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
$ W1 X0 j; q: E+ d" Y while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
- O# n+ _1 y( H8 e. r2 Y) f( k mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ( N" i: s& b( a5 y3 \& v1 o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );4 s$ D% S7 |, i8 Y
9 u1 N9 g/ r$ L) U
mcasp->regs->XSTAT = 0x0000ffff; 5 n1 U/ s8 [" M7 c
mcasp->regs->RSTAT = 0x0000ffff; 3 L: N$ g: m! H+ t% m' p/ I
. F2 m! r# o) Q. T, a! w8 k mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
/ j6 [, l5 C- x$ h while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );# q7 O& e. u0 D! |" o
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
" b- c1 W1 [) [1 [8 `. z while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );5 e$ }: B+ f1 s; \
7 X2 ^( ^. z1 Y! s* @
/* Write a 0, so that no underrun occurs after releasing the state machine */" C+ q2 @! ?5 q' g! @) `
mcasp->regs->XBUF5 = 0;, K' A' N0 T; r4 `1 o* L, ^4 Q) D
mcasp->regs->RBUF0 = 0;: j2 R; L' _ Y& }5 v: ~
! S/ B! H6 _5 C+ {6 Q# c' I5 D. Z" p1 b
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 0 d! D: {& O1 j! v5 F/ M, q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );: Y: X: D4 L7 T; d/ v. O( ^
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; & d7 T6 c7 j3 n! u3 J6 `
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );: C o8 J9 j% U4 l* i# H
3 r. Z+ q R( h, P$ g mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
+ k5 z3 K# n' i) K$ X2 b7 h1 n while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
H, _* i. M: L, _: U5 f) y mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
, I5 H! z/ f9 U* \& U while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
g. s* r/ g/ d9 M( e3 Y2 g1 o4 x, z% j: t- R5 l
CSR = 0x0000;/ l3 a& L) q& G6 c [! k
INTC_INTMUX1 = 0x3d;$ A8 }5 R: X( r( d* w+ Q
ISTP = (unsigned int)vectors;0 t- M* k/ ]- o" P6 P! E- f
ICR = 0xFFF0; " n6 A r2 c2 j7 Q. r7 r9 M; Z5 a( H
IER |= 0x12;
k6 ]) e- h% \6 K CSR |= 0x01;
) S5 ]4 y! j$ G; a& J+ g. V' R! @; u8 A$ P4 J0 y# C$ s5 r4 p. D
/ Y7 y0 l6 o4 z9 a3 n! I
& z; C' @4 p5 y2 a还有就是两个输入输出函数:
9 [6 W9 N4 v# c0 W+ |5 J1 |$ O$ S7 K! bvoid output_sample(Int32 out_data)1 W) y+ E' i( N
{2 N* h2 n' q n/ F$ \" p) b
AIC31_data.uint = out_data;
: _2 p2 g- R. s/ l MCASP1_XBUF5_32BIT = AIC31_data.uint;
) V- h2 A3 v) X}
. O, N1 g0 l/ V W' o9 F
5 T2 B# L2 T# _8 u7 l0 Z" pInt32 input_sample(void)
6 ]- n# m7 n0 r6 |{ . O$ w; ?- f* j, a
AIC31_data.uint = MCASP1_RBUF0_32BIT;
6 X2 ^6 k- f. _1 Z0 h return (AIC31_data.uint);
5 [- b) g4 B! M" J& i8 u9 M6 X7 G}" a) u5 h4 \7 y# r y7 |8 t2 o
# b7 z; U! X4 s
|
|