|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
$ a" B, o) z$ c( F) b) N$ A2 omain文件:+ g3 P7 u1 l) O/ Y1 E1 z
interrupt void interrupt4(void) . A" A( d0 r ~4 e! y6 }# L$ f" S
{
, v, V: ^( W5 s Uint32 sample;
, u2 K( E, E3 |- ?: M' z) l* h C# Z" V$ m
sample = input_sample(); // read L + R samples from ADC
* K. T% v0 Z& R% C. ^ output_sample(sample); // write L + R samples to DAC - J7 J- }2 }" N
return;3 W8 i" X: z" @: C0 U; Y
}
$ o$ A6 _5 }" F; ~2 T2 i" C2 j% t7 E( U3 F) r' ^; q# l1 z
int main( void )
5 ? x5 X- d9 K2 k7 D{
, Q+ ]- N/ n1 [4 g% c$ K9 f- b$ |$ D) E$ f
/* Initialize BSL */ |" B0 U# Z/ `' [8 w
EVMC6747_init( );
, C4 R8 ]) H/ M# c /* Call evmc6747_intr function */
9 S' o+ _# |# i8 ` aic3106_init( );- h! Y9 X1 S4 d2 X0 d
while(1);3 Z% [2 E; K0 G2 o& j
}4 X; O) j6 F/ S% {
5 u* M, t' U2 d
' N# a* _ t* m$ @: ~aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题, S7 G% d* O( i+ x# o
/* Initialize MCASP1 */
6 A( g# P" L' [ mcasp = &MCASP_MODULE_1;" B% u2 @- p! S# E/ O( W
mcasp->regs->GBLCTL = 0; // Reset
8 ~# S% i( V- p2 ]7 P: j: c mcasp->regs->RGBLCTL = 0; // Reset RX" K1 I6 I& B) W \9 M* h6 k% T1 M5 a
mcasp->regs->XGBLCTL = 0; // Reset TX" G; m: L; k r, ]+ T+ X
mcasp->regs->PWRDEMU = 1; // Free-running
2 W- ^! L" e% o" Q+ v // configure McASP0 receive registers
/ T5 P2 x ?' w! q) d mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used5 T$ o# L$ d7 ?! T& W5 r% v( H
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
, M1 H7 `% u4 f4 }; h1 {' d0 A- a mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word$ j1 h5 `9 k0 z9 |/ }
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
+ z7 b& m3 z& z8 m' R8 i mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
" s8 r( f1 g' r mcasp->regs->RTDM = 0x00000003; // Slots 0,1. C. E/ m1 }% s/ S% P
mcasp->regs->RINTCTL = 0x00000000; // Not used; |0 N% u; q( Z) a) Z, t1 \
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
0 U7 j0 E$ {6 O2 |/ ]& H0 t% |/ R9 B, w7 u
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
5 o! A: h5 s5 z( c7 Q9 F$ ~ mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus5 D( v% j ?* L7 T
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
4 p! i" s+ a, y+ j mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16& t# A* Y5 K( ]/ e* Y: }
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK( [* K- r& S. Q, T2 k4 S) M
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
4 r- t' _) J ] d mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit" g% M3 D# m7 F W$ g; ?
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256) t( i1 H. v" w/ l6 f1 j4 j
. e8 ?8 l8 C+ J- H
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
5 S- ?& z. z2 F( m- X u; X9 o mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
6 r* E( T2 s$ n3 o4 _5 U* q mcasp->regs->PFUNC = 0; // All MCASPs0 |6 o7 a5 p8 Y7 P% }& i
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
, m/ f' k6 ?, a; e2 i' K
( C/ o( p$ q3 D2 ~6 C mcasp->regs->DITCTL = 0x00000000; // Not used
: Z6 D# m: S- u/ C8 d mcasp->regs->DLBCTL = 0x00000000; // Not used9 q3 ~/ @0 n0 g; }3 U$ p+ x5 G
mcasp->regs->AMUTE = 0x00000000; // Not used9 ?$ C- `) z: q
, s1 b7 q7 p& \; _/ [2 z' B/* Starting sections of the McASP*/
, _) a9 U9 ]8 ]. Z1 _ { mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
$ h3 |- A; T. P" [4 X while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
2 q% Q( g L1 k7 N8 M" A mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
7 V+ d# Q/ t5 f! `/ O5 y while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
f/ E' d0 V. x2 W
: Z- u& M4 [# C+ A mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
! q5 b3 o( w( K3 X while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
3 S" {4 _3 [/ t( ] r mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
$ n+ d+ A( F5 P$ J6 `7 z while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
! v$ R4 [3 [& f( u5 S. b3 @& y0 n% b
$ c* i5 @5 W) v( @ mcasp->regs->XSTAT = 0x0000ffff;
1 a' J" u& G% V6 {% i/ r mcasp->regs->RSTAT = 0x0000ffff; 5 p% F% X Y: j, z0 Q6 c
# c4 W1 b! Y' e; I2 e& o mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
+ q9 Y m1 q4 w9 i* t% m while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );% n* K6 l* s/ `3 \7 k: O
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; |2 X& k6 P7 F
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );, d0 ]$ Y Y% _3 n a# m
# L; ]" R. }! _- |0 Y" ]
/* Write a 0, so that no underrun occurs after releasing the state machine */
# u g' m: T2 B2 D. p( h( E. H. J mcasp->regs->XBUF5 = 0;
' e1 `/ [' [5 ]/ v mcasp->regs->RBUF0 = 0;8 h1 k$ Y5 Y, a% z; o' ^& ^
) `3 x, L3 ^# `4 N$ V
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; x% h, u; ]% M8 O, F
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
+ ]8 E/ V6 b6 q7 H+ u- P: i mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 0 X: {, `! }) e: r2 Q+ y6 w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );" V9 @& h8 [* o5 c( _
" n/ w1 l+ K, o" w" z8 U mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; / C' ^/ g" T; r4 X
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
. _6 v& p. j$ P* T' V0 ?" h. ? mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
8 O! M% J0 e+ l _0 _ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
$ \! W) { u6 [: W6 B. w
0 U7 @. A1 n" I0 J8 X5 a" y CSR = 0x0000;
` j! b, p6 K) a4 t' {. ? INTC_INTMUX1 = 0x3d;
: E5 g) D6 T( i3 E2 U: J k) R ISTP = (unsigned int)vectors;
0 |9 A" ]# F+ x2 s4 I; s ICR = 0xFFF0;
$ | S; G) T7 q! C2 d. t IER |= 0x12;
. L7 u. P8 ?- D2 n CSR |= 0x01;
0 v1 r6 ?, I1 J4 i
9 ^$ a( k' T+ K* W8 O j3 m9 Q# |, l. w. u1 _2 z- _0 W
0 Z& r$ Z9 L! |! {+ V( j
还有就是两个输入输出函数:
$ J+ Y. c# ~2 Ovoid output_sample(Int32 out_data)
J0 o6 u- E. m7 M5 k/ F7 Z, z1 f{2 s Y0 M( m+ @* i, v
AIC31_data.uint = out_data;
3 @* ?- L) Y9 `0 e+ `+ o2 N MCASP1_XBUF5_32BIT = AIC31_data.uint;
& @! H& f$ N; ]- s# Y5 P4 t+ w}% V! `& q8 U% N) i' k
8 q* k2 J# [! ~ n D2 T' ~' _2 xInt32 input_sample(void)1 {* N; B6 ^0 y3 o% c4 k! {) B
{ ( u+ A) y* y5 {2 w8 u0 m- M# B
AIC31_data.uint = MCASP1_RBUF0_32BIT;' j1 Y! G$ P. K
return (AIC31_data.uint);
* q: i- c4 `8 w% O$ ~}! K* ~5 J% l& c7 D6 f, y5 r, I
' l! U: u+ A; V$ j
|
|