|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
: \: a: o4 |3 hmain文件:
, m+ g: k1 _( [+ vinterrupt void interrupt4(void)
2 A- @9 U8 @; \- Y{
# R: W( v5 c) _8 c% `- ~ Uint32 sample;# S- Y5 b* E7 Z' }: [$ p0 W
`6 S0 K+ h5 X$ T4 X3 \ sample = input_sample(); // read L + R samples from ADC$ n$ a* h3 j$ k4 v E
output_sample(sample); // write L + R samples to DAC - z, W9 r8 W, }1 k8 r
return;3 `' b0 g, `; t) o. t) p
}2 M. l( w1 W# M( o% j
$ N' U+ F4 V' T6 _ C& d3 \int main( void )
7 Y2 k: ` M/ K, G F{
6 r# z# _- V, }* M! [. a ^2 A& n9 N. K( s, z4 F( Y" r
/* Initialize BSL */
; j2 y$ @2 u" F1 B3 n7 A, r EVMC6747_init( );
' P1 A2 _8 d8 A3 H# j- i /* Call evmc6747_intr function */
6 n1 e2 |+ @/ f) z. _- [ aic3106_init( );: L, p+ u9 @4 I6 D( g( X2 L
while(1);% Q9 F, P* `9 k+ S$ M; x
}1 i8 ]* D# {; m5 u. g0 R
6 y1 {6 h5 l0 ~3 m1 d1 e/ M# A
% ]7 t0 r8 R9 i2 \3 }" e
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题- v9 M; p' Z4 q9 A" k9 W0 D2 m
/* Initialize MCASP1 */
7 `! i0 {! o7 U! l# G1 p0 W+ c mcasp = &MCASP_MODULE_1;
$ v$ O- c* g% z4 ^" J mcasp->regs->GBLCTL = 0; // Reset. Q6 u7 i, Z# Y* _3 q0 j
mcasp->regs->RGBLCTL = 0; // Reset RX
3 @9 z3 a9 E2 m$ }" A" D3 q7 X4 _8 f mcasp->regs->XGBLCTL = 0; // Reset TX) }% T: P f4 ^1 O; a
mcasp->regs->PWRDEMU = 1; // Free-running
( N3 l$ ^% U0 Y' p) q3 t" U // configure McASP0 receive registers( `- L+ M' p. ]
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
) ~* S2 L0 j0 @. b- v mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus; V9 ~! z+ _- M8 T, |
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word8 O9 i! j2 k/ Q2 Z/ R$ D
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)8 |6 j! c! o: W+ k
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side). L2 D. ^. [2 K
mcasp->regs->RTDM = 0x00000003; // Slots 0,1; R5 z3 B: u8 ?2 x
mcasp->regs->RINTCTL = 0x00000000; // Not used
; t3 \2 a. i5 | w* Y- D0 X mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2561 ^+ L) q, d/ W7 m7 p4 s" ~$ P4 G" h
; g/ k' L# i! @4 A6 C% ] mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
* N% W$ L8 Y" z- T* a mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus' Q6 ?3 g- v. N; ?
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word. z. {2 i) Z( _( ?. S" S) [0 I
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16- |8 V/ O& D# H6 e, |4 L5 L/ l9 c
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK& i: Z- q$ g8 Q6 }1 z$ T7 t
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
+ g; `4 ], |8 }' d" L. w6 H+ S) \ mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
/ O" f: h7 f1 B& @& f, V mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, I* n0 b6 `7 _2 J* H( [ O
2 O# n& }4 H& Z# K mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
8 @3 h0 p# y z5 h H mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
; B8 m7 B6 G0 w8 Z6 H mcasp->regs->PFUNC = 0; // All MCASPs
: w% ]5 S! D' t; l9 |) O mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX17 {# i( h" T# X
+ H, k% Z, A- v4 a9 a" u0 q
mcasp->regs->DITCTL = 0x00000000; // Not used
, f7 N) z# i$ V mcasp->regs->DLBCTL = 0x00000000; // Not used/ W5 n G$ r K% R7 K
mcasp->regs->AMUTE = 0x00000000; // Not used1 Z/ T) d# o+ o b
. h& _) n: _2 c6 F6 }, a, u/* Starting sections of the McASP*/
) j& I6 G( e- O7 S, w mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
; O6 i: ~6 ?6 X+ S2 t while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
3 L2 ?0 m% n( D- f* ` mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; : Y- I* M# d( k5 [# n' d
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );0 A/ O) u" d0 o$ P( i
/ M8 B* U: A; F8 F3 N
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 1 \, ], V' \, o) _* Z B t
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
. ^3 h A' O/ W* v mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
A& ?9 l" ]' M- a while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );) [( W; m9 `# K
& J" b0 b0 T& u0 @
mcasp->regs->XSTAT = 0x0000ffff; & V0 K7 C! J. A: P' N
mcasp->regs->RSTAT = 0x0000ffff; & h4 A7 P/ @4 F. A. U8 I! W
0 k1 W9 w! }( P! v2 c6 L mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
3 }6 t! A/ w9 [! y1 I3 i! J while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );8 w/ s1 h2 i+ ^7 x0 J
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 5 B. I' o8 Z5 M9 ?4 B2 l
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );' f0 w$ b7 W4 U: r% y. D
& ~+ M0 }% B; q8 S. R$ j
/* Write a 0, so that no underrun occurs after releasing the state machine */7 W* H2 n' \2 Z3 L3 U- V! q Y
mcasp->regs->XBUF5 = 0;
+ Z# `: e: M; d3 |+ C- r6 `: p mcasp->regs->RBUF0 = 0;" J3 G4 l7 W9 d! U6 V
! r+ ~$ Z$ L/ L4 g mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
$ F' k8 _" w. k while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );- ?7 Y0 b1 H0 [ m" T1 u0 X8 A
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; * H# h( K6 N: @ C, N( C6 o2 y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );3 L( z8 T5 W# v7 G
& Q6 U, T0 ^( d mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 1 U0 @# a* @% Y* Y9 J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
C! A% L* _. {7 ?9 J mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
: F9 C4 {; y8 n8 F1 G; @ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );! u7 s8 m2 W4 B% w: K! e/ x: a
, r* x& A. C/ g# U, \2 x CSR = 0x0000;
' _5 h* j/ ?0 p4 \$ Y- r: @2 i% S INTC_INTMUX1 = 0x3d;
; P; Y- O$ Y" | ISTP = (unsigned int)vectors;0 M1 [8 @8 V, j' X
ICR = 0xFFF0;
! A n8 y. o! x& a$ o/ K! _# X. t IER |= 0x12; - q+ y( @ X" {' ~1 M( D t
CSR |= 0x01;
, g/ A8 `( p9 r ~& A" q5 I+ e5 K/ I2 C' x' A# F
) ~. D0 c% Q8 |
Y7 i& L& L3 T$ |7 a还有就是两个输入输出函数:
?- S% B1 v4 f- _3 Avoid output_sample(Int32 out_data)1 u8 U' B+ i; V0 m
{) ?, R/ ?2 p7 V; w m4 Y
AIC31_data.uint = out_data;
! O: P6 |/ M y) e8 S# e9 X4 L L MCASP1_XBUF5_32BIT = AIC31_data.uint;
2 `, o* K; p9 t6 L& z) n}: A r) N8 B) @) o. _9 v d& g
- Y3 C$ }! G1 O& ~: @
Int32 input_sample(void)
; p% o6 n5 H* I4 J* D: e0 Y/ P{
- b" P! ^. f2 q1 b5 m7 W AIC31_data.uint = MCASP1_RBUF0_32BIT;% m% T0 e. H+ R/ S
return (AIC31_data.uint);. G1 l$ U# V3 V
}
7 U4 {, ?4 d& y2 `$ E3 x$ E: v9 \$ j
|
|