|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序: ~, u8 W; U# c, Y" K$ s2 m
main文件:
5 t: w% H. C7 [8 ^) pinterrupt void interrupt4(void) ( A4 K, N- [, c& N& Q' P
{
& f9 x" ^ D) J Uint32 sample;# Q1 a/ |& B6 c/ ` u
5 z( `* G4 n8 a8 |$ x& C! W sample = input_sample(); // read L + R samples from ADC
8 R* C8 n: k: F# M0 G/ w output_sample(sample); // write L + R samples to DAC : K% {6 ]9 B+ o" |
return;
9 e3 m5 N, F4 Z: q3 z J' i/ z}- k- L u( w' z( X2 ]$ ~
# {9 }7 u& E: H! a3 N
int main( void )
7 f( }6 U# Y3 `{
& d; F/ |( A; r" f$ E
: V+ i) L6 J0 T0 M /* Initialize BSL */
2 o6 y3 l9 X6 j1 y) U& l+ ` EVMC6747_init( );
8 A7 P. H1 R- F$ p /* Call evmc6747_intr function */
) s' e! B4 k6 x# i3 L$ \: E aic3106_init( );" h1 q1 A4 H9 R) t: p% B! I
while(1);4 e. ~, O+ y h2 h# G* Z0 }
}1 T6 o# B7 ?+ o# B+ o
: b# b6 y& u+ b: B
# q# L1 y+ c* Y- z" ~3 X. [
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题" x3 ]- C" ?: K. q! }
/* Initialize MCASP1 */
/ t. i0 J+ s1 u! |7 U) F mcasp = &MCASP_MODULE_1;
- A+ \% e' S3 w mcasp->regs->GBLCTL = 0; // Reset, t; x& Q* L. N0 w5 \6 G
mcasp->regs->RGBLCTL = 0; // Reset RX2 O5 g2 P0 |& E# U: p$ I
mcasp->regs->XGBLCTL = 0; // Reset TX
' \' `* W. c. A- r5 h mcasp->regs->PWRDEMU = 1; // Free-running
$ P5 J$ o5 |# d& F // configure McASP0 receive registers: h/ z9 [) j. I
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
1 m) r: _) f- |! j9 s mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 ~ T) P3 O2 U* j6 o& E o( ^ mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
3 Q9 E0 H7 {9 k) O( }# r& l mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
. b& [# ~! O$ ?/ q7 e, V2 _ mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
! Y% t% a" @- `. h# `8 s mcasp->regs->RTDM = 0x00000003; // Slots 0,1
! u6 \0 L3 `. n mcasp->regs->RINTCTL = 0x00000000; // Not used) }* K6 y/ J6 m0 k1 D
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256% Z2 ~2 L9 A$ ^+ A0 D& {$ I2 T
& s2 N {/ V' k* B
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used( `$ Z' b* g7 V w
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
$ S) M; T3 \6 S. x; O+ h0 B mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
* C; W$ m, ]# h2 ]' s mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16: z" m* O$ s, N' G6 S5 o
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
" p; R; C. _- R3 i9 y mcasp->regs->XTDM = 0x00000003; // Slots 0,1' j% G9 a# F. c) r7 P
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
. A% l/ U* N0 i" t9 O8 D, i mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! k3 E5 a, g5 X7 c
" t+ ~. g6 i) D! Y9 V( A+ \ mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
z+ M: ]8 ?" T mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
/ W( C+ U. W$ R0 V" ?' L9 D mcasp->regs->PFUNC = 0; // All MCASPs
& R% n& A5 J2 {. a0 k mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
# v3 e ~& F6 o$ L: A: a" C7 g
4 j5 W: H1 f1 x mcasp->regs->DITCTL = 0x00000000; // Not used: X. g9 u, I( ]1 A9 P0 T6 B0 I3 \2 d
mcasp->regs->DLBCTL = 0x00000000; // Not used# `- g8 B4 X- J- z
mcasp->regs->AMUTE = 0x00000000; // Not used
! q2 D+ B) O, U, K
5 X3 M! _4 O; S$ i3 ?/* Starting sections of the McASP*/
' { }3 J F$ V9 V/ E( a5 o mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
4 b7 L+ F) t ]3 z- G' J while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); + S# Q/ R; z2 ]+ O1 c" _4 s
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; * r. J7 |9 H- Z1 x
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );: X7 E$ w3 B: r2 Z
) ~, z% X. W" n1 T% j) t mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
) ? g: ` S" G4 k% \ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
8 Z( f3 S" H: X4 k6 m1 _+ ` mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
0 T) ~1 @6 M9 t) i while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
* K( D- u6 b0 a, `& I! d! u, l6 |6 S# h0 w, G$ D+ D1 _7 ?' ^( M
mcasp->regs->XSTAT = 0x0000ffff; + q. T) h; U- N. t& I& g. {! t
mcasp->regs->RSTAT = 0x0000ffff;
) q) m) V9 v1 ]8 i/ I, g. x' ?& {6 u& G) ^/ }6 W
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
" y, k( B- J2 L while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );) T+ ? r& a& A! s5 I8 ?
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
* ~+ C* p& j& b4 { K- l. L while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );+ t# ~0 ~/ p" l+ W
- ?% p+ e: w: N) U: q /* Write a 0, so that no underrun occurs after releasing the state machine */
$ N7 k* X7 n& a+ e mcasp->regs->XBUF5 = 0;+ s$ i" H+ C {
mcasp->regs->RBUF0 = 0;
2 }' w/ N5 A* q* z5 `% f, Z& O) d7 r
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ) z% W* |9 E( ^4 v& Y* ?" q/ z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );$ I, ~) N# A0 u- o \2 y
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
( `/ K# u% o8 O while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );( Q0 m5 N J" ~- r, g5 R- h
+ U% d) P+ I B( b) L* O6 k6 k! G
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; a, l/ @: m6 m" ]% Q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );4 W, w& t, q |8 d2 E
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
/ l1 b3 \& ~9 p while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
8 G$ D$ [4 O, @3 L) a* ?% K1 y v; `* U# b/ G! q9 _ L5 T
CSR = 0x0000;
- I- Q" `; y& { INTC_INTMUX1 = 0x3d;% k/ s" d, B9 k7 u1 u! q/ d
ISTP = (unsigned int)vectors;: x# f+ _3 X8 P5 x' o
ICR = 0xFFF0;
: Z0 e& a& @. v7 @$ Y5 _ IER |= 0x12;
, W$ J6 l% P4 M) w( S6 Z CSR |= 0x01;
) N$ ?2 @6 a- w7 g& Y2 @& l* ^6 E) Z5 P2 q- p3 {
5 E, v# A" K) l) k2 k
% j9 \' ~- V- b4 K/ p
还有就是两个输入输出函数:3 L8 n, w D/ h0 S
void output_sample(Int32 out_data)
: q R+ a7 `9 ?' @! Y{
! ^- G! `* @6 |2 I AIC31_data.uint = out_data; - J/ ?# X3 F3 z0 k4 @5 f1 C! t. m
MCASP1_XBUF5_32BIT = AIC31_data.uint;8 t4 m _. \1 m* o+ `
}
* X! ^- j! h$ H; K! K9 N0 n2 \8 _: L% m
Int32 input_sample(void)/ C# P( }6 }9 E8 P% r: X
{ 5 |0 Z7 b2 Q0 K5 A8 y
AIC31_data.uint = MCASP1_RBUF0_32BIT;* o- y# i" s) P% z' r: q" u+ L9 |. Z
return (AIC31_data.uint);
/ ?* S5 S [! L5 @}6 ^8 @; f, ]& g5 F
* ]: w" a5 e" j+ [* L4 K$ l, |. u
|
|