|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
1 y( x' U) C1 B" q2 Fmain文件:
! ?$ K* J$ I$ |interrupt void interrupt4(void) % S6 Q9 E7 Y' I, M4 y; B
{& C$ @; _( b! M; H Y
Uint32 sample;1 E! ` T2 s$ s
- q% |/ Z4 Z) G sample = input_sample(); // read L + R samples from ADC
9 G8 g/ ~; \, u4 ~& D7 Y0 W. a& C output_sample(sample); // write L + R samples to DAC
: [0 v5 B q2 ?; U8 o( O return;1 q1 k4 S K! k- F) ^+ k8 i2 e6 N
}
# F; _& h+ Q% y
9 K: m( F) V9 Z0 ~" `$ Kint main( void )2 G5 s2 \# ^3 l) m( X1 R, [" k% ~
{
2 @, I5 T- }5 B5 g! _6 X4 W0 U
3 z, T" m! m: g6 f" s /* Initialize BSL */
, K8 {, m$ r) t4 F EVMC6747_init( );
: Z+ ~) q' H2 p: U; M /* Call evmc6747_intr function */
0 w2 o! a6 T4 |8 T+ K aic3106_init( );
/ l6 m3 k: d- A2 C T0 L while(1);( d5 S4 A) k& o0 B! {
}- |4 R% {% f5 g
% R# d3 k9 f ]8 L% M, k
6 T: ^4 a! J1 F8 _
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
9 j2 x x+ p3 F/ u/* Initialize MCASP1 */
9 e" x2 |7 K% m( g# C mcasp = &MCASP_MODULE_1;
, b3 z6 w# G) S* [ mcasp->regs->GBLCTL = 0; // Reset
3 A6 Z1 H9 S4 b7 h% ^: X1 k+ [* T mcasp->regs->RGBLCTL = 0; // Reset RX/ ^9 h0 _( ~3 P* U0 }6 @
mcasp->regs->XGBLCTL = 0; // Reset TX
9 K0 f/ P( E( I mcasp->regs->PWRDEMU = 1; // Free-running+ d' U. n1 |# e: x5 O- {
// configure McASP0 receive registers/ e6 @2 m2 B1 J5 H- M! g8 b
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
n: n# a8 Y6 e5 P; ~4 W mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus1 P, l! t7 f+ h# S: V
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
9 U% h9 c( H0 P8 ^; a* j& w C* @ mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)* Z. O4 S0 u3 {9 y o0 H4 n
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)- P6 H- q8 e: I
mcasp->regs->RTDM = 0x00000003; // Slots 0,15 d2 m. q3 ]0 Y! t
mcasp->regs->RINTCTL = 0x00000000; // Not used" D1 T( z1 R! Q7 S2 {5 C
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
( v( S: O0 `* g/ a& ?/ i ~, z. x) j1 E) S- B$ t( s
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
- Q u- F( i( {4 c/ m7 Z' s. d mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus" @+ ?& P$ d1 @( B: i5 L f
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word% A2 u2 T! Q6 l2 z3 X
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16+ Y- T; Z# g$ h; ~* W6 `
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
- Y. G8 }7 ^% c( i9 R! J9 a mcasp->regs->XTDM = 0x00000003; // Slots 0,1
9 _5 I* |/ D/ T% K& A, R8 l mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit3 r' Y) N/ C% E) G7 ~
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256, A) a9 `& g8 D- K8 C* `8 Q
2 @7 @4 q& f9 ]7 m mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
4 y1 r) [& r1 V" A$ | mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT! s, h' e, A! E2 v
mcasp->regs->PFUNC = 0; // All MCASPs
- v9 E7 R+ n; I# X5 F- G mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1/ ~6 g# f! l1 f4 F. Z) U2 ?0 h" |
' N, a3 S: R2 Z( S6 t
mcasp->regs->DITCTL = 0x00000000; // Not used8 v* Z0 w) A# j
mcasp->regs->DLBCTL = 0x00000000; // Not used) z! o5 O* Y& J! C& ^
mcasp->regs->AMUTE = 0x00000000; // Not used$ u0 Y/ b- Q! S- q+ n
6 X( @* ^2 D1 H( J$ B3 L0 b
/* Starting sections of the McASP*/! m ^7 a. X- _6 o' \
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 8 E* I$ u6 U- Q9 p5 p( W; L) P
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
' Q# O- h7 ~, R; t8 s mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ! ]) j2 D$ ]! ^) F3 W3 P7 z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );, A, O) M1 P$ ]/ D
' H* w# Y7 n' B
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
3 V9 _( Z- }; c$ F/ C/ f while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
% E2 o8 U3 g/ o) r5 Z* Q mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
8 p* l! ~$ }/ `6 v5 ]! _+ \ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );9 U, ~; G+ o% g% ^% G* j
6 o H* k+ W+ n. |
mcasp->regs->XSTAT = 0x0000ffff; ( \8 W1 O: A' }. }% [- t" f% _. R/ U
mcasp->regs->RSTAT = 0x0000ffff;
. j0 n2 W! X! \1 b& o/ b! b# H- v# |( N& ~& i
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;+ r& L2 _' z4 t
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
* M. |. E1 x, W% G% s K6 _" V mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; + d* O4 y, R& {. n Z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );9 O! j, n4 n4 A& d" W s d. {
- N; X/ {# j7 h /* Write a 0, so that no underrun occurs after releasing the state machine */3 l3 C3 a+ H8 l/ r& b( X g
mcasp->regs->XBUF5 = 0;
7 O4 x% _3 N* z4 p' Q' J8 m+ a$ l mcasp->regs->RBUF0 = 0;
* a( `. n ~1 T
6 l+ @- W& M6 H: }$ q* P9 ^5 d mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; - b+ P n( L q! I1 \8 W5 A
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );$ |; T5 B& D4 U) k3 p/ H& `
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
8 p# J+ n# a- M9 } while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
: Z/ m# e. B: z1 d5 L8 @; @3 ~6 n' l1 M0 _( ^
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ) a, C4 R/ A2 {3 b D Y9 l
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );2 }3 o; x, T0 b) m
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
8 p9 L/ V1 W) O! K while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
# {! @; a8 e1 P* P& H1 I5 i$ k/ x& B" J o
CSR = 0x0000;' {2 K E1 ]& C0 P5 b2 j3 l+ F
INTC_INTMUX1 = 0x3d;8 V ?0 z% W# @3 E/ {, y$ h
ISTP = (unsigned int)vectors;0 m( s) x' c W% N
ICR = 0xFFF0;
# d3 l" N; w4 @0 _" j2 } IER |= 0x12;
* @. p) w1 j; S- _ CSR |= 0x01; 9 `6 t& F8 Y, I: L9 ?1 S
* k1 r, g* H$ X0 c
. L2 X9 B1 _! b5 t9 D% l0 N
# t9 d5 l O* J8 W还有就是两个输入输出函数:
' s; Y. A& s) w: T( f* hvoid output_sample(Int32 out_data)
+ U/ {" Y" P' p j5 d1 Q{
/ n+ V& F) j; {% N7 `& _' Y AIC31_data.uint = out_data;
& U3 B: U w! Q/ n MCASP1_XBUF5_32BIT = AIC31_data.uint;1 s/ G+ z5 g) r. ~
}
6 M& u* g$ V2 U% v$ E p- f8 w
$ M! _; i7 j9 v# ]' l+ EInt32 input_sample(void), c; F+ s9 R, I u
{ 9 q e1 q2 X" |' Y8 h
AIC31_data.uint = MCASP1_RBUF0_32BIT;
( x \/ d/ J+ J& D5 B return (AIC31_data.uint);! s* u3 I( C! A9 g2 ]
}! u; `* O0 {* L R* ]5 Y
0 Y2 ~4 i2 V& w# n9 A+ ] |
|