|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:* S+ N; S2 g% {/ D+ ~
main文件:7 p$ V5 t& ?$ f
interrupt void interrupt4(void) T% f" o" e+ g, S
{
9 k+ @# m, D T7 W. E% s/ p/ z Uint32 sample; \7 ?% M e' f3 }
( i; ^) P# Z; u3 \4 p$ | sample = input_sample(); // read L + R samples from ADC
8 [% R3 Z) P- s output_sample(sample); // write L + R samples to DAC
2 i! r. x9 ]2 D6 t8 R( @ return;
6 M2 v/ v+ q7 M3 R6 x! ^1 u+ Y: S}
' [% [1 e0 f4 _5 Y( Q! |* a
1 [$ S' \4 [5 xint main( void ), E6 T9 A+ `# Q- Z( `; p# a) q6 m+ p. h
{
" t3 Q* a8 ?$ |( u; O, N p! ^8 n V* v' I, r5 s7 f; m( P7 H, x1 r% u' e: t
/* Initialize BSL */
% {7 _; o- A0 D3 R- w EVMC6747_init( );) s) }: T! R; ?( i4 W' \ L2 _ x. q
/* Call evmc6747_intr function */
1 i1 v3 R/ t* _; l+ ]" Q) n aic3106_init( );
; {0 I( z* ]3 K3 D2 R while(1);
5 ?, [, A6 _ ? g0 I1 X+ q8 q7 e) V}
$ y1 R* z5 R7 n
" i n% Q8 \2 r4 E5 m" v3 X) W$ A. d+ z+ Y! e% K/ Y; G
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题6 n8 C- T* n7 ]8 A( p7 }
/* Initialize MCASP1 */
2 O2 F# K( Q% j7 o- I8 h0 D: x mcasp = &MCASP_MODULE_1;
, p; e5 Q2 V: @; F! S7 P0 t mcasp->regs->GBLCTL = 0; // Reset% I1 f) d! D) m% y8 @
mcasp->regs->RGBLCTL = 0; // Reset RX( _4 |. J0 ?2 L1 p! S
mcasp->regs->XGBLCTL = 0; // Reset TX+ V) ]5 u3 o5 p7 A6 u
mcasp->regs->PWRDEMU = 1; // Free-running
% f* B% A; j( w' P% Z' ~; Q // configure McASP0 receive registers m$ g! G( i& `) ~ j* Y0 U# O" z
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
/ g Y" J1 o# x+ C! E mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. `& ~9 U4 T/ \ mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word( i) D% }* F# ^4 m
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
5 r4 {! m3 k' W0 g: C, d mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)! Z" E; g0 ?( u( C7 F
mcasp->regs->RTDM = 0x00000003; // Slots 0,1! o; S6 l! `/ c7 _+ D! M
mcasp->regs->RINTCTL = 0x00000000; // Not used' Q L2 M" T, e
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2563 P- F! ^' j! p( s6 }' b0 u5 y: o w
1 D0 p( j, N+ u
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
4 L* T% D( g( V mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 [8 ? c. i2 y: I1 f/ L* ]! j# a7 P mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
: K% T% k0 @2 o: `) g( f0 C mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16! C/ [6 r8 i' z( R( _/ P
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK- I8 f5 E: [/ M& L/ d9 w8 u
mcasp->regs->XTDM = 0x00000003; // Slots 0,12 a, G! c F% K; U
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
% g" p1 N d* g0 f; Y mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256- x9 F8 o1 y' P! \5 h( t, ~( R9 b
0 M" x$ q* _/ P( X" z# I% Y
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN2 g* J3 {, p1 B6 N1 i
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
7 w7 B# X7 w: l4 ? mcasp->regs->PFUNC = 0; // All MCASPs) y% i! `; g/ @. Q0 K; w5 L
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1+ Z, v: w& a4 J5 k
2 a0 V8 d% e6 u# a9 H. @3 C
mcasp->regs->DITCTL = 0x00000000; // Not used+ d+ Q, o y: N1 B! W! X0 k
mcasp->regs->DLBCTL = 0x00000000; // Not used
$ m+ q/ \. |7 c( K3 u mcasp->regs->AMUTE = 0x00000000; // Not used
) X% Y: h% m- ?! _9 O
4 V# P; \# U$ L# @0 w/* Starting sections of the McASP*/! P& M1 m) d0 V1 n! x* C. Z
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
) k/ |, x2 j u" x while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); ' ~' ?* ]" C' V; v
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 6 y* T9 `2 r2 q( i- v: C
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
9 O" ?* Y5 W4 \ d- w( O8 Q
! s3 ^2 J0 L( \" F- D* P mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
9 ?& k' ^4 L/ w- V" y0 @/ F while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
7 V5 [8 l$ o" |; l: Z j, R) n; @ mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
* U. y8 u% _4 K2 d" d, I5 P# h ^ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );8 v( A4 V# e! M i2 t& j d
) q V$ V. G3 ?' T( ?( i5 |4 J; R
mcasp->regs->XSTAT = 0x0000ffff; 3 E4 j s: H/ e& m# e; g- L
mcasp->regs->RSTAT = 0x0000ffff; ) q) k1 J9 L& d6 J+ A5 `2 V
& f# C# |* \2 j l S
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;! `6 {1 t4 B3 ]# V3 `) v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );, b$ e! h0 ~+ t/ l" F: c
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
1 `/ Y: V6 C3 O$ n9 o while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
# n" Q( o/ w5 ]3 l/ `# C$ E$ r; O8 k. A, C
/* Write a 0, so that no underrun occurs after releasing the state machine */
& z' v( c5 ]/ m8 v% m9 c mcasp->regs->XBUF5 = 0;
" Y9 u% s0 L1 ~ H$ b: e( R mcasp->regs->RBUF0 = 0;
: k6 r2 r ^& \1 G
' s0 s' e; y+ w; W0 s mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
9 b i; {! e: v. g" a1 p. e while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
; A7 n" |5 O0 [, Z. ~ mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
% C, N" ?+ q$ Z8 Q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );! }; `! o0 e. \* I& ~
, m% Y$ E* I" ^: M) c* [# m mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
7 c$ k1 ^5 x n$ v1 w) f while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
- O9 m9 c0 C2 x$ l mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
4 |. u) a! S. J4 f( r" l# O while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
+ P! l8 }4 p/ ~% P/ K
* B" L9 [' L, G- c3 a, W9 O- _" e CSR = 0x0000;/ ?9 R' D7 n# b# j: Q
INTC_INTMUX1 = 0x3d;
; G( F7 U J+ z1 u, _2 x7 E$ N ISTP = (unsigned int)vectors;
$ ?8 l( A/ K9 m( z; R! C* f6 N$ m, r ICR = 0xFFF0; i, _2 f7 d, v' l* E+ v4 N2 {
IER |= 0x12;
2 _3 ^6 }$ U" L$ F% V A& U* U CSR |= 0x01; , E7 T# k1 v6 v' \! m2 z' M. w c
8 Z' C" X2 Q" s3 M' K2 ?
- C% u- h7 e" t' ^) }( h6 c( i& e! B" [ `# P4 n
还有就是两个输入输出函数:
7 C+ V5 _5 h+ M1 Mvoid output_sample(Int32 out_data)
9 H! }7 G3 I d! n- b{& r' M; ]7 v) @( p
AIC31_data.uint = out_data;
2 ~9 l6 o/ y' d Y( a; r MCASP1_XBUF5_32BIT = AIC31_data.uint;
8 z7 @% q6 a; _+ f$ h, L W}
8 G6 ?* h- f6 y* c* Z( O- u' q) {
# d# L+ i# E6 q% c. ]1 ~Int32 input_sample(void)
p2 x( O' H Y. r% p4 K: v3 k% w{ - C [4 l* E& U [
AIC31_data.uint = MCASP1_RBUF0_32BIT; _. c) h8 D, w5 Z3 y& V' b
return (AIC31_data.uint);3 g: a0 x, x1 C2 r
}
7 A; U% v# t/ H% S
- O' w7 X4 z" q( M |
|