|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:+ h' [5 \! C' m6 X
main文件:& z; E/ T. g. `. s m. U
interrupt void interrupt4(void) $ t+ o) O+ ^: k* @
{: I7 C4 Z: T! i k2 Y M$ @
Uint32 sample;
4 Z/ r L4 S5 [1 \% ~/ p; S. i; m( ^4 O; J
sample = input_sample(); // read L + R samples from ADC4 A; D+ f l0 \- y @3 b$ ~4 N
output_sample(sample); // write L + R samples to DAC ' n( J# X8 y! N3 S0 j9 x0 {5 B
return;
0 c- {' h- W/ B}' O% A3 b: k& n4 R
: C' r2 i0 X1 \, e& E) gint main( void )) E: ]( F w6 U) @9 Q. W1 Z
{* [; p( ~$ J+ N, J0 H8 }
3 @: n, e( r; i* J2 [; {
/* Initialize BSL */
$ B0 ]' t# @8 p$ p l EVMC6747_init( );
+ ~3 B' s, Q$ e( x3 [; h- w1 M /* Call evmc6747_intr function */
, s0 b3 @( f9 G: l% \6 j0 J aic3106_init( );
6 N' m/ ~1 @* ?. G while(1);' H' A( N, _# z% [' v
}3 T8 l: _0 O; Z# h7 |6 d/ [/ A3 {1 [
( N* D. y5 v! P3 \8 X* V7 h* e
7 B; i2 O. w# `8 }7 b) xaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题) K3 Z `" I. q
/* Initialize MCASP1 */
. A1 L8 \- c% w1 f- ~ mcasp = &MCASP_MODULE_1; I' A8 K2 J8 n. k( V3 H! F x- X& {
mcasp->regs->GBLCTL = 0; // Reset. ?- F9 A; {0 F( \
mcasp->regs->RGBLCTL = 0; // Reset RX
# ?, s+ a" f% I. c mcasp->regs->XGBLCTL = 0; // Reset TX
) ], X. P8 L F: X( H3 P, e8 y mcasp->regs->PWRDEMU = 1; // Free-running% [" t S+ {8 V6 O1 P# r
// configure McASP0 receive registers
5 e/ o m7 q% I R1 j mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used" Z) O$ K$ o' u7 X$ h8 {2 |
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus6 a3 P' ^$ ]' W" f
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
: G. c. \9 H0 D! I6 Y7 x mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
0 K& p! ^& s% b0 f& w8 @2 x" W# E mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
' G, X- z; d) ? mcasp->regs->RTDM = 0x00000003; // Slots 0,10 X5 l) d# {* Z) d7 K
mcasp->regs->RINTCTL = 0x00000000; // Not used! G( T/ k; q3 Y* L/ L. g" g* u
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 `/ q$ G) n4 m
: B }( B1 `& e( u T# o% U. P! Z mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used2 f r3 F% O) t2 Q$ g4 C
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
3 z9 N# r- x _ mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word! G1 E$ F, y8 ~/ m) o K8 {
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16: m, S! L) Z2 I
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
$ x( ^, ~' ^, |4 K, W8 _5 J mcasp->regs->XTDM = 0x00000003; // Slots 0,1. m/ _! n% B1 Q
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit+ B$ d% `6 y. n" y; P* p/ n
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ E1 i3 q1 i8 f: [0 l
* X/ X) H+ D3 m; G1 U$ o% X mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
* r2 ?' F( p6 U' P& f( H+ A mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
$ l3 ^6 L0 k0 c0 K4 G, \ mcasp->regs->PFUNC = 0; // All MCASPs; N$ d; ?8 u8 I; H! g& d; ^
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1) m+ a3 A6 t6 x
' r' q. ]/ r/ x& Z6 B
mcasp->regs->DITCTL = 0x00000000; // Not used; _: K$ n9 }1 C8 l% H- |# }
mcasp->regs->DLBCTL = 0x00000000; // Not used. ]' r# N3 p! D( `9 X. Z
mcasp->regs->AMUTE = 0x00000000; // Not used
8 m m k" t7 z, l: W; L/ t0 f3 n- g. ]& \6 ]: H
/* Starting sections of the McASP*/ h& c4 C' A- v8 E7 G# q& `* J7 {
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
C* l2 C8 Q, `0 q9 V3 v% e" u while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); - U q1 U" q, B, Y
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
" u0 x4 r5 R' k) O8 u- A while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );9 O$ S1 W2 [, M1 s
3 Y* v+ J- U8 B: k: l) \+ f mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; " j, u1 l! E5 d% j8 i# o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );2 A& C) k; x' \
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; + ?: H7 g* o. u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
' f7 a' _" x; K2 g* E. v% A, B* E4 W4 v( ~: b e5 P) h
mcasp->regs->XSTAT = 0x0000ffff; 0 c! X) a3 O/ x2 _+ d/ ~8 [
mcasp->regs->RSTAT = 0x0000ffff;
+ p- M. G, i1 |; w* F
% f) Z" o/ ]3 ]( s/ r mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;" e. q8 F! I! b. c. G6 P
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
' k- C7 K+ g% a% G" X$ M) W( Z! Z mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
) y7 T F$ x7 t. L$ [! ] while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
! ~4 Q8 [: u$ Z/ J/ l+ Y
( m/ M, Y& _) ]! E, s8 b /* Write a 0, so that no underrun occurs after releasing the state machine */
7 I1 o" `6 }* a6 d6 E mcasp->regs->XBUF5 = 0;( D9 ^( ]4 _9 F# H
mcasp->regs->RBUF0 = 0;/ I0 i, H& F8 h- I
# k7 v' c% h7 f- X3 X- Q
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 3 E O( O' R4 S- n
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
; q/ ]& l! t4 W- t { mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 4 m6 a. F& q. C1 [0 N' l
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );7 ~9 f! F4 |) s( N7 q7 {2 @
9 Z' o! l! u' Y4 G, t0 g' K# h+ |
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ' t, t5 ?& l8 ?
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );2 f7 T$ a, n- ]( x1 f! Z
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 1 V: ]* {& E2 }/ M2 M/ x
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
& M6 o2 G- R- D- H
$ q9 B3 h. Y B CSR = 0x0000;" w4 ?1 q- o1 |2 i, U' _" N
INTC_INTMUX1 = 0x3d;/ F' w: ]+ \) x- i* ]
ISTP = (unsigned int)vectors;6 D0 ?( _8 G5 |
ICR = 0xFFF0; 4 x4 M3 U+ ~6 k @. k! L& W' a
IER |= 0x12; ' _( y" D, G8 B
CSR |= 0x01;
( w* ~! T2 `; T! ]/ n! o
3 Z! ^; B3 W& j" F% Y
+ b+ x* A9 y0 T8 [' k9 f( `, v' t5 I$ s5 {$ Y
还有就是两个输入输出函数:. ~! t3 L" d l/ ^4 p$ e
void output_sample(Int32 out_data)% x: t8 v1 q" T" M6 v, A, W! C
{: P+ h) _! t0 G, m
AIC31_data.uint = out_data; # `8 W4 N2 n9 [2 ]
MCASP1_XBUF5_32BIT = AIC31_data.uint;
) }" G! k' T+ @7 k}
/ Y T4 j8 a; |: {4 K; R
) z* a4 S1 N1 U! V& F. g0 tInt32 input_sample(void)
- z) _* E6 Y. E* ^( l& T{ + ~4 h! @4 B8 |
AIC31_data.uint = MCASP1_RBUF0_32BIT;
9 {& K' Z' O: @) ?+ f) |( V return (AIC31_data.uint);1 s2 Q0 j( p$ e
}
3 K9 Q1 v+ r) C6 M
/ V, f. L/ [8 x8 x- U# v |
|