|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:, T+ d+ y. D4 g# _9 D% j1 g q
main文件:
2 o& _$ \, x& T9 N0 f% jinterrupt void interrupt4(void) ( }6 X# _# U* \, O" v8 b0 I; L# B5 i
{2 M" E; Z' h0 k0 z" A% Q
Uint32 sample;
) \4 `7 [( `9 _0 t' S: W. q/ ?4 L. C9 j g9 F8 P" ]" `
sample = input_sample(); // read L + R samples from ADC
( C# G( O- v* A9 g" t8 j' R' Z3 b, B output_sample(sample); // write L + R samples to DAC 5 x" H3 q" f/ q0 u: K9 R4 q7 Z
return;7 j. t8 l# a1 ?, z4 j" @/ N1 Q
}# G8 p6 X" x5 J& _$ z
+ M# C! u' z7 E* w
int main( void )
; |- y) z/ X- `7 U* z8 Y9 w5 q{
3 C( Q* ]# K5 X) a+ q1 j% u
4 Q6 `. x/ R3 N8 M1 z; s B& t; ~ /* Initialize BSL */, m% F) ] I0 D; g' _3 k; j
EVMC6747_init( );
/ E$ d, C4 j! B) c/ V /* Call evmc6747_intr function */ |+ [8 V! \" }
aic3106_init( );, X i5 {) B; @% c
while(1);: \9 Y% T" B" Q4 J" I$ ]
}' z$ X5 ?7 G5 t6 O& @
' `6 D+ J8 L( |# X& l3 y! E1 Q S$ w3 c
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题$ a; s! J9 O; q9 `- I
/* Initialize MCASP1 */
9 R8 A/ d; Y6 b0 B mcasp = &MCASP_MODULE_1;
( z; g( Y% E/ l$ X6 ? mcasp->regs->GBLCTL = 0; // Reset
8 `5 Y. m! z, J. C3 x, E- Y3 O mcasp->regs->RGBLCTL = 0; // Reset RX! t/ b3 V( q3 l' D; u# \# e4 q
mcasp->regs->XGBLCTL = 0; // Reset TX; r+ }+ T# \7 b p5 Q* B
mcasp->regs->PWRDEMU = 1; // Free-running' E* r3 e. e* v( r0 m6 s
// configure McASP0 receive registers& ^3 t5 X, e* C1 B9 e) L
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
5 w2 ^; B9 T7 c* F R- B9 m mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 ~' Z8 o% Z) b, v$ m) u mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
, m5 B$ H& D5 F" @# `% _ mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)* r8 }& p: X# e
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
& I1 K; S1 V W7 S$ ]4 ~( Y mcasp->regs->RTDM = 0x00000003; // Slots 0,1
- g2 n: m" ^: Y' Z' c, P mcasp->regs->RINTCTL = 0x00000000; // Not used
; d/ Q8 L1 f% B' s. I0 T' k mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256" A- `: A" u1 I" S# b% G5 b3 M
W: Y% ?9 l( D) \) H/ {% P
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used) b1 Q5 w; F, k- _
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus' J. U$ i8 V. M- K6 n0 n/ ] N
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
2 Q4 f( |. y0 L, F mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
9 T1 K2 \5 [- A- i' ?( p mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
) q3 h. t j b" x mcasp->regs->XTDM = 0x00000003; // Slots 0,1! T. b: |; `- n* s
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
5 o+ d$ c4 \, ?2 r" e. {6 S: P, @' i" s3 s mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256/ z. v2 d0 y- s
1 [ `3 C( B- k3 L- B mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN% |+ P0 O3 O. \2 P
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
9 b1 i* x8 U; X z3 p mcasp->regs->PFUNC = 0; // All MCASPs
' A# t+ V X+ s! f# h mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1 j" I) j4 j' K2 R9 M& ? \
2 X5 p( { r- J
mcasp->regs->DITCTL = 0x00000000; // Not used
- h7 n$ D% ]* l7 l( I( F5 u mcasp->regs->DLBCTL = 0x00000000; // Not used
. z7 E# b; b3 w9 o9 f& h mcasp->regs->AMUTE = 0x00000000; // Not used# D; {: j. c! q0 o2 {7 g
% k. e6 C! N* h8 T/* Starting sections of the McASP*/4 p3 l$ N9 s6 \& e5 l
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
. r% X0 M" b9 e8 V# r+ ~ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
# e0 s+ A5 X! d0 ] ^ mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
. `' B* X/ v% m H& V+ V: D while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );2 K* @/ |% m" w/ g5 I
; Q. K2 y9 h% V1 l5 V# M" a
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; . z( {+ @, ^# S) |' {8 v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
4 J5 A7 a8 _; l8 U) D: ~' t mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 6 e2 w% \! K: e0 [8 V$ m
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
6 D: y4 n, G9 h' g+ a0 c6 O0 G% S. M1 R& x: D
mcasp->regs->XSTAT = 0x0000ffff; & x/ h3 E2 \, {, i- T. N4 g
mcasp->regs->RSTAT = 0x0000ffff; 9 j% L$ {* v! I% Y3 ~7 n
' g2 B9 z8 \+ e; W$ x( `
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
$ G9 R& T3 ^! u" K9 t# e/ h while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );: z& \8 x" r6 K4 K3 b
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
) d2 T. u$ G/ h# Y while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
2 @: X7 m$ u$ ^( }
# r1 Q9 L. T L7 s2 P2 s6 N /* Write a 0, so that no underrun occurs after releasing the state machine */
, x. E" l& `$ }3 z mcasp->regs->XBUF5 = 0;0 e% Z# l4 U" d% l* x9 a F5 G
mcasp->regs->RBUF0 = 0;# y: R3 l: ~0 ^. O4 n
8 K V% D1 B7 S mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
1 d. j- w/ d. o* ?+ G K; T while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );4 d1 c) U) g" F
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; # e/ l' Y) `, b9 q8 T# @, o9 ]
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
$ [, `+ f+ z y& \* n- r. ~9 b
- z/ X4 N1 l: f* p# ~ mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
; Y& X) s6 o3 S. a while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
7 m2 Q/ B( b" [1 f/ a8 O5 Z, G mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; , B) i, d+ h/ s5 d( y, X* k
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );8 [6 a* G( A Z; v) T8 u
' {) o$ ^: G6 L* y* i, Z CSR = 0x0000;
0 J' o8 g7 K& w. {# ^. E% [) w INTC_INTMUX1 = 0x3d;
3 U0 l2 E( h& F ISTP = (unsigned int)vectors;
1 ^8 ?, z2 k- n! B5 h ICR = 0xFFF0;
6 S M; o% W; E IER |= 0x12; 9 X5 G. |) G2 w3 x4 @; N+ u; V
CSR |= 0x01;
, L6 C$ \% `' w) m& y
1 O' {0 x6 F, P, h
- I" `0 q* s u9 x! i# O) F$ a+ U! M& S4 d8 T& i* O1 o/ x5 q$ g
还有就是两个输入输出函数:
; ^9 d( z! [$ `: d) ?* L. nvoid output_sample(Int32 out_data)9 n2 U* S3 E* U, N
{( J) y9 R3 p5 ^* f+ f# g0 {/ n
AIC31_data.uint = out_data; , h1 l7 P5 d D0 _
MCASP1_XBUF5_32BIT = AIC31_data.uint;
2 T p$ k# s3 {: n. b! ]4 x ~/ n}8 ?( T8 }( F9 r# H' ~; q/ v! H5 x
/ O7 j# `7 j) c+ t
Int32 input_sample(void)6 y& m( h% J5 O; Y: a) \5 G
{ : q" E0 H1 H. o) V3 Z; K/ D7 s# r
AIC31_data.uint = MCASP1_RBUF0_32BIT;
7 E' x% L# X. ]! h: C3 |# x, W1 ]. O return (AIC31_data.uint);
/ k* Y! ]1 @% m: W8 Q}
* J. }3 ^/ f* F8 ]4 y7 |1 H# T
|
|