|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:! t% x8 |: E3 n. I# j4 k- w8 N
main文件:
. Q6 L9 L+ d0 x& B9 O6 Ainterrupt void interrupt4(void)
; l: G0 T: D2 }* C{" ^2 L; J& n: D4 a* a
Uint32 sample;6 I2 c9 x0 @: ?/ }. i1 Y2 I" f7 C: T
8 k+ F- w# F, w0 g1 X+ _+ G, G
sample = input_sample(); // read L + R samples from ADC9 n) T+ R2 B) c4 V7 _% A
output_sample(sample); // write L + R samples to DAC
* [2 H* {) R2 W0 ]1 |( F0 T return;
( A7 E j4 M8 R3 [) S" i0 w l} Q# c9 c" e0 h# ~& ]
( T% i, J8 X; p+ l
int main( void )
0 g0 A- K; P( B: H8 F3 p5 L+ `! m0 k{: ?# N& x% _2 N7 q8 w" f& J; K
, n- A/ o* P1 d
/* Initialize BSL */% l- a/ J9 G6 @2 V
EVMC6747_init( );2 b3 p/ D8 D$ p7 z# ~+ _! ~+ r5 r
/* Call evmc6747_intr function */
; ^$ a' a; G( N2 \" l! t/ ^ aic3106_init( );
: T7 Q6 {8 |0 z4 M+ V while(1);
% z) u# g7 G, q}, ?4 |* h) I' Z$ {, Q+ ^
* ~' D% T3 S* h7 {3 q3 d0 d
4 }- H- _9 Y: a3 D* P; kaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
& H( }1 E& v3 |- L$ p/* Initialize MCASP1 */
6 B6 w! w0 T; r2 `; W mcasp = &MCASP_MODULE_1;
/ A ^- Z5 ~+ S; _: N0 Q6 \ mcasp->regs->GBLCTL = 0; // Reset7 | h1 p, \$ c0 P! N1 @8 s2 ^
mcasp->regs->RGBLCTL = 0; // Reset RX* n& p$ `# n4 ^
mcasp->regs->XGBLCTL = 0; // Reset TX% I" _; ^. k. d e( s4 @2 i
mcasp->regs->PWRDEMU = 1; // Free-running: i* W& A% K3 S6 _
// configure McASP0 receive registers
: U# I$ s" `, {9 Z; k mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used8 b, _$ R9 ^1 n" g3 c8 ]
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 y% p3 v5 K" ?- u9 h; E- E0 N& G mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
% c& i! }# I: W2 O mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)& I5 Q: a2 S1 k* Z" t0 S" t3 k" i
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)# c8 U5 h# ]! a6 K# j( y" ~) L
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
: a" _9 ]% i) G& u9 | mcasp->regs->RINTCTL = 0x00000000; // Not used/ [4 A7 Y7 o; Z6 |7 }
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256. T, y: r7 c2 P! M
& G4 S% k3 D( ~ W1 O) e
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
. o; i y* e b- F mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
5 H: M# W; |8 V" l# ?/ |9 v mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word ~9 \( r6 l) Z
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16; ^/ f* H2 i: n- V5 q" Z
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
; B& U/ d3 Y9 X" K9 S mcasp->regs->XTDM = 0x00000003; // Slots 0,1
9 P( K6 s4 d* _1 y. {# h) u% n8 j mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
/ q/ f; o3 g S) L mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 _2 ^ K3 y4 l" e" I6 L0 ]% q- ?) \. m" h
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN A' E1 p$ i' e) D6 W4 C
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT8 H( K8 C+ X% E, Z; j! q3 F
mcasp->regs->PFUNC = 0; // All MCASPs# O& H7 F& B% r3 C1 D
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
f4 o1 I9 n/ V- Z# K
8 v4 G7 c# r1 E% \; ~! Z3 w mcasp->regs->DITCTL = 0x00000000; // Not used9 r \) C/ ^: x7 e: h% D
mcasp->regs->DLBCTL = 0x00000000; // Not used
7 I" Q; e3 ]( N% f mcasp->regs->AMUTE = 0x00000000; // Not used! ^+ [( L* `1 g
4 ~; |% x4 \ U, Y/ i4 i0 s/* Starting sections of the McASP*/
+ t' B8 G: `9 c; D i6 t' @ mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
/ Q3 t& l) _- T while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
) ~0 G. g W) m: q8 {& ^ mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; $ S0 d" P5 Q3 c _ h
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );9 P7 X, a$ Y* {" o& F
+ m$ T; k, [% k$ p mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 8 i1 e) z* [/ U9 ~2 n
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );/ `8 x9 V4 A- N! r0 u8 |& q
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
j, m" C: C% ?8 n' m while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );. K# f- s: Y" C- L
0 ?+ ^2 e c+ v7 N. g8 O
mcasp->regs->XSTAT = 0x0000ffff;
, u* b, B8 X- }; ~7 |# a mcasp->regs->RSTAT = 0x0000ffff; 9 G/ A% [. w" }1 t. H: `6 |
8 q8 u3 c1 ?3 f x. ~5 a
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
8 K* E% W5 l, K2 s% T1 ]: I# { while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );! B. K; p; _/ w6 v! i; F
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
+ d1 z1 x5 @+ Y( f% c% C while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );# F8 ~" k3 l- z; q
+ x& P R3 D' ^, B6 e: B /* Write a 0, so that no underrun occurs after releasing the state machine */
. B4 J6 d& I8 e K- n mcasp->regs->XBUF5 = 0;! y6 M: r( C/ U/ Z0 ?
mcasp->regs->RBUF0 = 0;. W) \( g! @1 f( X s9 [
7 g1 z( f r+ }& ?( D
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
: t0 X2 ^9 }2 Y/ P. ^, ~ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
7 @5 v# S8 q7 N$ @" a mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
a0 Z" C K( N6 J. h4 ] while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );5 D, B* x4 \ G% Y) ~- O
2 c! w6 F- I" c/ ?
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
. [ N# k0 V+ } u+ L while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );0 B4 ]1 @ t$ G j" m! j: [. K6 K
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
" k' e% L/ Z- ? while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
. y" C. s0 G9 ]2 q; ~! y
! j# @ d; d+ m7 E CSR = 0x0000;+ o6 q# m7 A; e7 F3 s
INTC_INTMUX1 = 0x3d;
3 A1 l; \5 b( S/ F8 |% x ISTP = (unsigned int)vectors;& a1 T5 ^' G& G% y2 `
ICR = 0xFFF0; / F! M5 o$ J% B4 u! G
IER |= 0x12;
% A% k& |. s0 I' n" V" L( A CSR |= 0x01;
4 z. D2 u" z( \ \8 a
5 p1 z9 ]4 o+ `' \
& o( F z0 c: }( K% G) V+ G4 |3 p7 p3 J" h; }
还有就是两个输入输出函数:
# s3 M8 E- _- ^) Svoid output_sample(Int32 out_data)9 `4 t+ d6 v3 G6 e4 t
{
$ ?+ l& f w& m AIC31_data.uint = out_data;
( Z2 A Y5 x+ T- n) r6 { MCASP1_XBUF5_32BIT = AIC31_data.uint;
Y# z! y# g& q# t}
) W! {! W. [( F. V$ i& P2 m6 p. Z( F3 f( `, v% s# a+ d
Int32 input_sample(void)
- l" T. E$ Z3 a) E6 b$ c{
9 I: t! \% J: t, { AIC31_data.uint = MCASP1_RBUF0_32BIT;
- r5 a* N6 R6 o O' j" C return (AIC31_data.uint);
& [+ _! e9 A$ U* t7 ^ u+ a2 m}& y1 P- ]" l [9 i
+ \8 u- {0 c) B" I# v |
|