|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:' q$ r6 p6 L. V# h6 E
main文件:
v, J' u3 b% p& t% |4 ainterrupt void interrupt4(void) # h, W+ [1 z4 }9 G
{( c% \" N9 l" w$ I' ^$ b
Uint32 sample;
/ n& X$ q( Z* f- }
4 h6 w: Z5 b" Q- X+ l1 ?$ y sample = input_sample(); // read L + R samples from ADC8 g, t9 K% e# K5 C, j
output_sample(sample); // write L + R samples to DAC * ?9 k2 J+ H" m: u
return;% o, d* l0 u5 B3 { {
}7 D* {: E0 W" B K
2 R7 [6 E- Q2 U3 tint main( void )2 P* h7 c0 `6 C
{. z! f" V% [% z; k" @
" n3 \/ V# G! \8 g# E6 W /* Initialize BSL */
2 |3 R$ T5 B4 U, E EVMC6747_init( );
; y/ K, U* ^& ~ /* Call evmc6747_intr function */
; k" V7 d, H; L aic3106_init( );6 G# G5 ?0 {! E. Q& m! S
while(1);( m- x# U& ?6 n: v" B
}
6 z2 x! y; A7 P9 d2 _# d4 b& t( I5 b. t
7 G0 T3 i! {8 O( B. n! Jaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题) V# \: f$ e+ x$ @9 L8 T, Q
/* Initialize MCASP1 */+ m3 t& U5 C( z1 h) H( ~) G
mcasp = &MCASP_MODULE_1;
) l( Q# i& g* @$ C8 W5 _; J/ I* g2 g mcasp->regs->GBLCTL = 0; // Reset
# B8 ~: A( R* w mcasp->regs->RGBLCTL = 0; // Reset RX
+ |# B- J9 C' I. R& Q( M% x mcasp->regs->XGBLCTL = 0; // Reset TX
3 i; V! L8 U* b* }) c6 t/ C mcasp->regs->PWRDEMU = 1; // Free-running+ y8 U. K8 {7 J$ g. h- e
// configure McASP0 receive registers
5 h* G4 O- N( c1 S& u mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used x/ p, t% W/ g; u6 A
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus& _0 L. d* z3 ]3 t' ~* o
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word2 H/ Y) y2 i4 l* q8 x
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side); g4 V- e7 v: `- ]5 i, R G
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
+ [- y0 ? s: o mcasp->regs->RTDM = 0x00000003; // Slots 0,1
1 e8 T, {6 S& t+ M8 a, J3 S" M mcasp->regs->RINTCTL = 0x00000000; // Not used; `) q4 a5 F* J! o* |; _
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* [# s+ M/ x+ K# C. h; i
1 r: x$ s" v- q mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
8 D n3 y8 a8 H+ E/ J4 q$ q; `) e mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus" M1 ]% |0 }) A. z2 |
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
- Q9 V6 K6 D0 }* j5 e( V& C mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
% }9 d0 y# {+ h2 S6 c8 M! z) ~3 X# p* H mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
% o% \3 P ]& I$ l mcasp->regs->XTDM = 0x00000003; // Slots 0,1$ U) B1 M8 h5 b
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
3 o8 |& ?, N: m w mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# z. f6 s; L5 _4 K; j- ^( t" J2 ~! E: a/ e; J8 G
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
" c) R: y$ a" e; U1 S mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
$ a! m a7 X! r$ B h/ y mcasp->regs->PFUNC = 0; // All MCASPs+ {- p X5 S9 C
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
' z# l! J- y( F6 x' D! ?
/ G% o7 ?6 e5 G/ E; [# K+ s; V: Z mcasp->regs->DITCTL = 0x00000000; // Not used
! q" Q) w, }# Y9 Y: i mcasp->regs->DLBCTL = 0x00000000; // Not used5 T4 A+ B& ?( C l4 \
mcasp->regs->AMUTE = 0x00000000; // Not used
$ q4 Z' \& A' F2 Z; A9 T- f* M' v. O" D* e/ V% Y
/* Starting sections of the McASP*/8 H) L0 q8 \( ^' k- ]7 i
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; , {: @4 v+ q' y/ X
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
3 K5 c4 p$ S+ N& p* c/ u$ ] mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
# F2 H8 }( q' N3 V while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );$ l: ~) b# f1 j$ F9 i/ [, l
; h" ^1 r P' y; L9 e+ A" G) q mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 6 P# O; V/ J" Q: ~8 `. ?3 L
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
: e1 n" m2 H- D1 M% v% h. F mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; $ N2 l# C+ F3 J1 v6 j$ p- L8 {
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
5 t" V7 T( I" V+ S8 Z- I3 y# U! J0 `; |# c
mcasp->regs->XSTAT = 0x0000ffff; ; r; l+ {5 C. t% t
mcasp->regs->RSTAT = 0x0000ffff;
, {# c5 C( W. B7 r6 P$ ]1 C, _# v6 _, {" s, k6 q
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;: X* M* o" G2 p5 w& F
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
. N7 g5 J# N6 l# T5 d- y! a9 A mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
% b7 r9 E& V% A4 O5 `4 p1 A$ H while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );: R' ~6 z3 x2 F; X1 p5 v# B- A- |
8 S* |/ P$ t) ]4 u /* Write a 0, so that no underrun occurs after releasing the state machine */
4 ^: j+ u4 c5 j mcasp->regs->XBUF5 = 0;
, i# A9 r$ N1 t, `: N mcasp->regs->RBUF0 = 0;
* y4 D& J5 I c# p3 |3 d9 E: V* B! c) X6 ]5 X
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 6 T4 a Z& T* \3 D- d# y) S3 ?
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
E7 Z5 ^& e* [' \! c/ z* T mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 8 b/ f0 |: E, b# x2 p
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
6 K" _1 b" c( h$ K0 q' U9 R$ Y, b0 b. u+ B8 c8 D1 T* m) Y
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; / _' ?! l% f/ V
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );) N2 b" q- v% d- I
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 7 P; K' G: a I+ k% R$ R4 K
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
4 o! S% Z& @$ z/ r, a8 Q s5 e5 q- H! U7 X! z" C: C, @2 D' x
CSR = 0x0000;: g J" B! H t
INTC_INTMUX1 = 0x3d;
' O1 X" g1 u7 J' V/ z' T7 s) _. L8 L ISTP = (unsigned int)vectors;
( m* k L) t2 h5 e3 D; T- J( ^9 h ICR = 0xFFF0; * m, y: L( O' u& \
IER |= 0x12; - P# q6 y+ [5 ?( s- _8 d" V1 G9 }/ Z
CSR |= 0x01; $ e. M* ]6 U2 m
% j: O' z2 p, @$ [% Q# O
4 ]9 O! L V+ g% B h
7 \) V. C" ?9 g: X: s还有就是两个输入输出函数:
# a" P3 E8 E2 B' a/ r1 u7 r Yvoid output_sample(Int32 out_data)
/ `6 n# z4 O+ D{8 V$ b1 R. K% H2 t0 j+ j
AIC31_data.uint = out_data; - F0 H1 Q0 D0 K4 D
MCASP1_XBUF5_32BIT = AIC31_data.uint;
! F, k/ q; l4 u}
" x) Z2 H1 \6 S/ i
7 C8 T0 w' V( QInt32 input_sample(void)
' Z/ [/ A$ m8 |% @, U/ u{ , S( |" Z6 `1 ^# b( B8 Z
AIC31_data.uint = MCASP1_RBUF0_32BIT;% F0 e& T5 a% I7 S$ L
return (AIC31_data.uint);/ J! [# e6 W: i4 \& [8 C
}( n; g8 o3 z& j" @
5 l" k9 y$ F+ Z0 v5 E. ?- m |
|