|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
1 q9 I5 m# U; T# d0 bmain文件:
" i% j* {7 h' U/ y# H. B7 v$ b+ zinterrupt void interrupt4(void) 4 {0 U0 m. m3 t- c' i
{9 Z3 y6 _2 h0 t, y' w! O
Uint32 sample;& c4 `5 o0 Z, }3 Y8 |+ v
" l( F/ ^ E& w* {, K ^8 ]
sample = input_sample(); // read L + R samples from ADC
$ M& P7 A+ n- H- L! a4 R output_sample(sample); // write L + R samples to DAC 5 r& W$ N6 ~: t( l, o
return;
3 l9 ], M L( e D}
! i: M3 x3 R$ l: f* E% i$ E" r, G; o+ u+ [9 r
int main( void )
4 C0 P5 h& z, X Q6 U$ f5 J{
9 L) l o. ?0 h
- P0 ~: ^6 r/ z! A$ _! i! ~, s2 K /* Initialize BSL */
' k$ |2 _9 v/ u! I2 _% V EVMC6747_init( );
. U8 `1 i4 [; [9 `5 F2 Z6 v" u /* Call evmc6747_intr function */) }/ X. f; d& S
aic3106_init( );+ @) O5 i9 J9 ~# y% [: ?
while(1);# } A3 f5 ^1 p- x4 S+ F
}" j/ C# i6 \% L* K7 {3 d
}' d2 E( [! ]1 _9 _* ?6 s- x6 W- b7 z9 q3 S
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题, x$ `1 V7 s: z1 [' r: ?7 z& \$ X
/* Initialize MCASP1 */
# j1 Q2 @/ @. L7 v$ W3 I& E" L mcasp = &MCASP_MODULE_1;
5 R/ j, R( Z- o) M mcasp->regs->GBLCTL = 0; // Reset
9 q% O7 n$ L6 O; U6 u( \8 L- \ mcasp->regs->RGBLCTL = 0; // Reset RX7 s4 a7 v! q8 K) k
mcasp->regs->XGBLCTL = 0; // Reset TX
, c% F; ^- n( z& V mcasp->regs->PWRDEMU = 1; // Free-running3 v8 y) G- \. v ~8 L
// configure McASP0 receive registers
0 i! Q0 P4 _2 Y V9 X& V3 S mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used" Q2 f [! [) D# T: Y
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus- L# @0 `- U0 s5 b+ m& _2 l5 }
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word( \3 }6 y) u8 o r
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side). b( o2 O/ x' ]% k0 A+ ~, W
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
9 @6 U6 U& O2 ^8 B mcasp->regs->RTDM = 0x00000003; // Slots 0,1( z7 E7 a3 J4 T4 {1 t% t9 N
mcasp->regs->RINTCTL = 0x00000000; // Not used
! |) c$ N+ Q1 z: R3 d) o4 Z' A4 I mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
" [" }- W* X7 e* Z
3 u2 b1 Y1 n& ]2 v7 F |$ | mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
( n& |* J5 m% T- t mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 I* T* p: U: p" y4 R mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word8 O% ~" Q7 J6 ?; U1 v/ w# T1 X
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
$ W+ X$ V0 V$ X R mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK& K2 r C& _3 ^: V. F
mcasp->regs->XTDM = 0x00000003; // Slots 0,14 j. {2 [) f9 }" \& t5 j _7 B X* C
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit/ A2 W4 Y7 B1 t$ A1 \: l
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 e( ?* |6 f" L( A( m9 A& }! O& ?4 ]1 |* _( ?/ X
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
7 r* W9 ?6 [& I0 ? mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
: q: q* A! M) }) [ mcasp->regs->PFUNC = 0; // All MCASPs9 Z$ x% m: q/ k7 K5 M$ S
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1 Q& F0 t! U) V) c' ]* l+ u% q- {
/ S( }9 O( C4 _! {# H' @
mcasp->regs->DITCTL = 0x00000000; // Not used
9 a& w6 D* e: b6 g8 G mcasp->regs->DLBCTL = 0x00000000; // Not used9 u1 w2 U3 l1 K9 p; H5 D
mcasp->regs->AMUTE = 0x00000000; // Not used
9 v: F+ O+ T3 N9 n* b/ f2 v4 Q3 R& \- O6 w& G# k/ {
/* Starting sections of the McASP*/
3 ^7 m( f4 e( L' \ mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ! ]$ L* a2 k# ~& k
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); : P7 r0 p# s) j8 X5 V& @
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 2 ]" J8 N7 e8 P. l9 H3 h% d& i
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
+ Z) I: x$ \9 l" {$ v$ `4 S/ X# ~, u. @& S
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; , G" q8 D1 {; g9 l! {$ ~. J1 I
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
3 p0 `4 Z' U- o+ r# r" l. } mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
5 h* M; _+ y N5 Z+ y- C while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );" ^1 L: L1 @% h. [/ |* S) ?
, _: ^1 S5 r1 n% G3 C$ n/ B% B6 v
mcasp->regs->XSTAT = 0x0000ffff; : P8 P% N/ ^3 R% C. `" a4 I, u
mcasp->regs->RSTAT = 0x0000ffff; " y/ X, K' D( J i! P
k5 C8 w6 A, t9 c( N6 ]2 s mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
6 n% Z1 ~$ P: W0 n while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );* D9 x% F' C! \) t& q3 ^ l3 }" q5 d
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ! y* ]# ?5 S) ~5 R; b
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );6 U- H; N7 i; w" }- w, G& z$ N! s
1 d/ M4 X- v6 n+ t% K5 Y, _
/* Write a 0, so that no underrun occurs after releasing the state machine */
+ M; q1 h" @1 p mcasp->regs->XBUF5 = 0;
4 l3 ]. x3 S. O: u2 o/ e mcasp->regs->RBUF0 = 0;3 m$ ?2 _6 {2 X1 F0 d/ Z# @% \; j6 m% ]8 G
( A F1 ^' E$ u mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 0 n8 K+ i P2 C$ q( p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
- C& l+ W% g! b% }& { V mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
4 U3 D( }+ _& _* I while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
0 f! m2 Z7 D: A$ N" l+ |/ A) y& ^2 q
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ( o8 Z+ \! I% d0 t, R [9 h
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
: F. l- {0 B3 M7 Z mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 9 z" q7 m( ?( v+ C" G {& F" Z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
7 C# H' p+ _# Q1 G# r. \- T! {# c {( l7 V
CSR = 0x0000;5 W# r6 ~7 J8 A0 v$ t0 Z
INTC_INTMUX1 = 0x3d;
( i9 X2 F! R! l ISTP = (unsigned int)vectors;
) T" R1 h$ O2 z$ V ICR = 0xFFF0; 8 r4 @' r# R" f' {1 t) I1 t
IER |= 0x12; ! \, O @6 i2 W7 i
CSR |= 0x01;
/ {6 z8 ]8 t9 u+ T6 f% E9 x5 n& c5 |
+ B. H/ x- b' J5 H& A: ]& `$ U& y. Q$ [" F
0 v* z) N% a/ b还有就是两个输入输出函数:& t; U r1 S- Z; D! C5 k( s8 x
void output_sample(Int32 out_data)5 G( J1 B. E5 d" E8 \9 F0 ~8 w8 d
{7 e2 x/ |" w7 I$ `5 z
AIC31_data.uint = out_data; 8 R( V$ C* |8 a
MCASP1_XBUF5_32BIT = AIC31_data.uint;. }( W: i* Q5 s( Q5 s7 ^% L
}. V' w. e7 {% E
8 l" i z9 B- C- T' {Int32 input_sample(void)! W' G9 n; V8 a* ^& e
{ * H0 i- I% c9 W& y! l& k
AIC31_data.uint = MCASP1_RBUF0_32BIT;
9 m& o, x$ C, O( j" _6 y return (AIC31_data.uint);
1 }) A$ w, |+ N7 K" r/ D- y. c S, X) p}
) ^1 r* B) Y" v: x6 K. {
. h+ H: ^# c+ y; ` c |
|