|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:7 u/ c2 x9 q* Q H' B6 T
main文件: m! V2 @2 Q+ I
interrupt void interrupt4(void) . {$ y- I4 ]9 z3 Q0 T: z# [* U
{
6 w, r2 f9 n- x1 w8 h Uint32 sample;7 d* E& p# I8 B, M; f) l
+ R& J# v! a- U
sample = input_sample(); // read L + R samples from ADC( F( @) v* B& p* ^8 X4 V. X
output_sample(sample); // write L + R samples to DAC
3 B7 }0 B! ]) M3 g7 E return;
y6 |* Q _% G* i+ [$ W}
/ n% l0 d: H& V) z0 U9 I8 ]1 b: y
/ P; `8 Q3 u7 X; cint main( void )
6 J# K0 D" e+ r0 x7 o{/ ^8 f% N. Y0 R" O
, ~& W4 v! f. z7 ] /* Initialize BSL */
0 D: L# d8 `7 T' M9 [ U/ Z$ M EVMC6747_init( );
& x$ D3 G; O" R3 V9 d8 @ /* Call evmc6747_intr function */
! c- l; o- d) `6 O5 U aic3106_init( );+ Y0 s; A O& g- |
while(1);
0 ~! M+ P6 ?1 N( X5 a/ j# y}
- Y, T# u& f) |" ?/ U& \: M5 A0 \( ?2 h/ n8 A3 }
6 S. I: C* Z$ o; @* g# Kaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题0 N- X% h3 g) H3 z6 T8 H
/* Initialize MCASP1 */7 {$ ]$ l2 G: ^8 ?
mcasp = &MCASP_MODULE_1;/ A/ o7 c" R. M7 i0 A" ^( T6 F
mcasp->regs->GBLCTL = 0; // Reset
2 o- b- z# b! s- x. M; m! u4 r mcasp->regs->RGBLCTL = 0; // Reset RX
- D* ^" Y! ]- p, M; s* M mcasp->regs->XGBLCTL = 0; // Reset TX
5 y/ ]5 K- e% e, } mcasp->regs->PWRDEMU = 1; // Free-running* i9 F9 I/ P- D
// configure McASP0 receive registers
6 N) n7 B: a; S- j" E' q4 d: X$ | mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
E0 ^" Y/ i' E) W mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% O6 U$ l% b: R+ r6 C' n V mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
# M# g$ I, ^- D2 r mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)8 n! d$ I/ @: R$ b# l6 s( Y
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side): y( N# W3 Q, L0 Z
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
+ h$ z6 a" L% ?" V mcasp->regs->RINTCTL = 0x00000000; // Not used' V' L0 m* c& i @7 J2 ?% e0 N
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256/ q4 N' |, g+ m1 b5 Q& ]3 t
J7 I4 p# W* J1 k
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
1 i" R7 j; k9 c mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus1 w4 l" x4 k P
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
3 }! D& J) I. i3 V* f! g$ I mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16) ^3 Z) }( N! K. ^
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
! ^- `2 g" ] _5 ~, q mcasp->regs->XTDM = 0x00000003; // Slots 0,1
8 V5 z- ]% t& \# }# O# U mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit5 X% i# F( K+ p: H( s( f9 ]
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256& f" X. C8 W8 C5 R8 ~: v
# Y1 O7 q) t& T
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
: K; O! d; y- u2 V: ]1 r mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
7 M6 B9 s: ?" I% B5 G mcasp->regs->PFUNC = 0; // All MCASPs
( |, {/ f j7 t& E mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1! h4 D" t( S8 S4 k
$ Z- Y; Z& h5 b mcasp->regs->DITCTL = 0x00000000; // Not used( Y9 ]7 o" {- E8 { S( P* s
mcasp->regs->DLBCTL = 0x00000000; // Not used
# F- R2 s* @; C, L' i1 J mcasp->regs->AMUTE = 0x00000000; // Not used! m* i; c" w6 E/ A* f% Q l
9 l8 e8 ]& @1 t3 W( u) ~/* Starting sections of the McASP*/& h9 W$ O$ |8 [ k t( h& C
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 5 B1 p, ~& ~8 x5 |3 t* I
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); & w! }/ j1 d4 }* C1 f+ ?
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
5 ~1 J1 k/ @ `/ W6 Y- k, A while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
& m8 Q/ C' ^" t3 o' Z, x$ R' D4 Y0 o- U+ w
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 9 T5 ^* L( T5 \# N0 @ H
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
. ^7 J E1 B# r4 i/ F; n5 x mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
( A1 {4 Y) w' ]& H. e7 E9 z while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
! S% a7 P* F6 g9 e: ~: F5 L4 O$ h' s! z, e% S1 _8 q
mcasp->regs->XSTAT = 0x0000ffff; : ~# T+ _) T% _- `. t/ f: k+ d) F
mcasp->regs->RSTAT = 0x0000ffff;
$ z$ o. ]4 B9 n: @+ S2 o5 K$ E% z* r
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
' }" M+ ]3 q, Z8 r2 L6 F while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
! w1 j( T! v0 d/ ~4 E0 t0 h0 D# X7 y mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 4 m% M! T+ L9 R
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
* }$ Y" K1 u+ r% I$ W1 x" @5 j( V2 x' h
/* Write a 0, so that no underrun occurs after releasing the state machine */
: R# c- C4 O+ h3 u$ _ mcasp->regs->XBUF5 = 0;
. F; B( p+ y$ \3 O8 R mcasp->regs->RBUF0 = 0;
3 g5 B9 a5 V! ^! S* k3 o* K2 t( X" |- f" d4 Z$ O
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 1 s6 o0 ?9 B* t
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );+ |; w" z) ]6 N6 w
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
( J/ ?* K: Q% I3 [ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
6 i9 t5 h& L- f6 w4 j8 N1 e# y
6 e0 l- n- r0 P, L4 N2 ^ mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
5 v/ T3 Z) f# g8 ^! o, ^: _ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
; c( W- Z0 v" l4 M# y/ z mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
9 S. E6 Y: H2 y! H @ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );5 [4 ]& ^* Z5 K& o% D9 Q
1 C) i4 i. E6 _* h+ x CSR = 0x0000;0 u, ?: E% y/ P1 L2 P' x" _
INTC_INTMUX1 = 0x3d;/ M6 W, e4 d7 e
ISTP = (unsigned int)vectors;
2 D* p" @" @+ n6 ^! P ICR = 0xFFF0; 4 _) B- n4 ]. N# r4 z
IER |= 0x12; ( Y! `& O7 }( v3 W
CSR |= 0x01;
6 F2 F5 y, v7 e5 ~1 L. L' [
& b& u% E6 E o. W* q0 T) N% v' t0 X3 H
r2 e+ E5 _+ Z- F' S% f" X* H还有就是两个输入输出函数:
4 l1 M' n! T8 ?! ^5 }$ O7 Uvoid output_sample(Int32 out_data)3 x. ~) a0 ]; V
{0 K$ E5 `! z% d; `6 }# e! i, h
AIC31_data.uint = out_data; 3 w7 F& J! c @; L
MCASP1_XBUF5_32BIT = AIC31_data.uint;
; e: M' W, i( H2 B$ W+ Z& C}
0 F" T! P: h0 o$ r
0 ^7 b! U9 \: }Int32 input_sample(void)# M/ S: B6 R" C7 j1 P
{ ! Y8 P! t+ Q6 q
AIC31_data.uint = MCASP1_RBUF0_32BIT;1 W3 `0 ~9 x5 F( f9 f
return (AIC31_data.uint);5 H: Q2 f1 w9 k: W3 `4 u, P
}* V6 E3 g7 Q; F. z1 ~0 B/ l
o. v$ \ E. b# r! R }
|
|