|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:6 @1 r( W9 M% s% K9 X5 e
main文件:. ~7 z0 S' U' f, S
interrupt void interrupt4(void)
/ @- ]4 w# t' Q4 p6 v0 ]{
8 N7 E* z( I- h6 }' M! M4 H) C. Y Uint32 sample;
1 @( @- {2 h+ q+ z- {% U% n& ~
; j' _ J! J# D sample = input_sample(); // read L + R samples from ADC6 H) Z' h8 J U% a# M
output_sample(sample); // write L + R samples to DAC 2 D. L/ ]8 p/ w4 W: F
return;: c- v* D5 P) g7 f
}
6 }) k6 I& ^5 A* Y. A8 s U6 t
* l$ ]$ n# ~0 W0 C; h, iint main( void )' o5 X2 A [( d
{* u* U7 S9 }( c) p! ]+ @
8 W( d6 [3 t0 Z9 i2 ~3 u) J$ f /* Initialize BSL */
% c+ \* g$ d7 ^1 O1 { EVMC6747_init( );
I) p! X4 |( m% e9 } T8 k4 ? /* Call evmc6747_intr function */
! y2 i1 K/ z2 f( h aic3106_init( );: }' O9 \, ^2 n
while(1);
( h) R0 J5 H* h% n% J! f}9 m3 o* O, ] p
" ?' p) \5 O4 k( d9 i8 Q
+ }2 H5 m. X' caic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
5 n/ R+ i5 N& w( i6 r4 \ B o/* Initialize MCASP1 */
0 t+ r- r4 m% ]6 @* c; f Y" E mcasp = &MCASP_MODULE_1;' y3 d. o9 m- L5 b
mcasp->regs->GBLCTL = 0; // Reset
: ~9 F( x6 @* n mcasp->regs->RGBLCTL = 0; // Reset RX" z" i; {& _2 Y1 d
mcasp->regs->XGBLCTL = 0; // Reset TX
& u) t. L" w) \( C& y0 k4 r mcasp->regs->PWRDEMU = 1; // Free-running l! N) j+ b+ D. w6 I' X. \9 j7 z
// configure McASP0 receive registers
) i$ \% W4 v1 d8 R3 b mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
. a7 y" ~# G' l7 {9 u mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 C! b5 A( @0 R4 j$ t- O mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
( Y: c3 j- U# }) c4 o; A mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
7 c( s3 r3 E3 T mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)2 Z; E' v' \8 }) n
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
5 z+ ]4 n* f* s# W& U1 m4 S( Z mcasp->regs->RINTCTL = 0x00000000; // Not used3 f/ U" Q9 P- X: d9 Q% m
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
|; y! E) Z% O* Q# r* n/ `0 o# J& ^1 }4 q
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used# B3 }$ m, O. m- o7 }
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus9 l# f$ L4 Z3 Y8 r0 R+ [, w9 |" q
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
& P8 F1 c- L Z mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-160 a3 V3 w1 F$ e) O& o% ]9 P' {
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK5 J( ^$ C& I: d) Y+ i" v8 y
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
; S" Q7 K! W" q1 t5 C mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit. M6 N" A) ~6 G7 Y
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256) j& u- {% k3 {& t a; G
* u3 q2 K6 V7 V mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
* Z% z+ P5 a! N# G mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT% ~1 I% M& D8 m
mcasp->regs->PFUNC = 0; // All MCASPs
. Y6 `# w/ n' O( m% {- ~% c. A mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1, k; r) p+ l* i- T1 a
3 B1 w( k }6 \: ?9 w, F9 ]! p4 D }; D# I
mcasp->regs->DITCTL = 0x00000000; // Not used! |7 ^8 i8 P1 P2 @- N C
mcasp->regs->DLBCTL = 0x00000000; // Not used
6 i' P2 \3 G7 M/ b5 X* z" \ mcasp->regs->AMUTE = 0x00000000; // Not used
0 l' b$ G( n2 ]1 u W& K, k5 t3 C8 x2 K$ _8 ]4 b
/* Starting sections of the McASP*/8 p3 Z8 o# i8 n1 `# @
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 4 Q- j. `5 O$ o) V- S/ W
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
0 E1 I0 Y( G4 F \1 ] mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
! S/ v8 o+ L+ D4 a! o7 Y2 H while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );6 e" B& a* n+ I2 ~3 F/ ]
2 u! ~, L& Y1 t mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 6 f3 [4 T0 u& k
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );( L- _/ S/ I; _% i6 ?
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
/ A: g5 Y* Y( r while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );/ j* m( f! c, @7 c6 `5 f/ W
) m" S, i7 `% g. q0 x3 h mcasp->regs->XSTAT = 0x0000ffff; / I2 Z2 _; p. Z( F7 X8 @
mcasp->regs->RSTAT = 0x0000ffff; L5 N( `' v3 f1 X- q
# P, _/ S: q6 ^$ y- ^ mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
+ b# k- h) _& l | while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
' M( l. s6 T( Q5 B- d mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
2 g# S* } ~9 M. g$ P+ E; I$ z5 x1 S: Z while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );3 p0 L; {& o- z& L8 G
( E) n# G% a7 i /* Write a 0, so that no underrun occurs after releasing the state machine */
$ B% B' O2 s% D' W mcasp->regs->XBUF5 = 0;! C% |- l+ W7 M2 Y$ U* h! s
mcasp->regs->RBUF0 = 0;
0 ~) ]0 S; b- y4 \+ l' t$ f+ }. b! U! E2 Q) D3 A
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
7 e0 a/ ?$ d) X6 Y# {( ^8 f! R, | while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );2 L! q- ~! I! m+ M
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
8 }0 u: H. R E: M: S while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );, O" Z' f2 D- O, A
9 ]% p: V6 W) U- `& b0 X; R5 | mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
& V! S3 [% `+ |% U! R while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
1 u& e' ^" e% v; N( r+ U2 ^) D* C mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ; i+ v1 y2 j8 E! P( c9 v: r8 t
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );) l& T8 H( V" h
5 f3 m) G3 M7 _. r5 c, U( H CSR = 0x0000;
. B; C x4 A2 a. {5 w! g) U) K INTC_INTMUX1 = 0x3d;
, E) X( c4 S v ISTP = (unsigned int)vectors;
9 C4 L8 L4 ^. |! |( F* d% q ICR = 0xFFF0;
6 S, B5 K& v9 H$ s2 E+ `: c IER |= 0x12; + K) Z. F/ H }- b( J6 u
CSR |= 0x01;
2 w! u8 _- c: ^2 y8 D ~- M' F% i; G2 U0 W- j8 n9 f$ j1 s
; q: U7 g4 d7 J" U# Z
) ~, z/ |: @( o+ ~4 N) B5 c
还有就是两个输入输出函数:
7 Z8 C8 H1 v A( Avoid output_sample(Int32 out_data)
0 Y! y; I0 B: L5 }! i, b+ p+ B{
/ Q2 Q: W9 r, [+ E2 u& n+ N: b) f AIC31_data.uint = out_data;
! W5 P- D6 X* Z- @& q2 f0 Z MCASP1_XBUF5_32BIT = AIC31_data.uint;
4 x- C& k: u4 d* f}
6 b3 }: i) ~9 M& E3 z
* i1 H5 Q$ y, F$ Q$ |4 s+ I9 A0 QInt32 input_sample(void)
$ R3 u i% |, V+ K: A8 g{
( c4 L6 N" t e" N AIC31_data.uint = MCASP1_RBUF0_32BIT;
8 |& G& _; {. @/ C1 [ return (AIC31_data.uint); _7 t/ S$ R, }. F4 \8 k
}
7 z3 G. F. ]# Z: H4 }6 \; H+ W% w: F% ^1 Y* n2 `$ R
|
|