|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:3 i1 W: e( F0 B# |3 j4 f
main文件:
; d, I* ~% k% y% U5 ?interrupt void interrupt4(void)
8 `& m* {7 E1 X, S{
/ r) O4 |; d, Z$ i! m' H4 T Uint32 sample;# I# @, Y7 [+ @4 X9 O7 E* L
7 M( B& i0 S# J0 E
sample = input_sample(); // read L + R samples from ADC
* H+ ?# D& s D0 ^" J output_sample(sample); // write L + R samples to DAC $ W1 S, Y6 O; D* ?% `" j
return;* q+ @+ h/ Y) v) G
}
5 b- e" P" G4 y6 Z! O/ ]" y- ^! U* x
# C+ S( {; h! m& a4 t" n& W# Rint main( void )& J' }8 H& ^- I3 G. W
{
2 Y6 ?4 ~" s( w0 \* o9 X5 D) I' b3 p: L( R1 y! E" m
/* Initialize BSL */+ D m; U% J. Z& r
EVMC6747_init( );% m2 E/ y, _; i5 Z$ ]
/* Call evmc6747_intr function */* y* }" p( ^5 f6 r" y2 l$ y
aic3106_init( );
# |3 f3 N2 N9 p8 l( V" h) _0 X% \; y, v while(1);* v2 B: M5 `8 B q- B( a, s5 E' R
}! l9 a( A9 J1 T* m1 b7 m; E( w6 f
$ p7 V* b, i) E2 U, A
" f, @2 n/ j' `aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题- j8 ~( S! I; R3 T7 s. K2 w
/* Initialize MCASP1 */8 h7 m! ~$ l9 N; f) [
mcasp = &MCASP_MODULE_1;8 t( z( o2 e8 ?, }5 i0 Z
mcasp->regs->GBLCTL = 0; // Reset$ s0 O+ U7 p- P s- w; C2 x
mcasp->regs->RGBLCTL = 0; // Reset RX
5 y i9 @0 h8 _0 F: u4 x mcasp->regs->XGBLCTL = 0; // Reset TX
! _+ W- ^* E) N" y) h; T& J* e mcasp->regs->PWRDEMU = 1; // Free-running( O `6 p" v: v2 z) {
// configure McASP0 receive registers
8 e$ h0 O" {$ z6 `: y1 u mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used& q' G& y$ ^1 k9 M9 `$ c8 o
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus X8 m; L- g# h7 \) v
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
. { {* \3 A. @2 w+ n+ e( A8 e mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
$ Y h9 H! f' j0 w I$ z& Z mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)" s: L2 i- U% Q$ U7 a4 z
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
. ^6 N/ b: t* h' z: s' f mcasp->regs->RINTCTL = 0x00000000; // Not used
4 H' }# i) q! O mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
& J! E( R8 C, U8 Z2 k& \# N6 H+ q1 i* Y( B0 b3 a* {9 g( r4 c2 F. W
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used3 Z& r+ |( j# |' e8 y: k0 L( u
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 E' K1 T/ p+ } mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word+ K4 l) Q+ }! S: y. x
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-165 Q- k% D, E& p$ }% v/ E5 f
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK! r5 t# I+ D# @* h4 g" ]0 G' G* Z- r
mcasp->regs->XTDM = 0x00000003; // Slots 0,16 g% i6 s- _2 ?
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit8 W( v. X0 I1 q: b5 h5 H
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256. G0 N1 H. Q+ O: e9 B
' v% Z! l7 f+ r# g: C
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
6 z( U$ ?7 r3 X A, V mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT! w: `- |5 q0 }8 M: m! o0 D+ K1 r8 p3 z
mcasp->regs->PFUNC = 0; // All MCASPs- |) j9 w, T% O4 q) w7 G
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX16 \1 u9 ], z3 b* i$ b
R! F* E6 M8 K2 Z; ^
mcasp->regs->DITCTL = 0x00000000; // Not used
* k9 o# a: u/ h) Y: ]; G- S3 U" Q mcasp->regs->DLBCTL = 0x00000000; // Not used; `% L! V4 G7 |" V
mcasp->regs->AMUTE = 0x00000000; // Not used. s; S* I+ _2 |: c$ x* _: b$ X
! r1 u: ~0 F2 q5 r/* Starting sections of the McASP*/5 [ O6 s8 b7 e
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 6 Y, r1 C7 @) z- N. m! o! z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
$ P* ^5 x+ q( a mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ) d; c4 A y7 \" j! s' ]
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
}9 C5 h$ J: ^1 R* g9 V8 w, I% k% H e- k
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; $ s. N5 |/ a' f/ V) {7 @
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
% i6 Z' _9 W) S4 `& j# X mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; % y( y' ^) F" I, N/ d4 z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );' ?3 L1 V! o3 E, ]* z
" X. X' W6 e. Y% k2 o
mcasp->regs->XSTAT = 0x0000ffff;
' l+ N& J' K! i8 q( Z( Z mcasp->regs->RSTAT = 0x0000ffff; " D; d) l- }/ H3 l" O
/ d3 R8 l: M6 o' g mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
" n' L* e$ S7 ]; p& g while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );+ D- r- o; Z& e }, C8 B2 _
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
O. j* [8 W, ^ y; b+ _) | while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
" g( i4 e, ^! K0 `9 a& t$ f" m( o$ N) t
/* Write a 0, so that no underrun occurs after releasing the state machine */
# u0 Q3 U% {7 w* ~% M/ { mcasp->regs->XBUF5 = 0; @5 A1 f6 a. C5 S
mcasp->regs->RBUF0 = 0;' R$ T0 ]' V T# E
- e1 M# f& O+ x2 f9 Z) J! i mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
6 X0 u2 V4 f1 P5 h* X! r! S while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );- }- ?2 ]' {6 L! I0 h
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; & n# @2 j1 l: h# o3 m9 O' E3 y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
+ N# I3 z v9 L- N; L4 I+ c, c) X7 R4 o
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 6 w9 T0 k0 F2 T8 ~0 h- F
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );, \6 z5 z: }. ]/ N
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ! W8 O$ L& B! B& g8 W/ N7 K& I& h4 A
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
5 Y! c% U. {0 ]7 F/ z4 T) a Y6 s2 J: S! @& |3 H
CSR = 0x0000;; B0 l; r% i+ W; h' D4 u: ~4 S+ }6 V
INTC_INTMUX1 = 0x3d;
& p6 @: J' d1 r ISTP = (unsigned int)vectors;
( V$ V1 [6 @' {" u, v ICR = 0xFFF0; 1 j+ _7 X, C& M" K }# x7 ^2 V( n( c7 u/ a
IER |= 0x12;
+ o7 a( r$ N2 _ CSR |= 0x01; ~( |* L$ S2 E5 A7 n4 D: w
9 p! Y& P [- p' o2 v V4 C
! U/ v: D3 r" ~$ j/ Q, k4 O) {+ p: B: w' V+ L2 H- J
还有就是两个输入输出函数:+ y# v. U" X, X) l
void output_sample(Int32 out_data)
8 l4 R* G% i9 x{3 f0 B8 }5 h) i3 F$ Y
AIC31_data.uint = out_data;
* p, h& E! X* K) d* S* a# s I1 g MCASP1_XBUF5_32BIT = AIC31_data.uint;* Q8 C5 \/ N; L" W3 `. p
}
0 z) ^# D! l" H" @/ b7 i, V8 y& b6 q5 G
Int32 input_sample(void)
" l6 E2 Q; O- I( G{
7 Y0 K0 V9 D; @( ^+ v8 ~& \. [ AIC31_data.uint = MCASP1_RBUF0_32BIT;
+ i! P2 \' R; L3 K return (AIC31_data.uint);* |3 O& L" Y; b, r5 R% W" \
}
/ P- ], o6 b! V3 Y8 ]! l Y
+ v4 [! H0 b, Q7 }$ [ |
|