|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
9 j, L% Y1 B- y8 ~% ?5 |main文件:. q% P" r3 n) L' t. \0 k# r
interrupt void interrupt4(void)
; C9 O! Q- K) B8 d% P# J( P' I{
4 o* u' P; m1 p! g. c Uint32 sample;
4 t( l) E X3 T+ K# l a/ ? a8 O8 e/ U; M+ z' c
sample = input_sample(); // read L + R samples from ADC$ k4 m+ N, M1 M/ E# j3 Q& ^
output_sample(sample); // write L + R samples to DAC " d, S! ^- H! H$ n4 }
return;
5 ^5 X- ^8 W, `8 ?: O: Y/ q; Y}
# C! A+ O% e0 x5 z5 z2 f
! H" P7 L( e! @int main( void ) S/ E$ P( w" ?
{8 S' \8 w* W/ i6 _0 j8 ~( K! ~
) d# ^ x$ K% O
/* Initialize BSL */) T/ P4 `: N5 G* ?
EVMC6747_init( );
& A. U% F9 J9 e0 C2 V( G, L- ^ /* Call evmc6747_intr function */
5 P; M" h9 T: }' J$ ~1 W aic3106_init( );: o/ N3 a7 O% n6 I r7 L E* v
while(1);' ?' O5 k+ b- @7 [; Z
}
4 k4 g/ W5 f! H7 u8 s- I( w p' P! }% Z' X7 }
; x7 H. f6 B; M4 taic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
1 K. O) m, ?. y: D' W/* Initialize MCASP1 */
3 d+ M& _) r# x8 q5 S9 n9 }7 a mcasp = &MCASP_MODULE_1;
" p, F" C0 \1 L. |. _ mcasp->regs->GBLCTL = 0; // Reset
$ l1 L- `! |. ], h3 E( @ mcasp->regs->RGBLCTL = 0; // Reset RX5 B1 }! A6 p, @9 E3 R" c0 q* B
mcasp->regs->XGBLCTL = 0; // Reset TX
# l3 H' L/ R0 K' `. | mcasp->regs->PWRDEMU = 1; // Free-running
# L1 G5 l: L' N. P$ V // configure McASP0 receive registers. G( B! O0 s5 I+ J$ I) n3 | U1 B
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
+ X1 q) C$ o/ Z- [1 ` mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
, j" p$ o0 a( c) \6 k* m mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word- w8 E* b# N: E$ R- c6 x1 j7 Y, ?) N/ I h
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)$ f2 p/ a; w% h/ R; i! H
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)1 N+ e( j8 p( O. o
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
* ?$ T' \; J# _: D" j$ i mcasp->regs->RINTCTL = 0x00000000; // Not used
% j; h$ }+ m6 P3 m7 p! K mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
3 ]6 _0 ]+ d( @6 ^4 @6 Y+ G6 e0 Z' j# l) ?" @- \
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used1 _& n& y( `7 O2 V8 W9 u; q
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
( H2 N# u/ F% ^5 S. }: A0 {, I) L mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word8 l6 d: E& d( f" ^+ c( F# q
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-164 i7 f0 e; a, e2 W( Y2 c4 T
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
$ V$ o7 v k9 L$ {8 k/ { mcasp->regs->XTDM = 0x00000003; // Slots 0,1
1 K# a& m q. L9 G mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit: w5 T, A7 n$ E0 s! a5 t
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256; v$ n. u4 E8 n. s
Z5 t; i0 [& }* D
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
$ C, Y x' U' I7 q mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT/ o' }7 s0 Q3 ?- e4 |+ _
mcasp->regs->PFUNC = 0; // All MCASPs
2 p" L( }3 Q L. T6 N8 H mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
' O& e. `9 R7 {* t6 e
& B4 T' o2 s3 p+ L' V. E mcasp->regs->DITCTL = 0x00000000; // Not used- e8 q& Z0 J& e F4 y1 N) | I
mcasp->regs->DLBCTL = 0x00000000; // Not used
6 M, k* b2 q% T8 u mcasp->regs->AMUTE = 0x00000000; // Not used1 N% V4 ?( {' [
6 v9 [: ^ A* n- e" A
/* Starting sections of the McASP*/# X0 g' T8 u% d4 g' Z: T
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
' L/ x& q) E* ~- T: } while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); # X6 U: f" A9 O+ |1 O* J
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
' ^6 p/ P6 p8 f6 y+ w- a while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
# b, V2 R$ t5 K/ y
+ p9 p( y5 g/ F4 v& s' { mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
; \6 o5 q4 ~$ N) Q0 z% _- I while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
% Z) T6 L9 [2 d8 Q' G mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ) t& E& G9 w/ q1 U
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
9 a& j( a1 M2 G4 p
7 P" z* N$ d2 ?% A mcasp->regs->XSTAT = 0x0000ffff; j9 h) Z9 o$ \3 \4 @4 m% ^
mcasp->regs->RSTAT = 0x0000ffff;
* d7 p2 F' `; d% [8 y
" P* s7 j8 V9 M9 x mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;4 I6 ? d6 X4 k5 r4 q. r8 n1 S
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
9 X- N( U K+ w" L0 X2 w mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
+ z+ n( n/ l1 T" ^% D while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );, Y4 ?$ i+ w/ e
0 Z2 {2 m2 c% u: P# s, S /* Write a 0, so that no underrun occurs after releasing the state machine */- Y# v6 Q& i9 E2 B$ w
mcasp->regs->XBUF5 = 0;. G$ v. b0 x3 ?' u0 a/ d
mcasp->regs->RBUF0 = 0;4 H( F. Z1 a) ~4 L
; G! B' J7 F$ Y& H/ P mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
( F* A V' A0 V while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );! b) g) f0 x" e
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
1 C6 M, r$ ~5 i0 r while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );( }" z6 Y0 H, J& v- |" r# w2 t
# H/ p! I1 S- N$ W
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
8 F( i4 j& X- H* ~5 T& n& m% V6 ~ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );6 f, C+ u/ h" ^) ~8 I4 E' C7 u
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ) W3 N3 c& w! d- `; v8 f/ B
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );# B$ _) `# X0 U( W0 \! o
; F( X+ d) I6 u, x
CSR = 0x0000;
9 ^0 L2 Q( i. [8 t0 q INTC_INTMUX1 = 0x3d;
; [9 t2 {* T+ i0 l ISTP = (unsigned int)vectors;
/ @4 S. o" \9 H* v5 m! t' f ICR = 0xFFF0; 2 Q2 Q4 Z. Z" }6 ^; t
IER |= 0x12; 7 W3 u; u0 m1 X) \! Q. ]; t+ _
CSR |= 0x01; ' ~+ u3 R$ n( ~* a, Z
, w2 f# l4 e/ w' N+ X9 i; z
' F. B# l4 \0 s$ ~# `& n ?0 t
# z% e' `8 _$ `* o1 v: G还有就是两个输入输出函数:! r; e5 h: m1 w! F7 q$ M$ f( o
void output_sample(Int32 out_data)/ d# a- \, z; @! H5 s
{
7 P: G: K) r. P; Z; X AIC31_data.uint = out_data; ' ]! O8 P R; k) n# W5 W& g5 t. g1 f
MCASP1_XBUF5_32BIT = AIC31_data.uint;
2 ^) T( |+ L% |+ g}3 e5 @& b% P' M" j+ {1 Y; y& B6 o
9 m- ~4 n: i; B S- b" A
Int32 input_sample(void)
& H! Q& v2 B; {{
3 _0 m% B+ r' _/ N% d AIC31_data.uint = MCASP1_RBUF0_32BIT;$ {. g* _: u/ z- ?/ A
return (AIC31_data.uint);7 f2 g4 t1 {; I
}% m0 d* m2 Y7 ~
" E. a) g. j- j5 I5 l, {2 t" B
|
|