|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:$ N+ o2 x2 ]( p/ I6 Z
main文件:$ B( \( L4 t/ D8 V) e8 A* v0 I
interrupt void interrupt4(void)
. O8 p% o. g4 T: Y5 Z{
0 O* s& v- y1 n. y Uint32 sample;5 U' p9 N: e9 I3 A G; _/ H
: m8 m3 H& `' E# p# H9 ]; e/ f sample = input_sample(); // read L + R samples from ADC
: G2 F( f6 ]$ y output_sample(sample); // write L + R samples to DAC ! i4 e6 z' v' X( E/ k* o4 r+ T
return;% y2 _! j! _ H e6 S( H& r) D
}
, K! S8 x" }6 ?+ F+ }
, p2 d0 i0 x4 X, xint main( void )
( U- k& C9 t$ ]! `7 w3 b$ R: b# A{
8 V4 u* z8 A6 M/ A6 ~( H" D( E1 O7 X) G. \4 t, t* N- L) p# ~2 C
/* Initialize BSL */2 R9 x( \/ E. P+ B1 F& v4 i2 {
EVMC6747_init( );; j" i% }% ^/ O5 g4 n: P2 h" _
/* Call evmc6747_intr function */4 z+ O! @% x. n5 u& ?! [/ B& h# M
aic3106_init( );% r$ x/ S0 `1 n7 r
while(1);
+ l8 F- J7 V$ X! A0 X8 i0 C3 q}- U; a( U/ J& ]
& A% N; X2 x6 S* S% l- A
; q0 }' I* i2 ]aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
% y9 B; T/ C9 e/* Initialize MCASP1 */1 t! B4 _& D! o' |- S6 M* _
mcasp = &MCASP_MODULE_1;% Y' @9 @" _ y( J) Q$ s3 R
mcasp->regs->GBLCTL = 0; // Reset
4 v1 y, z* G$ z. _ mcasp->regs->RGBLCTL = 0; // Reset RX3 M' _9 F% ^6 L. y% K" V) F
mcasp->regs->XGBLCTL = 0; // Reset TX
, l5 ]& W3 F! n9 Y0 W) t9 ?) V2 F ? mcasp->regs->PWRDEMU = 1; // Free-running
9 w/ H7 a: L1 d$ t) S0 n+ ]+ X // configure McASP0 receive registers; E$ t& {9 C+ P) z1 @+ r- F" p
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
: D. t- V2 O, k( g" w: }- { mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 H$ q8 t. b- t5 i$ }) ^% I mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word) ? K+ n$ V+ E. }$ B2 b; S6 d
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
7 r: K- s' V6 ^+ e: [ mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
$ a- v' {* ^& Q* u: h6 Q mcasp->regs->RTDM = 0x00000003; // Slots 0,1. M4 ]6 G4 l4 g% p1 ~
mcasp->regs->RINTCTL = 0x00000000; // Not used* V3 l, p1 u4 a7 ~
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256; X4 ^: x1 B, u# f, |6 P
" m! ~* ]7 G0 }8 y8 y mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used2 M0 D3 k$ u' `3 X! z0 k
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus- t, O* j, t5 T
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
' t |4 D5 A- s2 H5 P mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16( Y0 ~6 r% R$ G7 i& @& ^0 M
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK# v: d7 b4 x! L# V d, I
mcasp->regs->XTDM = 0x00000003; // Slots 0,16 j2 x' u! H- r" F8 d
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
1 \0 F! i: g2 A" M4 e( _ mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256; k# i5 [, y3 n
2 m) w0 W8 e5 i" T mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
- W& S5 `7 j! J* u& \: n, @ mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
5 f ?' y' ]9 m7 k/ p. [ mcasp->regs->PFUNC = 0; // All MCASPs7 T! s$ ?* M# k* r
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1; A& i% {% c; h+ X
7 @# _2 m- f, k% ~( U$ W mcasp->regs->DITCTL = 0x00000000; // Not used
; ` d4 n9 a& i- r. a mcasp->regs->DLBCTL = 0x00000000; // Not used2 g' w3 y" ^7 _: ~8 M
mcasp->regs->AMUTE = 0x00000000; // Not used
9 q. d1 w9 {% y8 u: g8 q( a
: J' b0 L7 `9 `' v8 n( z8 z8 D/* Starting sections of the McASP*/) z1 n% r* H) I* R( \+ u9 ^
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
, _7 ]3 H4 v7 J* t! C5 b while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
9 j7 v7 R4 O, I mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
, U# u$ ~5 o7 w3 U5 D while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );8 n* g9 W2 n( _9 q
3 k& `0 x) p# y) X; u mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
) e' h' Y# A6 l8 L5 Z6 \ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
2 j2 I6 R) B; `# R3 Z B mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 7 V. o+ J' l% j5 H. V; V
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
+ C; ~) U, T! K8 N7 Z" a5 {) ?8 x7 l& o [
mcasp->regs->XSTAT = 0x0000ffff; 9 h+ B+ Z# j0 Y+ K) A& a
mcasp->regs->RSTAT = 0x0000ffff;
1 e2 T2 o% c% `5 I6 G- T0 C5 C9 O5 o) b' a+ {
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;. I5 W/ I$ J2 |6 R# [2 ^
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
! x# D0 Z7 J# D. I mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; " M$ h+ l9 o. C/ B& A' U) B* V1 S
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
& g# P6 k: U* j; i b3 b/ l+ |) L! T% G; V5 t+ k3 U! B
/* Write a 0, so that no underrun occurs after releasing the state machine */8 i ^# X; M, Q
mcasp->regs->XBUF5 = 0;
( H8 |7 @1 t% U- c: a n mcasp->regs->RBUF0 = 0;
2 y- {; N0 f' ]% e
! v. b! X. h/ x mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
! ^" |9 l2 E/ W, m' j7 U: Z while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );4 q- I+ o; |$ _+ j, K3 }7 [" {
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 5 B- }" S* j6 @. p
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
( A" j$ O' c9 p; x, u D) z4 A
9 B. s: @4 u. b* e mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
n5 W' m) @8 @) y while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
0 p4 i8 ?- H. j* n2 m7 s mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
5 A1 A# t! c& {7 p. l* K while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );6 K; U: k$ c7 @8 d: @! }5 C
0 J/ w( N w8 ]1 c3 ]: @3 ]( J# A CSR = 0x0000;7 Q/ d5 y& l, h. E7 l
INTC_INTMUX1 = 0x3d;
3 |# f$ ^+ B5 Y/ q/ H9 Z, Q ISTP = (unsigned int)vectors;. a* l( A7 O& Z, F+ B
ICR = 0xFFF0; 3 S) t1 g' m: W; @2 w
IER |= 0x12;
* M+ R2 O0 z, P0 j6 b5 A CSR |= 0x01;
/ {/ i5 r4 X. C, D- w5 a# m' S9 S+ o: t. C- N! N, Y; F
( J8 w7 r2 N5 N! Z$ x, ?
5 z6 p8 x; u$ X9 d还有就是两个输入输出函数:
' H' f9 S1 B1 v6 v2 G0 G9 {# a7 Fvoid output_sample(Int32 out_data)% _8 [/ E& O* A5 J5 } I% i
{- e0 V0 }4 z9 `" f- b2 Y. p, x% O
AIC31_data.uint = out_data; / a; w- L3 \5 ^0 x- Z4 M/ J
MCASP1_XBUF5_32BIT = AIC31_data.uint;
' l( T7 U2 z& O}
$ J0 M, I2 N7 ?. {9 R
$ a- X$ G! F+ ^2 e% LInt32 input_sample(void)
& |( G0 e+ F0 X( e# q- b. R{
1 \; }7 S [9 T C1 N2 }. P2 t [ AIC31_data.uint = MCASP1_RBUF0_32BIT;
. B; u; o2 z% J1 M return (AIC31_data.uint);
: n0 {( S/ B- h}
! W+ ^4 N8 o2 n! w& ~8 i9 w5 x. K4 Q5 t* o) l
|
|