|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
8 T# r1 H; w. Q& c3 j7 X( ~. Lmain文件:1 c, z: z+ s5 m) S
interrupt void interrupt4(void) . P( }' T( K$ d# F" }% q
{
' C1 I& d4 e3 |: p, `% K5 H. R* y Uint32 sample;
: u* K: u9 }) X7 ^
' e2 A3 k6 ~5 Z# R/ l! P3 b' B sample = input_sample(); // read L + R samples from ADC
# d7 F- \8 X2 E; }/ G output_sample(sample); // write L + R samples to DAC 4 A( E/ X( ~: s) R& K6 k
return;
H# A; K( `" r8 O} e( g+ x9 ?1 R) {% p
$ \ S5 u8 o# R% Y) u. y; o/ Z
int main( void )
* i# `* l- _# a7 E+ i3 _{& b3 }& X7 }0 M
+ t4 M+ z+ ^' g
/* Initialize BSL */& p& ?0 `1 X% N! Z' m
EVMC6747_init( );: f1 j, D2 F) I: d+ |
/* Call evmc6747_intr function */+ R3 ?6 b+ \$ d$ z' ~. p
aic3106_init( );
$ o3 j3 T1 L5 y0 P8 M while(1);9 B, `+ D. N# D6 x* U" |0 t
}
3 J4 t5 Y- c: o0 M) w" c5 V
# _; ~8 [: L5 v
* t( s( Z2 r' I' E% u/ l$ B& iaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
. S1 A; I( w5 G; {& ~: _. M/* Initialize MCASP1 */
+ Q$ T& k# r& K4 w mcasp = &MCASP_MODULE_1;
9 s: c: O5 {5 O7 O% a$ V mcasp->regs->GBLCTL = 0; // Reset
1 w8 X8 E0 ]5 v! o mcasp->regs->RGBLCTL = 0; // Reset RX
) U$ C$ F: V+ N& C7 W& q mcasp->regs->XGBLCTL = 0; // Reset TX% K7 M& y+ k$ Z% A* Z% t4 W/ {# K
mcasp->regs->PWRDEMU = 1; // Free-running
. f$ v* m* n* C: y. @; A // configure McASP0 receive registers
5 x; L1 E4 a8 u- q, x% f mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used* q4 Y+ z9 |' ]# c4 R
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus [ g v8 S0 U( _$ |: ?8 s; K
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word$ ~' P) {3 \" t- D+ n+ o
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)7 i( Z Z; s- s+ v) P& u# R2 m' `
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
& R; |; {. U) A mcasp->regs->RTDM = 0x00000003; // Slots 0,1
( }4 e& l/ V5 F+ W1 L; I mcasp->regs->RINTCTL = 0x00000000; // Not used* o' B* C, p" u2 J0 p, K
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 g$ u1 F. o, n& {; n
! a ]' v W3 G% P2 n mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used- ]% I) Q" M: A: s# [
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
$ A/ l# R0 \6 K+ G3 S! R1 X mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
9 P+ O7 F' y1 ^+ S8 R3 l mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16( R( H: j8 v0 K% U1 ^/ W; ^
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK' R2 u" M" l) O! \& q" V
mcasp->regs->XTDM = 0x00000003; // Slots 0,1* U& ?' x7 C% q7 U0 g+ R7 Z! I
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit( _3 K3 U1 a& i' j
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
' }9 i; X; L( w) h
! f% c0 I5 d7 w+ P( Z& X mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
: |* _6 k+ Q& t& V mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
8 j) f6 n- \0 G: x$ e* q mcasp->regs->PFUNC = 0; // All MCASPs
3 s. N( F' P9 E0 k mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
8 {) X y, }3 V! a" x& D1 Q5 S: O: V6 {. ~& {
mcasp->regs->DITCTL = 0x00000000; // Not used' m, P' G, A' {8 T3 O- B% x6 O. L1 c# Q
mcasp->regs->DLBCTL = 0x00000000; // Not used
, B7 O$ z8 Z; \" I6 E mcasp->regs->AMUTE = 0x00000000; // Not used; @. _6 \+ R' u6 j% c) _
; n$ ^1 z3 k9 Z/* Starting sections of the McASP*/# C$ X- F" J3 s% J8 b+ T. G. S
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 4 {2 _: H1 y5 ?" J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 2 q6 b. e6 D, q2 a/ @( D
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
; e0 S( j2 ]/ u/ B* H& l) Z( P while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );8 ~6 a, x r8 V5 L
}3 J3 W) e/ y1 J4 R& U2 H6 X
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 3 W9 `. \+ Z/ D) [, N/ e) @( @
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );. T4 B6 h& d+ G4 _# Q" M
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; - f) J$ f" `' m3 w1 g7 G
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
+ v2 }9 f" ]3 C; d% x% F
7 X8 o+ C. g0 C mcasp->regs->XSTAT = 0x0000ffff;
. X& R K5 p% `% O; v8 k9 n mcasp->regs->RSTAT = 0x0000ffff; 9 Y5 t5 q! R: B T' m9 X2 X8 u, g
, i0 \7 P2 y! r/ g mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;1 c1 J' w" L4 K$ k+ w$ Q2 Q; }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
( B; K( }) }, P mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
3 s& b' }# l! Q( Z* | while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
- |2 o$ P% `, L3 R9 I2 }! J5 m. O
6 j0 E% r; x& x8 q& j* E) _+ E/ o /* Write a 0, so that no underrun occurs after releasing the state machine */9 i9 \9 q) J/ ^1 U) M/ z2 P3 G
mcasp->regs->XBUF5 = 0;/ B8 y3 l2 B: q5 s9 r( s/ F
mcasp->regs->RBUF0 = 0;
& L7 x" q6 G7 y/ W0 d. E$ t" z/ M
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; $ i' }/ L' r% {' o( a
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );( s1 y3 C9 D; x7 F8 m
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ; ^1 H- E, j! ^. t- b
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
4 {2 ~6 E5 B, L4 @0 F( X5 _. h2 e& c8 L% B) Q
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; / z9 ?% p# ?& E
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
* o. x8 C/ V" M1 X: S: A+ ^7 n mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; * V8 k* |( v2 F/ L
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );- W2 q! m' L; f! Z( g( Q' s
: @4 n0 a4 [6 L5 \! S5 C; d6 N CSR = 0x0000;: Z: f3 a# n' q2 Q3 I6 y* ^
INTC_INTMUX1 = 0x3d;/ [5 H, y7 r& e' f4 C9 b
ISTP = (unsigned int)vectors;' l: T# @9 p8 g
ICR = 0xFFF0;
( Z: n% @0 }4 a4 a! m9 G6 v/ @9 y; y IER |= 0x12; ! a5 S e. O% x6 o
CSR |= 0x01;
) B h' v1 a7 \% b: j5 t
- C0 h6 W7 x: |! ^! \7 N/ b6 f( P* P. S
2 Z) P. m1 G+ @6 @ H+ i
还有就是两个输入输出函数:
0 U3 H0 b9 A X: j. E% W2 w. u/ \void output_sample(Int32 out_data)
+ J! R" D1 t1 X{
6 ]( F2 J3 \; z! B. G9 w AIC31_data.uint = out_data;
5 j$ c1 @' G1 S0 y7 h& ? MCASP1_XBUF5_32BIT = AIC31_data.uint;. ]' ^, E2 [ E% b. v2 ]
}; k" I4 g( J8 L+ [: e, m! b$ \
1 t% i/ _) Y {" N D# c* d- iInt32 input_sample(void)
: F: z3 k3 t' w: n+ c{
$ d9 r. y6 Y a1 ^& k8 L2 y AIC31_data.uint = MCASP1_RBUF0_32BIT;
% N$ [3 a! y$ }6 o$ x" u7 @8 T return (AIC31_data.uint);
: L6 A" c# G5 T, G}1 T% x$ x5 Q: j. T7 l
$ R5 P R5 t) e
|
|