|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:" P& a; h4 i6 @' M7 W$ U- Z
main文件:
" s5 G+ J+ n$ I& N |; o% t0 K7 rinterrupt void interrupt4(void)
# s, m% Q3 X0 J{3 l U8 I; _4 P8 o2 x
Uint32 sample;% U! y- {' Q6 W! y2 A
/ f) s$ [( I! M6 f$ H% g
sample = input_sample(); // read L + R samples from ADC8 M# k' k. ]$ `" S
output_sample(sample); // write L + R samples to DAC
/ {4 ?8 m, V9 R0 F: h5 Z return;( U) `, B8 o$ N2 L" ]2 B( k
}
. M# S5 V# j: X( o& G f8 P* h3 H
# A+ D. F2 D; Z) ~int main( void )4 K) O& g: f3 U+ b: b& s' O+ G
{0 `- E, \3 @, O( Q, G m
" U$ C- y7 P# d8 Q
/* Initialize BSL */
) {. f8 `+ n( L9 Z# ?2 r' D/ `5 ]/ A EVMC6747_init( );
8 ^$ W$ a$ I+ h5 o /* Call evmc6747_intr function */2 J0 r% S5 ?( P8 y9 K
aic3106_init( );! m) C8 N. X- b5 ~8 {8 ]' {
while(1);& l; [: l/ Q% ~2 [$ R, _2 \9 c @
}
$ ]) H! ]3 V3 r5 |2 v( G4 x
" y& T( Y6 Q5 n }( n/ ^+ ?4 u2 H1 f# O* R& j
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题0 X' y2 Q5 x; x' [2 \
/* Initialize MCASP1 */* n. P" c, g$ n" o' Q6 w" M
mcasp = &MCASP_MODULE_1; X- r4 B, a; Q* @, [
mcasp->regs->GBLCTL = 0; // Reset
0 y& `" y" X6 \, ] mcasp->regs->RGBLCTL = 0; // Reset RX6 t8 g) | c: `2 Q
mcasp->regs->XGBLCTL = 0; // Reset TX
2 V8 o- b" M# c) u" Z mcasp->regs->PWRDEMU = 1; // Free-running
' h) A, c/ m) c4 H" g. v // configure McASP0 receive registers" i2 ~4 Z. V6 A6 w. |
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
$ ~+ B3 w6 Q t& Z8 z mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus/ E$ t* C7 \6 u. y# G3 C
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word8 u* X4 m( o: a" [
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
4 v5 }) ], S! L5 e) T mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
, c6 m' _& L" D0 K mcasp->regs->RTDM = 0x00000003; // Slots 0,1( r6 q0 A6 o& \7 m. o) w; [( G
mcasp->regs->RINTCTL = 0x00000000; // Not used( V, M& u/ t: F
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 _3 n4 A; j0 t3 R) x; }8 v- o
- s' ]9 D/ j. d6 n$ Q& X! A E) E mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
2 K3 {& k$ m; u: V9 i' c- Y3 u4 O mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. X$ x! |9 I5 _9 Y' n$ Y mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word# G' p. e: ?! Z% ]( Y: r
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
, e: F! m3 r) c% p2 \, Y+ G mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
- O! v0 h$ D7 I mcasp->regs->XTDM = 0x00000003; // Slots 0,1
: i8 l4 K7 f z7 p! M3 S5 j mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit5 y6 B8 c& ]4 G: @! _' A$ {
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
0 T' Y) I$ x1 `9 K$ P0 Z9 J- L. B1 Y" Z$ e) h0 {) a5 B
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
5 `) i+ D$ p! {* l) I0 v mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
& }) k' m8 x: U1 m; M mcasp->regs->PFUNC = 0; // All MCASPs
2 L. O3 ]* J6 `9 Q1 @& y, _) B9 L# W mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX10 ^3 b: v3 E% r" E7 @. X3 K
; w% \% ^1 ~$ l6 x; O% d5 x" L4 ] mcasp->regs->DITCTL = 0x00000000; // Not used
; h2 \* ^* ~/ m# x: X mcasp->regs->DLBCTL = 0x00000000; // Not used% m4 Z% j+ a% I" O2 M3 j" G, Q* X# ~' ^
mcasp->regs->AMUTE = 0x00000000; // Not used/ K: R- P% M2 M1 \( P% ?' a
* |, ^7 K; O3 j* T( S7 H; p7 }0 C# t$ A/* Starting sections of the McASP*/4 U3 k" q# N/ ^0 @* S( O5 Q/ \
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 8 O" B# z. Y3 Y7 c( G7 Z" s1 m5 z2 Y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 5 r7 W% x2 o8 h+ z
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
1 P$ X4 b4 s+ w+ r1 {2 @ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
0 A+ K" o. `2 Y8 j' l4 p3 _% B0 C* I) \' ]
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 8 Z$ w+ A7 Y2 }$ y8 T" y- D
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
. p6 a" g% ~% s" B; _' C mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
5 k: B4 [! ?; `2 x7 F9 d while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );8 r( O0 w+ d* N) q% L) }; K/ J
1 y; H4 e# t( f* Q. c1 l7 q mcasp->regs->XSTAT = 0x0000ffff;
- d5 c3 p' w$ V g6 E9 n# I- ?# l mcasp->regs->RSTAT = 0x0000ffff; ( \- J% l( E3 P3 {8 P
6 f/ ~8 {0 O. G+ I, @1 c
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
8 ] }0 [$ ^; z; ]; c while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );3 w7 J/ X/ G' q' a& _' ~
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ( Z. G: _$ `( T/ D. i5 L
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
/ w; q; v4 g/ h0 G/ ^, y9 m3 I
" U( x. Y8 t! j+ }- b5 f' s* A5 T- I /* Write a 0, so that no underrun occurs after releasing the state machine */) z( _, u% r" R( d8 I& J
mcasp->regs->XBUF5 = 0;
7 m; P; [3 K$ p7 L6 M mcasp->regs->RBUF0 = 0;( {& |& H/ |) E9 v8 l
: u' E Y+ W8 K- Y! [ mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
! f7 A% q0 m& ^1 k' ^+ m m while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );" A8 n/ V9 n) e$ m, a) @9 c8 @
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
5 z1 U4 H3 \7 ?9 |" _ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );* o( t0 {+ F) N( A) h' o) w% F
8 b' T7 x9 M3 R7 x4 A4 J mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; " Q' l/ A4 {4 G2 ]9 ]# F! U; p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );8 P: f5 J0 I& N) z. E6 X' @
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; . m, V3 ?1 e5 `
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );8 J8 Y& A) F) [ K) F# e* o7 U
( d! n0 g3 ]1 b7 c. H; \& A
CSR = 0x0000;
' D$ m5 Q+ W! P& T2 o, p INTC_INTMUX1 = 0x3d;
7 Q) H6 P# I5 L! w& n6 @# _ ISTP = (unsigned int)vectors;& v& a9 ?& ^2 I
ICR = 0xFFF0;
; o- T, }: T3 V" A9 ^3 q IER |= 0x12;
# K7 d# ~- g/ p% v% D9 G D CSR |= 0x01; * Y. k2 d* N6 j. k; B' [$ G
4 k k) r: N9 T" A0 y3 `( Z1 Q1 S c+ x# X
' ^8 q4 d$ _; q! e. f9 V$ y还有就是两个输入输出函数:& q- C F" C( P8 b0 d9 u0 |
void output_sample(Int32 out_data)9 o# o' x/ K n6 h3 J3 c2 X! ~2 T/ J
{
9 j+ ]3 N8 H8 m7 w$ v- H5 f AIC31_data.uint = out_data; & ^" e& k1 ?4 Y( C3 }# `
MCASP1_XBUF5_32BIT = AIC31_data.uint;6 V; w( M6 ~- M0 x8 p
}) `( V" T& I4 ?
$ ]8 ~1 W5 h1 y! g/ oInt32 input_sample(void)$ ^$ D0 h7 ^/ H+ L: o% k/ c8 M- W* @
{ 6 O1 K" X) [7 l/ N1 Z
AIC31_data.uint = MCASP1_RBUF0_32BIT;
/ n% C4 |* c3 E& H& | return (AIC31_data.uint);
' |3 ~! q3 c3 p! s) b}
3 I4 l4 p% L. b4 m3 f8 V6 V* y. Z. X& H
|
|