|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
) N! `, B/ |5 U8 Cmain文件:; q( M1 }9 l& M* n0 u; \( B, F- `
interrupt void interrupt4(void) 4 g# D. o- V" }+ i. A
{* N6 l, u: @; l
Uint32 sample;
1 W! P! @* j6 [
* d, c, v/ m/ W0 ] sample = input_sample(); // read L + R samples from ADC# }; Y k! d8 b
output_sample(sample); // write L + R samples to DAC 0 i" H0 K5 {; D% M8 M4 }# X
return;1 m7 M+ g7 t+ n1 H; b/ D& i
}
" j# g: V: y7 x% Y# k' S0 N& k1 j& A- E1 @
int main( void )4 |* m& F! |7 G: L9 I& ~8 M' E2 b
{
" H' n3 O) U Q4 J% Q2 ^7 X1 e& y% [7 z7 D7 W1 r7 v* H
/* Initialize BSL *// E* I$ F3 M3 u7 r, u! G
EVMC6747_init( );" Q# R. z3 [) J4 k0 j
/* Call evmc6747_intr function */
$ u) m6 Z3 F9 I+ l) T! f Z aic3106_init( );% x! W. `( ~$ V- W
while(1);
, E1 q! P$ F: ^& j9 Y; m0 U: p1 x}' e. o4 X: N+ F( o. W6 a
7 E! Z: W3 R) ?: d- X r: m& A. c' I& N/ M6 x
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
8 o1 i: H) e& k1 ?5 \/* Initialize MCASP1 */: v: X( D& {1 u/ `; O
mcasp = &MCASP_MODULE_1;
! V( c( F: P( r/ A8 [ mcasp->regs->GBLCTL = 0; // Reset* g( L; I- R6 z4 r- e6 [
mcasp->regs->RGBLCTL = 0; // Reset RX
8 e& x% N. ~9 e" u1 N mcasp->regs->XGBLCTL = 0; // Reset TX
/ w8 Q3 E; Y4 q! N mcasp->regs->PWRDEMU = 1; // Free-running/ X, A# _* B; k% M$ h- L, p4 |" g
// configure McASP0 receive registers9 |9 S5 k5 ^; X! ?/ @& i3 v( |
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used. y$ ?5 g6 l4 p# d
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
( B! |- E& d! k* b% f/ ` mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
' e, I5 _8 q% ` mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
& Z W$ U# d9 U+ M6 e mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)6 O0 j5 V9 j8 d+ o0 r( I
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
0 \0 Y- m; d# P! T8 o2 b mcasp->regs->RINTCTL = 0x00000000; // Not used0 t( L# B$ ]( L2 `* _
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ `( a B- R- H9 u+ N! @" T4 \- [0 l
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used3 e. v$ Q4 O1 j, B: G) P: l, j
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
) X( }4 i8 U `7 z- A mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word+ J4 b) {* i/ t0 V* m' ]/ S# y
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
6 j& i$ I" m2 y/ h* ~3 `% W; v; C mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
, m* m" t6 E! U mcasp->regs->XTDM = 0x00000003; // Slots 0,1
+ A0 P+ A3 _; l/ ` mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
) Q! Y" Y. _: i% F( }- w mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256+ d6 ~$ E# b% N* T- |- o; \7 @
6 F$ Y3 ^9 G9 z mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
6 c: t3 r% W% C& b mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT* n4 u$ c( O2 ~6 O$ t% M
mcasp->regs->PFUNC = 0; // All MCASPs$ v( J! [3 P; U3 L3 U. D6 c2 @
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
& _% ?" N: q& c' t) y+ W
( D x7 t$ j6 ^' A0 x" i A mcasp->regs->DITCTL = 0x00000000; // Not used# W' R; N1 E E' I9 B
mcasp->regs->DLBCTL = 0x00000000; // Not used; W$ D4 T( C1 }
mcasp->regs->AMUTE = 0x00000000; // Not used
2 F8 x8 j5 m! `/ ^4 m0 }+ }7 F
! M- c# q- x4 E0 v R" L! E. c' f3 s/* Starting sections of the McASP*/
* X- G h# M. D mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ; D! D4 X, M8 h, }8 t" n5 ]8 q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); c5 k" U' q4 `- N
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
4 c p* O8 l% R& i5 @+ t while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
# I' n1 ~8 C; ?% j4 g/ `0 N
# X/ e/ l) f! k mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
" i6 T6 ~9 ~# w0 }4 H a while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
/ o1 z2 B K' f V( h6 Z mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 0 _; z8 S: R+ G% K- N1 E2 ~$ h
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
% t0 M6 b9 L+ I+ M' i( M
j: \2 }2 W) R9 P9 L mcasp->regs->XSTAT = 0x0000ffff;
2 u, C; N% R' N& i( z8 { mcasp->regs->RSTAT = 0x0000ffff;
9 N- f& S# Z8 G! F) \0 d4 n4 o
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
; x6 H7 f: R% ^4 n0 U* w+ u while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );0 N. l: Y3 o9 h- v- u( z b
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
. ?% V+ c2 D* @! V1 Z( Q4 Q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );2 n- r) N$ K7 b* p& E& x
5 z9 t; Z, C" N4 n7 G1 d5 c# O /* Write a 0, so that no underrun occurs after releasing the state machine */
4 n6 z1 g7 E+ Y+ f4 r3 m% J mcasp->regs->XBUF5 = 0;
, ]" I8 I; C3 r' r mcasp->regs->RBUF0 = 0;
9 K: ?4 `2 W# B- W I/ A& B0 k3 x' Q& ~) ^
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
8 r; q G. s" Y0 T+ L while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );# \8 D5 W* f& O- t; M+ C9 C
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
+ C K& A8 A1 F7 X! \ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );+ Q' U% i5 ?# N" X
2 M. e2 S8 m9 y% |5 ?1 N2 { mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
$ `- n5 U$ |7 M* ]6 A while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
8 _; w, @8 W. h mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; / f* N2 w$ M1 ~, ~* V; C$ N
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
7 U1 w2 N; n7 L/ i! h
8 F. Q0 I. R# ^6 Y CSR = 0x0000;
; u' X; [& T7 ^- O( |& S ` INTC_INTMUX1 = 0x3d;8 i: N- B) g$ S+ ?5 ]& x, v
ISTP = (unsigned int)vectors;
- I7 D6 L0 {/ q$ U3 i ICR = 0xFFF0;
% l5 t2 F1 ^4 T, j IER |= 0x12; ; v5 |- I( \' w3 o
CSR |= 0x01; 7 E" \' j* v4 u
3 G1 Y9 Q% [5 { ]7 g/ S; e. P
! f4 K7 [* K5 z+ j. t C. h- G5 `3 s) {. \ y/ y7 r [
还有就是两个输入输出函数:
8 X. Y& u* \0 Q& I2 I8 Svoid output_sample(Int32 out_data)
& c; i+ r4 c2 p7 x" n8 {5 @{ E: _8 ^+ G) L% W8 Y q! n0 r
AIC31_data.uint = out_data;
; ]/ K# G# s8 d2 v$ C MCASP1_XBUF5_32BIT = AIC31_data.uint;
8 X e0 P' A1 n) t* Q}5 H% I, f- V: l9 q3 ?6 {
8 K& i3 N0 t7 H+ cInt32 input_sample(void)
6 P; u0 q6 o) C7 C/ C{ % L* O& G! h$ L' O8 ?5 h
AIC31_data.uint = MCASP1_RBUF0_32BIT;
' j' ~2 C& @0 b$ n' [; R5 o& p return (AIC31_data.uint);6 x- w) e |7 F0 W; ~
}
: h \# g y6 z. D* D# f. x% z H a" s7 G1 e, v; h8 h
|
|