|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
# t/ h; I7 [ q# t! R5 cmain文件:6 h9 C' w4 K1 m0 U
interrupt void interrupt4(void) 3 c4 M* Z& B- q; L+ o1 Q: A7 s
{. q: B" O2 A& F# _
Uint32 sample;
" \2 D4 n3 f G! M, X
5 C3 e; D1 H9 d sample = input_sample(); // read L + R samples from ADC
! o; Q. U; t' j( k8 j. G9 A output_sample(sample); // write L + R samples to DAC + X% D" T/ b% v# h/ d$ Q
return;; d/ b% `, i1 s p0 |4 @
}
G ?; \) O9 z, S1 D" S
' F2 J0 l. x+ L* \5 E: {int main( void )
& K8 x2 k5 W3 ?$ _{# X' }' S0 a) l4 u0 o
# `# a8 |4 W/ `+ V
/* Initialize BSL */
y3 I* W5 s# `5 a8 k1 ?& | EVMC6747_init( );
. v0 I4 f- n S+ R; z: i /* Call evmc6747_intr function */" l! k$ c7 d+ d# g# K: W
aic3106_init( );& ~3 r, y4 a( u; ?
while(1);
& k! Y: t0 B' H* ~* ? @- X0 i/ R}2 m) x2 u7 ]- r3 x$ R
# R6 Z6 n3 R: X" @9 Y
. }. h! ~# s1 D1 F5 E6 p, M+ O+ T
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
" r% M3 t1 X' w' O0 U/* Initialize MCASP1 */
# H! k- A. a, w* {$ I1 j. m7 K- t mcasp = &MCASP_MODULE_1;7 H, b" ?( D, ^0 X
mcasp->regs->GBLCTL = 0; // Reset3 {. B" O1 f: r P& D( N2 T" E
mcasp->regs->RGBLCTL = 0; // Reset RX
3 f- B: K" |& q mcasp->regs->XGBLCTL = 0; // Reset TX! S& U) S7 U' a. F3 _! V
mcasp->regs->PWRDEMU = 1; // Free-running
0 ~& t2 T6 w- I; } // configure McASP0 receive registers9 a# L1 s" P" O( g0 Y1 k
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
: p% p# m$ J/ s# D2 I$ Z mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 \" D E, R, L1 Z F9 w! D mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word9 K7 Y1 g" X* t K4 A. J
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
, `. j& M: w3 E: F5 J" u8 U& J& H mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)$ G( ~9 g$ d3 @) g
mcasp->regs->RTDM = 0x00000003; // Slots 0,13 S% _! F6 y; l% J
mcasp->regs->RINTCTL = 0x00000000; // Not used0 T" y, e1 v+ F d" u; v. Q! _
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2565 s! B! _1 c* z! z% W5 u
+ V* ]4 n$ S% d7 t9 {" |; i% Q% c
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used$ T' A+ `) U; }$ [# m, x& h" G
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
, {( |2 {+ Q; H8 [% c7 k( e mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
9 ^, @, n2 z- ^ mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16: l' e. @; v8 M
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK, [. W% O: G- X6 f7 \6 D( ~% Y
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
7 c3 m0 }3 K3 y G2 D1 |/ v6 C/ G mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit3 z/ m z1 z$ ?: V4 Y8 [
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256$ z' m: o% D. Z
$ t8 A# }* t* l mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN" Q5 W& X% U1 V$ Q" u ?4 |
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
$ X2 d% o$ G- c4 q! @2 j mcasp->regs->PFUNC = 0; // All MCASPs
( E" d# {* ]; `% S3 ?0 q! g mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1: ]) j2 h3 Z9 Z% X, Z
; U5 Q2 r$ t9 D+ g, |) K8 J- z% b mcasp->regs->DITCTL = 0x00000000; // Not used
/ _3 l5 S) g( T1 h9 f5 l) r2 o7 c" f mcasp->regs->DLBCTL = 0x00000000; // Not used
4 R; c1 Q3 O# d mcasp->regs->AMUTE = 0x00000000; // Not used
7 M. o( _) L; Z7 c
: ?$ ^0 R7 B$ M$ K, T6 U; c/* Starting sections of the McASP*/
/ O; e0 O! O0 g8 k- t4 h mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 0 [1 i, c7 j. C9 O, B7 X1 a
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 4 S0 q8 {6 _, T( o9 j+ \
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
: v4 T. E" T6 K' V while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
3 f) y, V3 K, ~! D: _4 A& G: S& T# c) b$ E
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
4 M$ ~9 l1 @! U0 o8 ` while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );3 S. y, y! J2 N) m, S4 i3 f- Q' n
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; / f/ l) [7 r7 ~" P! W) t7 d
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );9 A& u' P4 J* T9 Y1 q
- L2 C7 H) ^; G9 i w2 y mcasp->regs->XSTAT = 0x0000ffff;
; C/ I' u- U$ x) X4 }8 Y7 W/ T& `- B mcasp->regs->RSTAT = 0x0000ffff;
7 _' k) F; q$ o, Y, Q6 D. n8 w6 j7 ]4 x# ~ G4 J+ E2 w
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
* Y8 w# ~, r. ` while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );! P1 L* J: [/ U. `2 C
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
6 ^- }* w N$ z; j while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
7 p# Q$ n" q' ]8 a8 J; z2 y5 ?7 c# {7 A& Z
/* Write a 0, so that no underrun occurs after releasing the state machine */
1 r1 O1 K& A7 W/ c m7 [% Z, b mcasp->regs->XBUF5 = 0;
6 z. b }7 W! X mcasp->regs->RBUF0 = 0;" D% O( P3 @0 M8 P# I' v1 T1 _
3 |/ ?/ D; M' }+ a mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
T2 }% @# a2 _ M0 v, A while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
0 {1 l( p( v- z9 b: w mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ; h/ {& p# s, ^3 ]0 r* v
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );3 ~4 b: k+ T" W& |9 O
( j9 V5 R+ V g; C
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ( m# O/ ^% n' ~5 j. I
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
: S# X6 J/ I6 X mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
; C1 W) o X3 K+ O8 W5 k while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );7 a4 r3 D5 O% U# m" v$ j' ]
: d8 E, P6 N4 k% D0 O2 j3 l7 g" `* i CSR = 0x0000;2 `5 n+ @% K4 H& ?# q) c
INTC_INTMUX1 = 0x3d;
4 T! j E4 v$ W7 j! A ISTP = (unsigned int)vectors;
" g% g7 Y: x* _3 d ICR = 0xFFF0; " D0 z# N/ b9 B9 m" k
IER |= 0x12; J7 R! t4 {5 T5 E+ P
CSR |= 0x01;
/ K1 ?! F6 V- r" \+ D& z( b3 [/ m H! ?: F
) U! _. ^+ q' e5 g
: @/ z4 U$ w y还有就是两个输入输出函数:
; }; \4 y- S" u% ~void output_sample(Int32 out_data)
' d& g! ?8 u, y{% o! ~9 y( K6 Y, X# m* q" e" E
AIC31_data.uint = out_data; 3 M$ |8 t- F0 j
MCASP1_XBUF5_32BIT = AIC31_data.uint;; k p. _4 u1 ?% c. B6 u# Z
}
; o7 S \" V! [% a) d7 ~: {$ a7 I1 U) t
Int32 input_sample(void)6 ^7 Y' F- x# ?1 z! {% v
{ : q+ j/ f, X% Q# S
AIC31_data.uint = MCASP1_RBUF0_32BIT;
6 |' n& ]+ @+ S) g$ C! Z return (AIC31_data.uint);
1 P" p0 G" R5 Q# V2 N6 n}
. Z2 m! l+ i R) _+ Z: K/ z$ q
6 H) c$ ]3 G& m" o6 W& W |
|