|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:0 i# Q, M3 o% m5 ]# y6 j
main文件:
7 R! f3 @/ P: t7 M# d- Jinterrupt void interrupt4(void) 1 @* {1 Z2 o0 H# y$ U5 ?/ @) q3 i% h
{9 Q5 X% s- H9 k7 A( e
Uint32 sample;9 M* |0 z# M0 P/ f
. U( l- E D7 N/ e( I, Z
sample = input_sample(); // read L + R samples from ADC
9 v, l7 b o% q. Z/ e output_sample(sample); // write L + R samples to DAC
T; X2 _ n$ u/ h return;
# K5 U3 y$ _) R0 t}) P( C3 S0 G% @% h5 u( [0 P9 u& r
# |6 E9 x6 G. Q* V0 O. kint main( void )3 R# I7 B* ^ j
{
7 b6 }( s; V9 i4 r, [$ {) F+ R8 e* E$ U- W
/* Initialize BSL */5 Y- _; x0 S% f0 O
EVMC6747_init( );
! k! _4 j; k- U1 C4 F# }1 y% H3 a /* Call evmc6747_intr function */* i4 u0 S- o2 ^8 ~9 O0 z! G
aic3106_init( );
( r( g( a7 m! K/ E while(1);
( C O# F/ e; ^; Y: N s2 l* d7 T}4 z* K3 t; ^) s9 \, l5 x l9 p4 ~
! H/ q; u$ G3 q% |9 F% D f# g5 q8 u
; j! {/ O4 H$ x+ O1 haic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
! b5 w2 P8 C) @# S% y# v/* Initialize MCASP1 */
8 R( U, Y5 K6 X8 V' v' a mcasp = &MCASP_MODULE_1;
6 E5 c( C b0 E6 U! p( g6 q mcasp->regs->GBLCTL = 0; // Reset
+ F( v) o& C3 b) J( C o! g3 a mcasp->regs->RGBLCTL = 0; // Reset RX0 F4 z! o$ d- O% Q1 K
mcasp->regs->XGBLCTL = 0; // Reset TX
* r6 u: O5 | f0 @% m mcasp->regs->PWRDEMU = 1; // Free-running
8 Z! x/ j: Z1 e/ h( B8 I6 c1 J4 | // configure McASP0 receive registers6 A6 F- y$ `8 ~" u
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
+ e- `- ?, B i, G4 ]$ G. u7 d mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 M% }' c Z, t: y- H mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word! e; E; b1 }$ p6 z# k
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)8 w7 f0 K% z7 m1 ?
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side); i; d* C/ ^) B% S1 N/ x+ Y Q
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
: X7 S6 \0 _2 t- P8 J( a2 P* R mcasp->regs->RINTCTL = 0x00000000; // Not used; P% \: ?5 h1 X, o# y( f `
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 x7 h/ y% i$ o' n: j% C
+ i$ _% |7 P! j; m mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used* Y |6 `' \0 e: l
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus* o; {/ F* Q# N* t, X
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
+ o8 Q, ?. p9 C$ X$ @. N mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
, M8 S0 @+ h( z. ^; n mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK( t3 [: H) z8 \: y7 U
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
* ]. i" i. i# A% h mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit7 d8 ^% _# W( A) ]/ I/ u4 f
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256# o7 |. i5 Z% i7 V% S
- A% [! \+ R" g# O! C mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
: @- y/ g. M% e1 M* v mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT( c" |* h! K3 p" T) k
mcasp->regs->PFUNC = 0; // All MCASPs
# K: i% ]; Z* ]3 n& ?6 ` I3 T mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
1 L' r1 y4 p+ b, E
; ]3 h( U! Y+ d mcasp->regs->DITCTL = 0x00000000; // Not used
" z P6 T! N. _6 p mcasp->regs->DLBCTL = 0x00000000; // Not used
/ p) u; E8 h9 c' n mcasp->regs->AMUTE = 0x00000000; // Not used1 ?9 X, K3 R2 t, o; X+ A4 |
: F4 d9 V+ ~6 T$ H) d" |
/* Starting sections of the McASP*/5 X1 o9 p$ ?' D( c0 G
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
# Y/ N: k4 ?: C- ] while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
3 {. C, n/ Y* M& K) Z& O4 Z( X mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 9 e4 ]2 |8 R6 L4 y: L% Q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );" O$ l/ x( F1 a. T4 a
) q, `3 ]% W, S* W" ?# K/ a* q
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ; y! n; z5 O; D
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
: P& {* T; o3 u' S. h mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
3 g& O. {% L; S$ T7 n while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );0 O( k/ G9 e0 a, X* V$ W8 n
2 v2 u7 \$ `. |- I9 K mcasp->regs->XSTAT = 0x0000ffff;
5 g, c5 M* m/ Q. ^ mcasp->regs->RSTAT = 0x0000ffff;
& ` P& T0 H/ _$ c) B7 v) Y: R1 o. a! F% k3 J& V8 _" f* j
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;/ O) o" S7 J0 Z" e. _
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );7 ]3 q, l* \4 J# E9 N
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 1 g8 @8 q# U4 N; }8 ]' p8 Z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
, N$ X1 O1 x$ C9 G& |6 K
$ V$ T# k0 F% D# ^0 p* Z) Q /* Write a 0, so that no underrun occurs after releasing the state machine */: W! ]9 ]6 J. T" n$ M" I) J
mcasp->regs->XBUF5 = 0;
% {2 n, [' m" {- K% ~0 }# O) V mcasp->regs->RBUF0 = 0;
/ B* J. o8 e- D, w$ k5 Y
) W) `8 o7 R( N: x( Q2 F2 ]- ` mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
# r9 E4 a) W$ p5 ^* u$ h" N k8 G; O while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );2 T4 b- z; K2 A9 T* i* T
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 3 Y) [$ s6 V0 n" X- S# g9 c
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
( V5 Z$ u- c' z; f1 ]4 O2 V6 u1 _! U7 p: j6 t
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; & ?" i, q( Q! m x/ O9 k
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
! m: I0 Q3 [9 H4 D2 w* n mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
# d; e& ~2 A: S6 j while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
' a+ n+ ^8 z, e' D' a+ ~* [& F/ H6 o: _, `# U0 o$ c. k
CSR = 0x0000;
- V8 C$ [& O2 w# i. @1 O* X INTC_INTMUX1 = 0x3d;9 T# F/ \. h& Q6 \ Z( ^
ISTP = (unsigned int)vectors;( b& A7 D! a% k) X
ICR = 0xFFF0;
- U# N! ]1 w7 H$ h IER |= 0x12;
) X: V: m! u8 a# c( q0 p/ a- e CSR |= 0x01;
2 E, g. o4 A* ~& i. o$ Y ]: a! h" T* }
0 g: O$ G1 O" y7 j, Y, J; H4 k1 L% s# M
j- f0 @: W. Y7 F( h; P g还有就是两个输入输出函数:
2 t' E& x( Y6 a' N9 z- w- I: z) B5 wvoid output_sample(Int32 out_data)
; q8 ~+ d( X& A{
5 Y- W9 a7 S& z0 A AIC31_data.uint = out_data;
3 R( z" L6 S& Y: m" c MCASP1_XBUF5_32BIT = AIC31_data.uint;
( U* R8 r' e. v+ t u" ]}
" y1 o' ~4 G& D3 K4 B& V6 c% u. C$ d2 K* ?$ }5 `
Int32 input_sample(void) P. Q4 Q2 M O! A* C. m% s
{
. _7 Q/ A* B: c0 H5 X AIC31_data.uint = MCASP1_RBUF0_32BIT;
$ | w- p+ f- y2 @4 d1 ` return (AIC31_data.uint);/ o% k: F ]2 f/ B( W" f* r P6 o* ?1 I
}9 `$ S7 p0 P% _/ \' A
- L1 v3 K7 Y7 \# [4 } |
|