|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
, i. s& G0 x0 _; q2 e' M9 _( c7 Umain文件:
& ]. W z# H6 {, ?$ linterrupt void interrupt4(void) $ w1 z: M- U+ {4 f; l$ h
{9 x+ q; a' X( o7 O
Uint32 sample;2 h" E3 _8 T3 t; V9 D
, Q! U* q0 L* f( H sample = input_sample(); // read L + R samples from ADC/ g0 x1 V# i* A# i) q
output_sample(sample); // write L + R samples to DAC 5 m7 h- R% c& B! D& B
return;. ~. t8 V* T6 U5 R6 \/ y- Y. K
}
- e, b: v6 Z% L/ d5 X# a$ T% q7 D) |) `* L4 T! m
int main( void )
- D/ |- [/ m' p- U% ?$ C4 F{. D" g! G5 U$ |
2 J9 }) J, J/ W- a* [- S /* Initialize BSL */
! G( I6 n1 x; j3 G. T0 m" _9 Y% g EVMC6747_init( );
8 z2 B' j# M- P) ? q /* Call evmc6747_intr function */
$ K' V$ ~# z1 s aic3106_init( );
; R3 N" J/ B, v while(1);( S. `6 W( w6 g. S( i6 `( S) _
}
5 _$ y; h+ W+ @, r( A! G; U/ z( _. S" `. o$ Z
3 M# R1 p. l. i8 ]- m; e% T! g
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题1 G) M% s# S' ~: s& R
/* Initialize MCASP1 */
5 J( Z! r8 y/ ~! I1 k4 |1 h6 O mcasp = &MCASP_MODULE_1;
2 @4 W6 g7 G0 _6 r1 q) M mcasp->regs->GBLCTL = 0; // Reset$ {; d# y2 s# q6 j. o7 B S
mcasp->regs->RGBLCTL = 0; // Reset RX% i) e" v3 c- D/ R7 w
mcasp->regs->XGBLCTL = 0; // Reset TX- Y" W$ O' m; @- E
mcasp->regs->PWRDEMU = 1; // Free-running* G4 F8 _5 g4 ?% U# H
// configure McASP0 receive registers
( ?9 j) M" H% u- c9 r$ D2 i8 j, l; x mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used2 a0 W C& p/ l6 A
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus! N9 R% U: w3 f% Y
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word# Q/ Z2 y1 M# S+ O5 z$ a
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
6 N- S/ ~9 P, u mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
# E# Y T, p6 g3 s mcasp->regs->RTDM = 0x00000003; // Slots 0,13 W1 E7 i: {: ^, t7 k d
mcasp->regs->RINTCTL = 0x00000000; // Not used
) U$ Y ^4 z- Y mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
) s3 J6 d! S8 C% B, ^/ t
+ j8 R3 t* u) @/ ]8 F5 ~ mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used- `( X' H& N8 ~6 `
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus1 ?" Q. W; p y, E
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
, [. p" ]! Q. X$ e$ Y6 i& M: J2 I mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-161 Z/ o# I$ v" n5 m/ o
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK# i$ T% M6 Y5 }! R6 T" B
mcasp->regs->XTDM = 0x00000003; // Slots 0,11 s" g! p1 A: L# s, V+ r- |
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
+ |" j" D3 S- ` mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2562 m+ l$ u/ |+ {2 |0 w) N+ z7 b; m! n
. i+ l- z. _ B) J( v9 I- P
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
- ? B3 B0 g: v mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
9 t- D# o! V5 `. r; C2 ] mcasp->regs->PFUNC = 0; // All MCASPs! X& y; e7 G& J0 v
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX15 I. C0 S3 W0 y8 O! R' U
" S u6 `! B% x* \2 q1 h mcasp->regs->DITCTL = 0x00000000; // Not used8 z" K% `) e) O# v
mcasp->regs->DLBCTL = 0x00000000; // Not used& L; c* Q/ K# B2 y _+ L) D
mcasp->regs->AMUTE = 0x00000000; // Not used
% T. ?6 u, R: c, @$ S' C I4 p @2 T7 a! I5 O
/* Starting sections of the McASP*/+ ]5 [/ l( ~+ V; X* s1 @. c
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
" @ e4 P e! }- j while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
' _) E/ n3 H; r/ Q2 D& N* n' J- F3 E+ f mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
* o( N) |. K) m& N s9 ?8 C& u while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
# s3 G1 d( z* u* H$ G) w* [
" l3 s" b6 z: d* \4 V mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; , M5 m; D/ _) U2 h" B2 D) X
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
7 [& {4 [: t! b8 a mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ' Z2 v6 w8 a5 {' P8 Q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
/ q$ m4 \6 }% T, M/ [: e& \/ ^
: B5 i& i- _( d% X3 f8 P mcasp->regs->XSTAT = 0x0000ffff; $ L" L7 u4 l9 m$ ~+ F+ E
mcasp->regs->RSTAT = 0x0000ffff;
& F. o& H, V% ~3 O1 t1 i' S& E6 M- r" O/ t" p
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;' a; M( K$ Q9 O# }* {! r2 m
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
3 C/ y" R- Y( i. I mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; # q# i% U n1 M
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );0 k q7 q0 f |& W/ f# M. u [ a' ]
. a- {9 H' W2 V& g* J
/* Write a 0, so that no underrun occurs after releasing the state machine */
q5 C) P) o% {0 Z mcasp->regs->XBUF5 = 0;
8 O* E: E6 [. P0 p* \; _8 W mcasp->regs->RBUF0 = 0;/ n1 j9 y. R6 L. Z3 v* F
0 H( q! [1 ~8 K
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
: f8 L$ m- t$ \9 t while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );- b9 k& r9 c- g0 _+ Z" c- J
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
( Z- m* K0 w; H' `1 a+ a while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );* g& h" @5 c4 g' d: X
. ]$ P, r9 Z. I2 c
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
( F$ u7 K1 m) X# m% s& m6 q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );& J3 ~: o% W: O# t# s$ @
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; / c3 r y! c* H- {8 D; \
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON ); y3 z/ o7 \% O
* c" d9 k' S& d, I9 ^- p8 ^ CSR = 0x0000;. r9 C' f A3 \' i: t
INTC_INTMUX1 = 0x3d;
2 _) p! i8 G& D6 Z/ r: L ISTP = (unsigned int)vectors;
5 v& p8 j. |. K8 n ICR = 0xFFF0;
& C. f' J6 {8 A( _ IER |= 0x12;
/ x0 x( R. @. ] CSR |= 0x01;
" J; m- J8 b: m2 z+ K9 i* D7 e. e- M6 ^2 w1 W. D2 J2 ]
$ k) s0 R# u0 D4 h" g% P9 [) w' U. j7 ~7 M4 e S0 ^
还有就是两个输入输出函数:
8 \9 z/ n. `; o* R$ ?, o: b" Yvoid output_sample(Int32 out_data)
* I6 G) x0 T4 Q+ Y6 J% F; m. l{
8 \( u) U: \1 @- ?6 t AIC31_data.uint = out_data; q! c6 J& F+ i) z: `
MCASP1_XBUF5_32BIT = AIC31_data.uint;
5 c$ V0 T0 J1 t: g9 k}
# [( e+ v! N5 C9 T5 B+ e0 f9 C: y; B" {% j. U" q
Int32 input_sample(void)
1 T% Z, T; C' z8 Y" s: S{
: N7 J9 c' P3 Y) q! e AIC31_data.uint = MCASP1_RBUF0_32BIT;3 x9 S0 Z# q, x- q5 C# E6 L; D$ c2 M1 ~8 q
return (AIC31_data.uint);" ~1 ?- U( I8 Z
}
5 `+ N( r# {+ M, r4 X& V4 l
* L& N0 k* Q8 k' w2 f7 \ |
|