|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
5 q2 e5 `; Q2 t* Kmain文件:
- a! i" {* G9 l' H+ Rinterrupt void interrupt4(void)
$ p: H9 b& { ]% H{
2 N1 d! ^' G! u2 }$ w Uint32 sample;/ s1 E7 k/ ?; M% i3 l
& |* g: ?, w. t4 |6 m5 U! ^' ^
sample = input_sample(); // read L + R samples from ADC* A* X4 D1 S$ t x
output_sample(sample); // write L + R samples to DAC 8 R \9 M: I0 S! P' I' ^4 \
return; E$ W6 m l& \1 v$ ]5 x
}& [# d/ V" X2 K9 C- v- q' u1 A
1 B% X, o q( v- j* u
int main( void )
% H9 \( Y, P$ h9 K2 Q# H) x5 z{" [! l2 j* j! J6 d/ Q6 p+ O
: U7 e$ Y+ @* d1 R8 x
/* Initialize BSL */4 m u% x0 c, Z
EVMC6747_init( );" v4 a1 W) \- U! @
/* Call evmc6747_intr function */
* L. i2 Q) ~% N- |- P# e, ^ aic3106_init( );
, w2 c' h$ Q' u while(1);6 _7 ~- q( K# s# ]& y
}3 j3 q9 x5 t1 y6 [
! M4 _0 d9 f4 o; x9 E
! [+ m7 H" ?, X1 Y
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题: d2 y8 J$ l+ K- o8 }
/* Initialize MCASP1 */6 a! v4 b2 l+ k
mcasp = &MCASP_MODULE_1;3 W! A$ ~# x. Q2 |; n3 I3 v
mcasp->regs->GBLCTL = 0; // Reset6 X1 g, z4 q7 l& L \( x
mcasp->regs->RGBLCTL = 0; // Reset RX% q3 ]. Z5 d$ t
mcasp->regs->XGBLCTL = 0; // Reset TX
& z* U" O( P! h4 \$ F5 x mcasp->regs->PWRDEMU = 1; // Free-running& p# n/ V4 n; T6 { u' H
// configure McASP0 receive registers
3 r& W3 L5 {% R4 r0 F" f mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
' C* `$ f! F' A& r9 q9 h) L- E mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 u- h5 ~% i9 U4 z$ e2 w/ k' Z mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
9 ]! M1 o0 V4 e4 E0 B9 Y mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)8 K8 d$ M3 e! g8 A3 t
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side), L6 b* y' Q# r1 m G0 M( Z/ [; ]) n
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
& B+ M$ g4 n+ H" f' c9 v mcasp->regs->RINTCTL = 0x00000000; // Not used, l- j8 D' |5 w0 [9 P Q/ y& I
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 X) b0 h7 [! V/ H3 @
+ ^9 O6 w# x9 r% u+ E1 W mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used- }) j! V }( A) m
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus& ^( ?) O" O1 r2 a
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
, g+ I! i( Q& k) c mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
7 f2 E: P/ v4 `7 N. o" n mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
3 G, r6 o7 ~; j, ~) f mcasp->regs->XTDM = 0x00000003; // Slots 0,1
2 E$ [# |: L" U6 L" F( g( y mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit! d ?8 L B! _) R j4 Z
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256& s: W1 C/ N+ V* R0 @
2 E& x" R& d0 X2 v2 I j5 ]
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN) U1 T3 k7 E7 a" t: j+ P% a ~4 q0 p
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT2 e- [4 r3 U# }4 X4 k0 {
mcasp->regs->PFUNC = 0; // All MCASPs
# W- m& E/ T4 j" K( C mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
' p& S% r7 O' H& n
! [- _, V* F2 o. P mcasp->regs->DITCTL = 0x00000000; // Not used
- @1 t2 L% t9 l- W mcasp->regs->DLBCTL = 0x00000000; // Not used- r! a/ p# J4 Q6 `9 e
mcasp->regs->AMUTE = 0x00000000; // Not used
( D1 A S. z S9 l4 e4 y
l( J7 A; b/ I; c/* Starting sections of the McASP*/
2 w* B& j* I: `5 y mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
7 I3 _) p+ J* i0 J5 d7 I while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
: C. ]. s, |, o: D. X2 } mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ' g+ L( v: @" c& ^% q# `5 w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );) K8 s4 F( w6 ?" s4 A! L
& b' w8 O0 M, n
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
+ s; y$ S& ^; `4 ]4 C" R while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
* U% X. x* t+ _9 g, e mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
- j$ t a1 V! _ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
4 M# Q$ B+ `! T9 ?. t! f! e% @& ] t3 ^( Y5 o9 v
mcasp->regs->XSTAT = 0x0000ffff;
; c/ Z' g, Z! J. d, T' A mcasp->regs->RSTAT = 0x0000ffff;
0 b8 U( R8 O7 Q2 I! T) ]- ?% W+ c5 Y
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;) c. }- F! r H0 J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );) F) S1 A8 J# S, h
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
4 |1 I5 h, a$ E- N" n while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
- b0 B5 [0 K8 ?5 K o9 y; V; S0 j+ Y
/* Write a 0, so that no underrun occurs after releasing the state machine */* b$ i6 S% {* Z- O3 f9 r
mcasp->regs->XBUF5 = 0;
& ^# S E0 j/ k mcasp->regs->RBUF0 = 0;- Q1 W" ^1 X, u1 V/ l' }
; e( G, g% ?5 _- [6 i% x mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 8 G1 X: z7 a6 ~* S$ {7 I
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );- d8 U& y, M+ c F; A1 g3 ~5 _
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
l( m' Y6 r" Z' B: @# d* v# e while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );. U2 b$ `/ l8 \
2 ?1 N9 @6 j% h% R# d
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
# \3 d( @. z' O! G% N3 F while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
" Y; |5 X( b( {9 ^ mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
& Q6 J$ N+ k% M7 h4 }. g: M4 o+ Q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
3 p4 B0 o6 Z, `# {- d9 K6 K9 i( E0 a5 O' p0 N& ?& }
CSR = 0x0000;: y$ L# e' y. ^4 k# S
INTC_INTMUX1 = 0x3d;
1 c. Y; O( F* [! v* _ ISTP = (unsigned int)vectors;. q! f+ s* h& m/ r Y0 G
ICR = 0xFFF0;
% N9 j/ Y2 f }9 Z2 ^2 Q5 ~! C" c IER |= 0x12;
) R* \2 }- X7 Q: w* C CSR |= 0x01;
/ K& @6 L) b( w! p" o% j( K; f& u, J5 m+ c) {8 k; d
9 B( k" F' R9 ` d: Q6 R# z- x
/ w& ?6 M* f. U' u. ?9 {/ N: \
还有就是两个输入输出函数:
% X4 R7 ?! A4 M3 k# Gvoid output_sample(Int32 out_data)
! }1 J/ \" d; v, S{
* n% F1 g. I" k5 N8 Y- y0 M AIC31_data.uint = out_data; . j8 m6 g. O8 Q+ N7 ]+ j' ?
MCASP1_XBUF5_32BIT = AIC31_data.uint;
2 A# I- k p+ o# Y}2 {0 e- K; o1 [5 ?5 w
1 l ]$ P2 o# R) I
Int32 input_sample(void)
6 X) w% D3 I7 L+ o0 D2 f( u" G2 |{
+ ?/ z% l; Y j/ z4 h; e9 ` AIC31_data.uint = MCASP1_RBUF0_32BIT;
: x6 A G0 }8 c( E9 { return (AIC31_data.uint);* z% e+ [0 h, p/ w
}
( y/ f3 K5 o8 Z; J0 r; S% V: F
% O" m4 Q0 o, S7 @# C |
|