|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
8 E" O1 \1 g0 J" p8 i2 w3 Q/ H2 cmain文件:
% `5 p4 P2 h% q/ zinterrupt void interrupt4(void) 5 s5 J: l |6 h& x/ R! |& G
{" _: L4 O2 R2 }* t1 {
Uint32 sample;' R7 W! E! |5 a9 m
4 ?( t h% p% W' a1 f9 ~8 u& p sample = input_sample(); // read L + R samples from ADC# N# W* Y/ D! S5 S& f
output_sample(sample); // write L + R samples to DAC 9 T T* N! u# u5 r
return;
x. o n2 t8 g$ C- Y& d0 ], d, l}& Z. |) N( n; B9 F3 [% m. y
! g! x. E, k1 `$ i+ S( K2 \int main( void )4 d1 ` K1 ^+ E2 o
{/ ? {; E: T1 Z% k+ ? W5 u
( @# c4 y- t8 h /* Initialize BSL */
w0 Q8 I ]( n1 t" @ EVMC6747_init( );1 C/ Y$ B1 G* m/ v Y/ D) M
/* Call evmc6747_intr function */5 l& e% F j3 z* `
aic3106_init( );
( Y; j" Z8 x) S& p while(1);
1 X4 |+ E2 E! q/ K' E( N" r% {2 v}: c* g4 A4 v8 K+ J N
* k& e/ B5 d8 d
- v( f8 M+ m D& }- J5 G+ laic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题7 a/ J2 a. C( ^2 @- ^: E
/* Initialize MCASP1 */
8 C5 {7 w1 m4 T$ J. g mcasp = &MCASP_MODULE_1;; A* `2 y) k2 o- Y7 \
mcasp->regs->GBLCTL = 0; // Reset8 |- l# y: @4 l) O/ m
mcasp->regs->RGBLCTL = 0; // Reset RX
% y% P6 N/ x7 }6 C* R; r mcasp->regs->XGBLCTL = 0; // Reset TX' g4 b3 }/ `2 w! C N Z6 H* `! L1 A
mcasp->regs->PWRDEMU = 1; // Free-running$ G" c9 p- Q8 w, n
// configure McASP0 receive registers
# Q0 v) X+ O+ g+ \7 {- g' K5 } mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
2 G5 \! O; e) R2 }; u mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
( U5 Z( B0 Z- w; Z. j1 k mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word* j6 K+ }# I& s+ Z, t. H+ Z* v
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
. m$ H+ V, Q' @# \3 ] mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)" m) x; ?/ C8 H/ W4 Y2 X; O
mcasp->regs->RTDM = 0x00000003; // Slots 0,1; Y6 Y# X$ a* d6 U; u4 y
mcasp->regs->RINTCTL = 0x00000000; // Not used
: s' W5 p9 u9 R% t# j* y- U# u6 a mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256. y2 P5 G, P( X0 v6 e; c9 a) C
! M2 e* \4 d1 k0 E) a9 j mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
$ W2 t; E9 X/ L$ F mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus& D( u* X$ Z# |
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
5 v5 Z7 z# i2 Y1 m0 W% T& H4 P$ L mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-169 R E: _# I; V+ D9 G6 F, l
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
5 J9 n" ]4 z% { mcasp->regs->XTDM = 0x00000003; // Slots 0,1 X7 L% X8 {& s8 F6 ?
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit; P7 `# |0 O4 G8 h
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256% _4 a x3 j1 y" s/ |, N
7 h6 C- r6 ?+ t1 P" C' v
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN; P/ P8 S# K- j P& S; k
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
% D: h% }3 T- S: [ mcasp->regs->PFUNC = 0; // All MCASPs
7 V3 W; I; m* T9 g mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
1 t$ T3 H# r" c% P/ ~0 | G" A
2 ^8 q8 E1 ]4 w w# d mcasp->regs->DITCTL = 0x00000000; // Not used: ~$ t6 e, z+ O% u
mcasp->regs->DLBCTL = 0x00000000; // Not used
2 j8 H4 m4 B# ^$ S3 z mcasp->regs->AMUTE = 0x00000000; // Not used
. Y3 a$ S, T/ ~. R
7 E+ D. H; q. X2 L7 m! d! v) V/* Starting sections of the McASP*/* }% s7 ?# i. V; U: H5 p! g
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ; `6 Z# A; A1 V ^9 Q' D
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 4 }3 M* M4 f3 j2 l" _4 i# @. M7 W
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
$ H9 m! d7 o" @; l+ a. Y' E9 x; s( c while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
" J/ r' ^5 v% H8 N4 d2 s* a6 N! f5 E b' \% }: k+ C
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
4 `3 D8 ` v& s. c while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );8 O( ~( c7 L; Q0 F3 \& [1 ^9 H; x
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
7 b n) Q* }( x( z! \ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );# s) D s( h5 W4 |( V; A& X2 k
8 E- U* l: H2 |7 W" p mcasp->regs->XSTAT = 0x0000ffff;
. u, D" ?4 C& q' P! U* i mcasp->regs->RSTAT = 0x0000ffff; : |3 _$ ^, k; {4 Z& t& _, Y4 b
: E1 j A' _) C; s mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
5 S! g5 }/ Q2 t% A while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
9 W$ ]' U& O" g5 v* x mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
: _( S; s! k6 |" P3 r while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );* S. |( N5 `2 G8 _0 n
3 y/ d! Y3 _, p4 r& V" C5 J7 o
/* Write a 0, so that no underrun occurs after releasing the state machine */) g5 |1 O$ u2 J3 @+ {* }. n
mcasp->regs->XBUF5 = 0;
6 L, |: H1 [& m mcasp->regs->RBUF0 = 0;- f1 D9 H u( [* c+ M/ Z' W$ n9 S
9 j+ j s0 N) j mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 2 E$ o# ?3 u# o6 i
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );2 q( j& i4 X9 a$ \" V
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 0 t& ?; N' O) C3 h& h' r% Y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );0 B+ L6 j1 ]. o) C
$ r. k/ ]' U* d/ d$ Y( l8 C5 p mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 2 ]8 q* b3 L! m: @1 ] L) l$ e
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );+ ~4 ~$ b* B( U
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
/ H- L3 b& r& c while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
# ~; e& z B6 l2 n/ G7 N4 A9 A. a$ E% S$ x4 ~' H" d5 d
CSR = 0x0000;
# Z7 t* X! R; \" J! j6 A" k INTC_INTMUX1 = 0x3d;
* c4 B% _: G/ G: z ISTP = (unsigned int)vectors;5 D4 i0 A4 a8 N
ICR = 0xFFF0;
% w' N7 j. v4 q8 Q9 K, y, g IER |= 0x12;
3 q" a6 @4 ?" l2 I CSR |= 0x01; 1 L; Q) S) R4 R
- F0 Z2 s! k( s( q6 d8 S
* b$ W4 y/ v6 m; R# x
. B2 l& h7 T- Q+ ~还有就是两个输入输出函数:
, n, C! E# L6 X% Bvoid output_sample(Int32 out_data)! b: n; p+ j/ T9 `
{
( E: |( z6 E. Z AIC31_data.uint = out_data;
2 J m; K3 F! L4 f MCASP1_XBUF5_32BIT = AIC31_data.uint;, t, P/ ]1 Y9 j9 ^
}+ b7 I. w! o( r
8 b) u# S9 V! r7 ~Int32 input_sample(void)
/ K8 }8 g P+ S/ ?2 o{
& k: w- G; H) p9 u% S AIC31_data.uint = MCASP1_RBUF0_32BIT;, e. ^) l0 o' n( u+ V9 e, Z% x
return (AIC31_data.uint);
1 S* z# u3 G) v6 a5 j$ Z& M; {}2 z+ Y1 c/ @+ [* ^
9 D+ O$ ~+ ]4 ]( j/ B% [( ^
|
|