|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
# |% p- }4 ~+ Q7 H2 N# K" imain文件:) ?2 A8 b' X4 p. L5 {, l3 x& b1 Z) ?
interrupt void interrupt4(void)
: c/ w% y* T" `$ p b& G% P j* y{- }+ g% q! p% X/ {/ n) k
Uint32 sample;
p) e+ H. O$ ^( i9 y [5 c! F* K& K+ Z$ Z5 T) t+ }1 ]) K
sample = input_sample(); // read L + R samples from ADC2 f, U L0 |, @: o/ n2 K( r2 `
output_sample(sample); // write L + R samples to DAC 7 ^6 M j5 j5 @8 D. I6 h
return;
( _/ c- L, M' `) y}
$ M# o. k6 @* h' F9 |5 O! S1 \9 t }2 h) }
int main( void )
. g& ?# k4 w% ^; |6 \& j/ _{
3 q9 J) r: B( a S$ O% W. C9 {
/* Initialize BSL */% B/ \" ?' w L6 l( w
EVMC6747_init( );% G/ g( K6 H' p6 q+ P
/* Call evmc6747_intr function */
9 c3 m% ?6 ~0 ^( v aic3106_init( );
; d& I$ o4 \7 T5 F while(1);1 {+ p1 M2 J& w- k
}
# n: R4 Y* p: o( Q% X
( F& M( H) u9 ?4 m8 l6 M
@& f) ~; g1 `, z- V- T3 @aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题, p9 h0 j7 \2 a2 q' H
/* Initialize MCASP1 */
$ t; H/ Q; v$ a6 k' ] mcasp = &MCASP_MODULE_1;
. ]& G2 }6 |9 U+ U( N6 O" C$ e9 a mcasp->regs->GBLCTL = 0; // Reset/ O0 o7 y# i0 u/ ^1 g$ E
mcasp->regs->RGBLCTL = 0; // Reset RX( W' f3 W- ?" ^5 b- {- }: g% G2 U
mcasp->regs->XGBLCTL = 0; // Reset TX
, a7 L; I% ~' O. f1 {$ E mcasp->regs->PWRDEMU = 1; // Free-running6 h' `3 _( y: I) f. f; k) T7 _
// configure McASP0 receive registers) T; C6 X, L9 N* E7 I
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used5 z7 I! b7 t0 s. e/ y
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus! U7 ]# C6 P: z, R
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
1 C6 r/ a L+ o mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)/ r& P! F+ _2 C# W# w
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
* K2 W w9 K, r, k mcasp->regs->RTDM = 0x00000003; // Slots 0,1
! q1 @4 g) F0 x( | mcasp->regs->RINTCTL = 0x00000000; // Not used! H* v' k8 \0 k9 c
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 T( S- R( u$ v/ l
! s& Y( L* k6 s4 C6 G/ C( R mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used% O. ~9 h' t8 |) M7 E
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus) m6 E9 E8 s3 y/ \- l/ M
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word6 U6 i7 Q$ Y- L* x
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
2 I' o+ ~8 V i8 b5 U mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK$ k$ ]6 X4 g4 t: k
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
' z8 i* C. v; _8 \, }" g mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
6 p# c# t5 @8 [* u! D* j X mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256' p F# h" [; H d7 [1 g9 K
9 Y) I5 i% y7 F mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
- n/ r9 V! T2 ^* }8 a4 L# o1 F mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
" h8 d8 ^0 ~3 J! ?( z& z2 j mcasp->regs->PFUNC = 0; // All MCASPs: R6 [# q" V, [! `+ }8 N. e# h& v
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX14 G( u; p. F& }0 o' l
; t1 p) P/ i7 _1 }1 E mcasp->regs->DITCTL = 0x00000000; // Not used
7 \' @0 A" S) y7 D( D x8 t8 e mcasp->regs->DLBCTL = 0x00000000; // Not used
' W4 m4 u: r5 c0 ~9 V/ o mcasp->regs->AMUTE = 0x00000000; // Not used
: y: x6 w4 D3 ^
$ ]& @) @5 g k/* Starting sections of the McASP*/
! v# c) g; Y8 {3 q mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; # i6 g. L i6 v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
/ c& g7 s! F- i3 s7 f" _ mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
6 r( C! h+ E( S4 n8 a while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );: T6 r- l3 m2 O5 O2 r6 Z
; M7 D1 O2 S. C Z1 i j
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 9 j- n7 s% m; w( m
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );+ f- g* d: J1 p1 F0 l. W; q+ n
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; & V2 @1 h; c& C7 K
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );, E( d2 |- T0 y! b; N9 [, y+ o
7 a9 p% `8 b: d# F# s mcasp->regs->XSTAT = 0x0000ffff; ! {7 h; M; s3 y: h
mcasp->regs->RSTAT = 0x0000ffff;
, p5 F% [" l# ]5 C/ S8 a. p9 b- P6 U
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;2 R( k" _, _' A/ C
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
7 [* i+ [+ a; n9 d mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 3 T4 i* c7 |7 I0 @
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
1 |" n; X4 ?( f% c1 X" C0 j r: ]* O/ u: l# O& C" S
/* Write a 0, so that no underrun occurs after releasing the state machine */
% F, j8 r2 P! {1 O mcasp->regs->XBUF5 = 0;
( u6 ?4 t, V/ T5 ]" U. x: b* W mcasp->regs->RBUF0 = 0;
: G( E7 y- E) _% K7 L. r" J G8 b D( G( u6 U' P$ @0 n1 ]1 Z
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
0 m9 b: }0 J6 j" ` while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
5 c1 M' ]6 @9 c D6 m; L mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; : w, E L1 X$ M" q6 _$ i
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );1 S1 G) ]2 \9 B
7 Q! U; d2 {1 e, D# `
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
: G# |' \: N0 V( v3 Z) j4 \ K while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
' b7 U" _ Z, T, y' X4 u \ mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
1 r4 _& V+ m2 C% b: m0 }6 ? while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
y! y# C& X; j7 N \" {( Z/ P& }/ ]0 h' G6 ~ v; U& h
CSR = 0x0000;4 w2 |* H; n3 S; u: K" E( L
INTC_INTMUX1 = 0x3d;" X% S5 h5 @1 E5 f
ISTP = (unsigned int)vectors;
4 i: Q5 W) E# y: {& f$ D" U ICR = 0xFFF0;
3 p" b1 } k0 u1 g+ o' B IER |= 0x12; 0 ?/ s8 Q) y$ R9 V+ G
CSR |= 0x01;
$ k- J; J* I+ |+ O. `6 D# X# a; M$ R7 P; l& S
. q) M/ \& ^3 B1 V# p1 d3 c+ J+ l9 R! Y& r( \2 z
还有就是两个输入输出函数:
% x- C* \6 p0 z$ s! {- A* \% _' Pvoid output_sample(Int32 out_data)
( J Y1 k" W0 {3 F$ M, F/ x/ Q{0 \" T( [) q1 K% }" t0 J
AIC31_data.uint = out_data;
- a, G% \# c# W0 Z2 B$ m; x% G MCASP1_XBUF5_32BIT = AIC31_data.uint;
# v2 r. [& D6 b5 T9 V9 W}* D6 v6 `: A8 G) c* C1 k3 M: {
6 b# {6 i+ L5 u, ?4 A' j2 r1 VInt32 input_sample(void)
4 L# Z7 Z8 H4 Z5 r7 ~+ B6 O{ 6 n4 } ^4 Q- d; \" Y$ Q
AIC31_data.uint = MCASP1_RBUF0_32BIT;* `9 A7 V' J0 n
return (AIC31_data.uint);
, e8 j% G; t9 f' w4 K" j}
" g1 h! l( L2 d1 O3 z0 s* L* H+ O2 w$ E& m7 F8 }
|
|