|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
5 q) I$ l- L- R7 Lmain文件:
* O, ]4 B- _0 Linterrupt void interrupt4(void) % k; \* A9 _7 Z/ z& t' _
{
+ C- r) v' p( ^' @; Q9 t# y+ j' B0 U Uint32 sample;0 G5 t9 m% _6 Q P' Z8 e
# x& Y6 c/ ], i1 x P8 J sample = input_sample(); // read L + R samples from ADC) e, d; Z+ S% ^ {5 B8 n/ s/ w
output_sample(sample); // write L + R samples to DAC 6 k6 L, d: ]. |
return;3 u6 p9 S+ t! I
}
) H) k! W" u1 j0 \# e2 x
; r1 W, D P8 L6 ~6 Cint main( void )
' t& O- K: k: A5 Z1 l{
" r' c$ C# ?5 E
7 C& e4 F8 o1 m8 \# l* } /* Initialize BSL */
( Z9 c' K+ T. w) @ @7 F# r EVMC6747_init( );
$ Z+ X. }; `9 s$ Y" g' t' g /* Call evmc6747_intr function */9 T" J! i1 \" \, @8 w
aic3106_init( );
0 P: V: U# ]( L4 l# V while(1);
7 u) ]& v/ _4 M$ c* z0 s @} E. [! W1 b! L2 L, h+ G8 w
# P+ k- \, V1 \: v0 E% ?* L( Q$ s; A) E0 `) @
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
: T7 a3 p: f& |3 k/* Initialize MCASP1 */1 o, v: m# U* D. q0 p- z
mcasp = &MCASP_MODULE_1;
- j- O6 e) w$ K1 _ mcasp->regs->GBLCTL = 0; // Reset
8 h; m, R3 L: N mcasp->regs->RGBLCTL = 0; // Reset RX
3 X' \8 @5 X* \% y mcasp->regs->XGBLCTL = 0; // Reset TX2 Z3 R) ?# b% U8 b
mcasp->regs->PWRDEMU = 1; // Free-running
- c" Y3 R4 b d // configure McASP0 receive registers
. F7 |( J6 T0 o7 a mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
# J' [2 n7 C( \; p mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. D" ?5 S8 r* B4 _6 A/ p2 t mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
: M2 X9 }9 ^" O: }' R4 u mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)- e$ ~; x3 Z: {% u9 Y3 m5 l
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
& h0 v3 w* h( V* o mcasp->regs->RTDM = 0x00000003; // Slots 0,1; N1 u" X7 E/ W6 ~& X' y
mcasp->regs->RINTCTL = 0x00000000; // Not used0 @" R/ L! Z4 J$ `7 {: ]% y# |
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2564 o% @: V+ p: _4 M2 f. c5 U
: C! y! I0 J H0 o& i- } mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used4 T, ^6 z& V: X! V) O9 d7 i
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
3 B9 j& U% t' ]. s* \- }9 Q mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word2 K2 z- P0 g6 S1 h6 p
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
) B+ k. h( n4 t7 U/ h5 B9 M mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
3 O! S% u+ s% o( @ mcasp->regs->XTDM = 0x00000003; // Slots 0,1
4 l: }6 H9 `, M( d- ]5 P A; Q/ t mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
4 G0 f3 q! A9 Y$ T. L mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256" j8 A/ Z* J) x5 v- H! R, y
/ A( F. q. I& v# v
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN, _: c- ^- } X
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT& x( D" q: j7 V6 t% y
mcasp->regs->PFUNC = 0; // All MCASPs
& b' U0 U. E( ?$ b' N) x& ~ mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1/ |0 x0 W- u" J
: O$ ~9 l W+ B3 X' q3 x! H
mcasp->regs->DITCTL = 0x00000000; // Not used2 J% d: k5 b. z* ^
mcasp->regs->DLBCTL = 0x00000000; // Not used
' h; ?. t ~! |2 [* [* Y mcasp->regs->AMUTE = 0x00000000; // Not used' O+ W1 i7 h" X0 i# z
9 b- {3 @% E3 r/* Starting sections of the McASP*/. h# m( D6 d" W E0 U
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
3 h2 [ v) R1 a; s6 H `% t while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 9 \8 S _5 @# q6 W
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; # T' m# F- T2 h; x- w6 S7 S
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );2 g. d( z7 I% W% x$ O* K2 a1 D N# F
1 H4 a" H+ r+ X* ?# L( m: n. p
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
' s3 Y9 ]7 w- s2 ? while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );% R% c1 F+ t" Q" F' r: j1 x
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; K; x8 ^% m4 b* E8 M
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
) N$ j( J8 D) s6 U5 ?' q( ^; T6 \9 S. k6 @
mcasp->regs->XSTAT = 0x0000ffff; 7 K) B( T/ x) O$ Q; \
mcasp->regs->RSTAT = 0x0000ffff; # O/ h: n2 a% { {9 T H( y
3 D3 ]2 w) V- x. R
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;2 d) T) c, @( L' J0 K6 _
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );- v' R3 @$ m9 W! K) ~
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
4 W2 F& Y: |4 s( y while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );! V/ S9 K7 t3 A9 x9 P
* S5 ]* @( ?+ v, Z# Y /* Write a 0, so that no underrun occurs after releasing the state machine */
. H) u) r# }7 R* G7 W mcasp->regs->XBUF5 = 0;
" ^8 `& T- [% ~7 x3 u9 E% N1 Z4 @; z mcasp->regs->RBUF0 = 0;
5 R* O. |) v! b# V. o! L5 x! h: Z- H9 i9 S! t6 T
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
( [4 L& ^# `- j1 ]- V3 C% l4 g( ? while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
, e" W% E J! d( R. p mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
. A/ E; c: s* i) W2 M/ [ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
0 j, U- T c: _
w5 i5 C: j# e6 M% U mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
, L. g8 |* I) A+ \ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );# s2 s2 @8 A B6 @4 y* v
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; / c- u4 a9 x$ L" {: l# Q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
- n% Q+ W1 N+ n9 U5 u4 w e" R' P
CSR = 0x0000;
( y* `3 Q$ `8 ^& h; I6 ]0 x INTC_INTMUX1 = 0x3d;8 d8 }- n; e+ G8 w# U* x# C
ISTP = (unsigned int)vectors;
* t# ?1 @4 ^: r5 F ICR = 0xFFF0; & d2 G# P6 c& l$ s$ G2 J5 U* d' O
IER |= 0x12; ; ?' t' h2 ^1 H) S; Z
CSR |= 0x01;
, K, n% ?0 Q5 q! w! R1 T9 n9 p8 P
% k+ ~, l5 H9 u Z3 c3 p; v$ i' V
2 M& T B% x7 w
% E' S( }5 `/ t还有就是两个输入输出函数:
1 `8 d6 \& [$ p* H3 l6 P5 t Mvoid output_sample(Int32 out_data)% c+ d2 w9 S. L) ~: Q
{1 R! B- `1 Q+ {' I8 V
AIC31_data.uint = out_data;
J7 Y$ c+ @+ E: m$ v MCASP1_XBUF5_32BIT = AIC31_data.uint;0 `; y( h9 s" a) M+ N
}
6 r: U! ]; i# } I4 C8 Q' o9 \
: W( O9 E2 E+ Q( k8 ~! _' m1 M2 \! bInt32 input_sample(void)$ o' y% o% [' s8 o
{
& l* }, i0 I# D' T. K AIC31_data.uint = MCASP1_RBUF0_32BIT;: E" l1 |$ |8 T7 k8 d9 W
return (AIC31_data.uint);! x% ^5 M3 b t! E
}& j, p, z0 [8 w/ a0 w
# P* H$ N7 ?) x' h9 T; A
|
|