|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:+ O( m. u; _" f- C5 e
main文件:
6 ]2 e( t! F% A |/ J7 finterrupt void interrupt4(void)
- A. z5 [ d& Q9 ^+ w+ g% j{) H5 K/ U6 I4 b0 t3 l
Uint32 sample;
2 k; r# p/ _$ f( V1 m, J
- o+ L9 H+ N! p& X* Y sample = input_sample(); // read L + R samples from ADC. W$ M+ N% H& j x2 e/ `* E
output_sample(sample); // write L + R samples to DAC 7 A% \3 [5 W3 [0 [
return;
" ~; T1 f$ U1 g- W) J! i}& e: {& J; a- X) P( l/ V( i: a
4 S, D$ c) P# K1 V% G* @1 P, Mint main( void )2 P, x3 W% i _6 Z
{
5 j$ G% K. r( ]' L4 S. T
* F; W4 ^1 t6 k9 m5 b /* Initialize BSL */8 O' L2 f- \2 S6 g" ~
EVMC6747_init( );
# x4 T5 q( [2 F$ h) [ /* Call evmc6747_intr function */2 F; K# e; S5 L8 c& K1 [
aic3106_init( );
2 Q- I6 L* y) o" v O" A while(1);# O( }) H: p! o( l* z, a& ^
}8 @: |2 j' H! M( l- |) [; l
9 \0 U1 F \. d6 m* X
+ l- W/ m6 |. [7 K5 E Jaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
* F* u% ^/ q' n1 R9 |/* Initialize MCASP1 */
+ i% G& j1 G2 I; b$ n' W mcasp = &MCASP_MODULE_1;
1 M! S& F) u* x2 H. i$ {$ _ mcasp->regs->GBLCTL = 0; // Reset
! F5 e. `/ [% N1 q/ k% e! `6 P& v mcasp->regs->RGBLCTL = 0; // Reset RX
! C, P, ~. L* ~ mcasp->regs->XGBLCTL = 0; // Reset TX
. A' E4 J8 ^2 t: b+ }) C mcasp->regs->PWRDEMU = 1; // Free-running2 V( P3 D# W! _) L
// configure McASP0 receive registers
2 Q E4 {7 }! C% p" h: Y' c mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used3 H0 q) O* p8 z! Z2 q- P
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 G$ F) H) p3 U4 |$ K mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
' w! e8 G3 `' V) L. e' P1 r mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
/ v- Z& O c& P' ]. u6 i mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
6 F( g% m* G9 Q. P9 d mcasp->regs->RTDM = 0x00000003; // Slots 0,1
* X! R' I J8 S/ e; B mcasp->regs->RINTCTL = 0x00000000; // Not used
0 Q8 m2 X, f3 j8 N1 p mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* v6 C$ U& I! B( J
" N9 P* n* N1 ?. U' F$ p mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
* p% P f5 c8 A( m mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
$ |9 g) u6 }+ k# J2 v mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
6 h4 K' s2 M1 w mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
L3 L j' P4 q0 b9 V mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK q9 e: r; ~& D; k) p8 r
mcasp->regs->XTDM = 0x00000003; // Slots 0,1- F& Q" f8 Q5 `( _ j
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
" V+ i) ?/ G J' a mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256, g3 D3 O7 X7 @/ `) p" a. \
/ i" x! h _% O3 \& N# T
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN% ]* h$ C7 M) Z
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT! i$ x7 L7 S- _7 g) V
mcasp->regs->PFUNC = 0; // All MCASPs0 Q, g2 [* p: J7 n1 g& d2 E$ U3 H& R
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX19 y: x; _: y/ f/ E* Y( `; ]
# ?: W' X7 b: x) ]+ }. s3 V mcasp->regs->DITCTL = 0x00000000; // Not used2 C* [# k9 _) z8 v2 O
mcasp->regs->DLBCTL = 0x00000000; // Not used
- i) e L; M. ^* Y* u; x( e mcasp->regs->AMUTE = 0x00000000; // Not used
; o2 s! n* Z5 |" D
1 D- }0 y1 o3 t# f: s+ V f5 {/ I/* Starting sections of the McASP*/
7 F2 x" @' g# P2 {1 ~ mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
6 \, D1 V3 G8 {& K4 U. c while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); + r- |! C9 ]* t6 V: ]
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
. O6 U1 V( N, R+ o7 } while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );/ U% \/ U; X5 D2 d7 Z
5 x" C0 q& p- ? mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
0 E, E& `; _+ Q5 N0 {5 b: L while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
4 t/ N) e5 Q6 ]* v" V% a- G mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
7 z- Q: J1 D2 b& E0 p% A while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
" a5 W; U! L5 B6 I+ X( @/ P3 L3 A5 W
- R* z- H0 K7 {1 a% b/ M mcasp->regs->XSTAT = 0x0000ffff; 8 w! H- ]4 t# E) j4 l1 N3 `+ N# {
mcasp->regs->RSTAT = 0x0000ffff; # k. ^, D6 n9 ^% Y$ K+ y
8 {, D! M% A4 b7 p
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
8 d9 _3 |# A" c+ O2 f; k7 V; k1 p while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );( N* t# D' W+ s/ j" r
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; & J, f3 }0 ?) F, z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
3 i c$ N. v$ N; A5 S- m# g* ]- ?0 @) S* o
/* Write a 0, so that no underrun occurs after releasing the state machine */' `) J% c) P7 o n
mcasp->regs->XBUF5 = 0;
, m! a i7 L e" f2 \3 H. L# ~5 ] mcasp->regs->RBUF0 = 0;
; V0 ?" C I8 L( e% s8 a; W) j0 {; u
; V' }0 _" m% j# N+ e8 b mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ) W4 z% |7 R+ p3 N0 R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );5 h$ f( Z& a8 E
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; * N- z( W7 a& f
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
% ]; o* \% `$ E9 ~* h5 ^" @' z s7 {' g4 m) w$ s% j5 o2 @
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ' a$ ~5 v4 Y& x; x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );( Y/ T, g0 i0 g: t/ x1 w
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
7 E' r) c1 P6 ?+ q9 Z: h while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
, e3 n* J m4 l, V4 {. L$ x& A [2 e# N6 }- ^
CSR = 0x0000;
; m# ^# c/ G/ O; F INTC_INTMUX1 = 0x3d;
t- O; `) I+ E/ n. [ ISTP = (unsigned int)vectors;/ R* O8 I9 t# P5 I) y$ E6 b
ICR = 0xFFF0; 1 M7 e% s7 y4 b
IER |= 0x12;
& C$ P4 ^/ ^; E. R- U) k! o CSR |= 0x01;
4 W: t1 a6 b* T! x8 ?7 R2 V: z [2 _ O2 P0 b
. | e/ v* m V$ I3 V1 x
( }" N+ ]' H. w$ A
还有就是两个输入输出函数:; E; i$ i4 N, @* D3 A" r
void output_sample(Int32 out_data)
3 k( h% [4 w( j{5 a" ?4 X# r! q. `8 O: P
AIC31_data.uint = out_data;
- Q3 i- g, l/ D; u1 o H3 U& D MCASP1_XBUF5_32BIT = AIC31_data.uint;- }6 u) X5 I2 x- Q; n, q
}% H9 h! `7 H0 O! T1 n
( K* G; d# S2 V" ~' o
Int32 input_sample(void); H3 `5 o/ H6 i4 e- v* e8 D
{
" _6 K' T& J+ ?: w AIC31_data.uint = MCASP1_RBUF0_32BIT;3 D/ r; \# K8 t3 q8 l
return (AIC31_data.uint);
6 V! Y+ Z# z% j& s, o}) J6 J& G2 d, N7 h
9 ~6 ?( x; n& [ |
|