|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:4 O% E4 Y, I) R; U
main文件:% D, l/ j! i8 X
interrupt void interrupt4(void) . i3 ~- h9 S0 x2 K& v
{
w( E4 ?$ [$ P$ c Uint32 sample;2 Z m/ a' X" B# @; d
. s% F1 \2 j, y2 B4 }( _- e0 y sample = input_sample(); // read L + R samples from ADC8 X: Z$ \3 O" v7 T
output_sample(sample); // write L + R samples to DAC
) y, ~! o* L/ u9 }9 \ return;/ Z1 f# [+ |! ]& Y( \, [) l
}
: ?+ _* Y( b* {; @% ?- }+ x6 @$ O& D7 o& ]# ? j9 r
int main( void )4 _) T- R! l8 [% b E, q" Q5 a
{. O8 ^6 |" R* J. r0 p S/ c
& A$ x2 o- s0 ]6 J+ W7 a( k /* Initialize BSL */$ Z4 u; N! s, J. S; u. |
EVMC6747_init( ); i+ v6 ^( G: |4 ~+ h; C4 S
/* Call evmc6747_intr function */% N- n. S X6 R& T: k
aic3106_init( );7 |. R6 j. r6 f4 l
while(1);$ X9 c/ ?" N) F/ I, N9 m, q
}
, o H1 ]) j* ^3 r% J* L7 L# y+ H) E1 ]$ B: y+ l
+ l0 {, P8 ^% T0 Vaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题3 y0 ?% r7 D8 U1 S) `
/* Initialize MCASP1 *// i1 w% ^2 H: e$ `4 h3 u; c' M n
mcasp = &MCASP_MODULE_1;
8 {! K& `; P& `$ k( h mcasp->regs->GBLCTL = 0; // Reset
6 U x, A1 y# N5 k& m- V mcasp->regs->RGBLCTL = 0; // Reset RX# ^ Z1 {9 k- i( [4 s
mcasp->regs->XGBLCTL = 0; // Reset TX4 p! d9 ?( \0 |8 q. t' b/ J- o
mcasp->regs->PWRDEMU = 1; // Free-running" p2 `8 J8 s$ Y- d% C4 O) M
// configure McASP0 receive registers5 t5 n& y# c* G* x. s7 e' Y* O/ D
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
7 i& Q E( F- { mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 N) z5 A9 l( r- T/ f f9 S mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word5 g: u1 T& t" w8 T: U* S, X
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)* [) p: s. d( F& V' X1 Q
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)( R. q9 o2 ?3 J) f' W
mcasp->regs->RTDM = 0x00000003; // Slots 0,15 s7 O, i: U9 \5 m' W9 b
mcasp->regs->RINTCTL = 0x00000000; // Not used
, E+ D2 ^; U5 v8 J. D7 ^, f' j* p0 M: W7 p mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, O: G. r, Q/ c. C) H _# k4 z. Q. A8 p, T y* B/ g0 [
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used: T) o$ Q" v+ J3 [
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus+ f2 g' N7 _ G
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
) W' U) Z& X6 J+ \& ]; V mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16+ U; q4 z |% q# h( Q9 W$ z" Z
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK/ y% o/ }% C) w
mcasp->regs->XTDM = 0x00000003; // Slots 0,14 T6 B) m# [5 J7 y, [
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit4 I/ j+ D% D$ y
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 e( H# U" C, ~! ^$ K( [, ^* Y0 [# U4 }% Y; T* B. T- f1 M
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN* r2 r2 j* H+ e" C. X1 p
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
+ V4 n3 t* F/ G E' i mcasp->regs->PFUNC = 0; // All MCASPs% L' f% N: A3 N- n S! O' L* y
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
H8 j, y9 h+ u' x8 Q9 R* y! f f) q+ m9 b4 k
mcasp->regs->DITCTL = 0x00000000; // Not used' y5 h! [. d% ^, s9 ~. Z
mcasp->regs->DLBCTL = 0x00000000; // Not used
7 D' B. b; x0 w- d: n9 _ mcasp->regs->AMUTE = 0x00000000; // Not used
3 T; a/ Q$ M! u) D/ g
/ ~) h& Q$ E4 |/* Starting sections of the McASP*/
4 e, S7 p% j/ |4 ~- Z! O mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
( ?8 {8 g+ H* X6 v$ l/ _ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
8 t$ ~' P( Y; o E1 A mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 5 K+ R) x$ \. a8 z. p
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
0 r! g. p) [/ c: _% f3 D
+ N; R5 V: |9 X3 p0 [$ H mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; : Q: m: q( I2 b- o' w
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );% Y: T9 p. |/ n. h4 [3 f
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
7 }( y3 ^7 T8 c! U u while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
$ Q2 h* u3 G+ c, E1 Q/ B0 C7 d' z1 E' \% }- } V
mcasp->regs->XSTAT = 0x0000ffff; / j+ i8 [7 a, N0 ]
mcasp->regs->RSTAT = 0x0000ffff; . e. U0 l1 k% w
! s) M8 R. [0 F; u8 p mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
5 ?4 \& T# r, Z* d while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );5 D( Z/ J2 _# m& X
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
9 u/ P9 ?4 F; L0 ^% G while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
3 w+ m1 g% H/ z0 H) h- p( H' N
8 s* I/ V* N7 b5 J /* Write a 0, so that no underrun occurs after releasing the state machine */
/ S7 N z. s, J8 u( p mcasp->regs->XBUF5 = 0;
$ b5 `- ^7 m' N/ |/ q mcasp->regs->RBUF0 = 0;! t+ F2 M! G7 i% s, ^, _
5 o! C- }' ~- h- j- | mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
7 v% m! T6 l5 D3 J. i1 q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );7 [+ l. N* c% S2 j+ b
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 2 z+ N$ F6 W, ^8 R b! V
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
) [" l! O6 I. b( {
% z) d! \! U( A( o6 i mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
& I6 v/ p0 I' A) k% i, i while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );. f8 e$ l2 x- d `* o4 X
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 9 D. b2 B8 |- H/ m1 T8 ~3 A
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
0 @. }7 b; K0 r. g
) @* \) A0 B# P3 W CSR = 0x0000;7 ~% Y$ ^. T4 Q7 o, Q6 U
INTC_INTMUX1 = 0x3d;
. o8 c; O/ b: e* Y ISTP = (unsigned int)vectors;
0 T. Q4 u m" \5 K$ g/ h/ s& ?# N ICR = 0xFFF0;
: }9 O' t7 x. `# U! q; C8 g IER |= 0x12;
# y9 T4 c! {% ]- |0 \, y3 Z/ d CSR |= 0x01;
2 j! d; g9 i, h ^. F; M8 e, }# n) s" v( a1 g; t" L) o' H
. h, \9 H ?- r! j9 P
) \2 `0 L8 K0 m还有就是两个输入输出函数:4 P; w" _5 l3 t* _+ j( l) H
void output_sample(Int32 out_data)
r. B9 `6 _2 j# _$ _{# E* h0 l* Z" U5 x( }& d* |
AIC31_data.uint = out_data;
! E. H5 t; Q6 s7 O MCASP1_XBUF5_32BIT = AIC31_data.uint;$ n+ |# s( b) g+ e% q+ e# f8 h
}
3 c0 U# G# R) Z2 D' o/ G$ P
6 ^" @8 i4 G, H) A! P" oInt32 input_sample(void)& n7 L6 t7 D8 y1 x% y# S
{ 4 u: c( k% R) J2 j' p& ]
AIC31_data.uint = MCASP1_RBUF0_32BIT;
, l2 g8 g4 E5 I; n Y" P5 y return (AIC31_data.uint);
, _$ V% }8 v2 T}
' A+ x( E9 N1 }' i( Z% e1 j; e. s2 }1 W+ t L5 m8 E. _6 h
|
|