|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:* {( w- n2 v7 {2 O0 q Q' l8 s+ b2 z
main文件:! t0 ]" j4 R, V$ o+ X
interrupt void interrupt4(void) 0 O1 q* | x# I- S# P; ?
{
: q$ n" w' `: ~& {3 { Uint32 sample;
3 ^% n: S2 @1 e" ~5 ?+ z8 L8 b3 E9 @6 p. L" o
sample = input_sample(); // read L + R samples from ADC" _, A( ^! B; L7 U1 V: I8 t. M
output_sample(sample); // write L + R samples to DAC
: i( z, a2 ^0 q. X2 v) _ return;" v4 P' c. A- U/ s8 e! j0 s$ ~
}3 N5 d2 V4 S" U2 |
0 v- m" l6 f( yint main( void )
# I! h; P P+ N. k; d# \' u{+ I' F/ Y% v5 o6 R4 r
2 w4 F% h$ a3 Y( N/ V
/* Initialize BSL */; v& J/ U2 b! J
EVMC6747_init( );
( R; B5 V1 h& b0 M- O5 ? /* Call evmc6747_intr function */
) j( O+ U, O n) C aic3106_init( );
4 u; S5 d2 c" S& ~ while(1);
2 K8 y- a$ [/ S1 D- n" f7 C% L}, g5 w& `( p2 Z3 x; \' i
% s6 i$ A3 ^7 |0 Q) m& [5 R l9 _: ^6 H' ^/ h
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
: G$ ~0 g/ [6 H0 s5 ^/ ]) w$ f$ ?* R/* Initialize MCASP1 */& Z. i, x7 `0 A1 X" u3 V; y
mcasp = &MCASP_MODULE_1;5 l: f1 K! ?6 N) e
mcasp->regs->GBLCTL = 0; // Reset$ g( t$ w+ H [' m x2 |
mcasp->regs->RGBLCTL = 0; // Reset RX; X+ T U5 x, J7 T6 X( o
mcasp->regs->XGBLCTL = 0; // Reset TX0 r/ D$ x; n$ M. N! [. x
mcasp->regs->PWRDEMU = 1; // Free-running* |7 N n* ]" e* y- v( \
// configure McASP0 receive registers
/ r/ J5 {+ ~) D* l( _# P6 H; E mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used2 D' T# H F+ } U
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 G" r4 o" `# g8 D/ [1 p! Z) c mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word4 Z# C2 H' O9 A! b7 W5 [( }6 I3 x
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
+ T: _3 b' F- [8 R, F mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)' q7 }# S% c6 l: r
mcasp->regs->RTDM = 0x00000003; // Slots 0,1+ {, m4 V4 z, J
mcasp->regs->RINTCTL = 0x00000000; // Not used
6 S: H! A# I- m$ h- a0 g- [9 b Y- S( g mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: v( S( C1 d3 ?1 m6 c" A
/ r# N% S3 D9 h3 z1 I; j mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
6 A1 L6 _6 h1 j' b% r! Y; S mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
3 t1 M# l% b: C4 _+ Z mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word# H- t& h8 h) \5 K8 y( S. L+ K
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
) U0 E# {2 } i) W: c: J mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK: p5 b! j* p9 v. v* N
mcasp->regs->XTDM = 0x00000003; // Slots 0,1. u2 e* J; u+ I3 G9 k9 Y
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit6 T( }) X0 w) n8 P
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
$ ]8 _% b& b8 R$ {8 L1 q! o: y, i" y" v+ Q: Q$ `. W3 {( H1 i
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN0 p! `% p# T7 q5 {* [
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
0 Q* L# O, w- a+ e0 c mcasp->regs->PFUNC = 0; // All MCASPs: S5 n, E3 Z6 e/ N M% n, A
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
/ \- U+ p9 n/ a4 ^$ U( z; ^* ?( Y
mcasp->regs->DITCTL = 0x00000000; // Not used
' ?8 |6 D& J8 H1 p mcasp->regs->DLBCTL = 0x00000000; // Not used
, k: B& ]7 ^! z' p7 r( u5 v3 {: @ mcasp->regs->AMUTE = 0x00000000; // Not used! @, d8 J3 G, N: w2 X1 i
& Y# ?: ^$ r) k, n0 z1 y& _( T/ [/* Starting sections of the McASP*/9 p* ^: q' w% F9 G3 [/ o
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
) E6 F3 Y) l( u# R7 O while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); ' @1 A$ n, S4 l* n$ J: n
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
* S3 d4 u0 x; l# {( K. [- E while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );. E6 t+ R. t9 L: i
6 ?4 w1 s( `& @( A) V mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
: m4 z0 L9 [- E2 K1 ` while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
* n. Q" k3 O8 [. C' F mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
4 N. v C3 v' z: l* ~6 C while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );7 Y$ c; K) ?5 a
6 a* U! s6 r1 c, l: s mcasp->regs->XSTAT = 0x0000ffff;
8 A" ?% d' H, N- J mcasp->regs->RSTAT = 0x0000ffff;
; C& U! G3 |, t |. S( T2 b8 p6 n+ [4 ?/ R; g0 e$ N! k
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
$ N6 p0 }8 h# ] while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );0 k5 s g. m* |! d8 m% J# d
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
6 W" t8 \% \% v' e8 B S while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );5 g+ x( }" v' r) ^: M
: S# F# v2 y& I% c x- p
/* Write a 0, so that no underrun occurs after releasing the state machine */
9 M# Z ~$ _4 i9 N mcasp->regs->XBUF5 = 0;% O2 B, A G9 R
mcasp->regs->RBUF0 = 0;: Q' l+ L: @: B% a7 e; a+ ` }
, w+ u3 \) [# V! ` mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
2 b+ K8 y0 D" c" Z' s* f while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
8 G0 L. r% b+ p3 q0 v mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; & ~5 l5 R |- E& M1 U- m" x d3 j- o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
/ e) Y3 `% o/ j+ Q: A; X! g6 ]4 U
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 4 B6 i. y+ p9 S
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
. N W! Q0 E* \& g5 h. l+ H mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 7 Y+ U% u, V' `$ Y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );! M& x, Q; ^# Q& }; Y6 g
- d4 m: a& p3 s6 _' d& h CSR = 0x0000;
7 A7 H+ p4 `+ B6 N INTC_INTMUX1 = 0x3d;5 c0 ~# ]8 d c% G, F
ISTP = (unsigned int)vectors;4 m) D; Z+ |0 N6 n& o9 g
ICR = 0xFFF0; 1 V( t$ Y* E3 b
IER |= 0x12;
* {0 x) Q0 U3 Y2 [+ I4 m8 T CSR |= 0x01;
& t2 o4 [/ |3 s0 P E2 Z1 P7 {+ n$ A* B# |
5 D" o1 M" @$ s# @+ V
) r6 y! k" n. |- L- Z% _) ?; {: ]还有就是两个输入输出函数:
/ H6 a0 G g; y% jvoid output_sample(Int32 out_data)6 I% T l0 s* g1 c( j+ Y. t/ w
{
) @( D3 i( }/ h; m$ x; J; q AIC31_data.uint = out_data;
) H; Z1 n! f$ x) M5 h9 ` MCASP1_XBUF5_32BIT = AIC31_data.uint;
6 m" r; K2 @0 C* U}( L" h% R, a5 A7 @- U* N
/ u8 ~! B" D/ M4 L1 M
Int32 input_sample(void)
+ I4 e# `% q1 y8 z: w6 N' b% ~{ 8 ^" D4 u- N4 ^4 p* v
AIC31_data.uint = MCASP1_RBUF0_32BIT;, x6 E8 m9 {- c$ a- @" T
return (AIC31_data.uint);
* }; b- [: Q+ ^+ V4 W2 E}
6 ?/ ~- i* Q) a( O
* _0 [3 s/ r; F' p8 y |
|