|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
8 ?0 P+ O7 U( @5 P2 z6 Tmain文件:7 d9 |1 F1 E* ]& H# ]
interrupt void interrupt4(void)
6 U+ F8 X( X. ^6 W4 x{
* U8 d" i: J8 ?; D, f Uint32 sample;. o3 i/ h$ Q) d
1 A4 Q8 p8 d) s
sample = input_sample(); // read L + R samples from ADC
9 M; Z) s: O( c; h output_sample(sample); // write L + R samples to DAC L+ B; N2 d& f! [: [0 K, f
return;+ U+ S, j. J* R5 }
}
! u# S5 J0 v0 G7 Q( X8 q
( G4 Q; F) t" Z$ C" Kint main( void )) O4 {0 [1 k) {
{
5 O/ y" P1 l( q( c& p, `( k# a8 R
- g8 @( X E; s' F9 j /* Initialize BSL */3 n, ^) s, ?; q1 \
EVMC6747_init( );' o9 l" w8 h3 Q9 N, m I
/* Call evmc6747_intr function */: Z- V4 u. k2 e1 @- Y3 N7 T
aic3106_init( );, D# q) e3 i2 Y. m7 }
while(1);
4 O6 v) a% g6 V! k% W}
- f2 B6 h* n* Y, s4 Q9 |& ~9 m4 `
8 d& l* j% I, Paic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
2 l6 X1 |/ y) c( G* f/* Initialize MCASP1 */
& u" J- C, t. ?$ @8 X4 n# ~0 v mcasp = &MCASP_MODULE_1;( M0 I/ y3 V6 h& Q+ [
mcasp->regs->GBLCTL = 0; // Reset% S9 m# v$ W2 C3 ]" f& z3 a4 N
mcasp->regs->RGBLCTL = 0; // Reset RX
, u# B5 s* H0 L; |0 Z mcasp->regs->XGBLCTL = 0; // Reset TX F [# G% C' |% W) M8 O ?
mcasp->regs->PWRDEMU = 1; // Free-running1 Z7 }# t5 ]9 `7 ^# w/ E( k; ^( o7 M
// configure McASP0 receive registers
5 E0 k: f; T9 R% f+ j! m5 |0 q mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
9 e1 W ?+ v" z9 M9 i8 v9 p mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus h* n+ L& {$ H: Y; i0 V
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
( f l+ N4 W- K# Z- D& ^5 i6 ~9 z) p/ | mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
' w7 P2 F' c0 J# v mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
4 ^9 H, W; j+ {& _ \$ F* W mcasp->regs->RTDM = 0x00000003; // Slots 0,1
6 u7 {5 @5 l; d mcasp->regs->RINTCTL = 0x00000000; // Not used9 D. r' B' f7 @- T0 r
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256$ m/ H4 E9 s% p/ o( m# W
7 x; Y5 T# g" K1 W; q! p. y' a
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used: D2 Z/ f! R. X2 ?/ d
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ D% `. X+ O( }4 m' ]0 L5 q$ g! U C mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
, ]1 y9 W s9 \0 l6 s$ m' S; a" z mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
- b& v+ v& D; o( h4 v mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK9 ?1 l0 t/ l/ x( b+ c+ N3 }! a
mcasp->regs->XTDM = 0x00000003; // Slots 0,1& d% m* W3 u2 D9 t% ?3 C
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit3 S$ a3 c3 x* E! Q$ G
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256- o9 h$ Q9 Z0 S9 j' C' G
( J9 O$ {" u K; k$ T: [/ F0 k8 k mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN' ]1 }* I# R! E$ Q: A& o* _2 s
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
% L7 H; F" F1 i" }# z" j ^5 a# L mcasp->regs->PFUNC = 0; // All MCASPs& B+ {0 F2 [) N1 [- R2 N9 Y# M
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1; A: G B: U6 `; M5 ^# i( F
2 \' d7 e L) d9 a0 H% G! m
mcasp->regs->DITCTL = 0x00000000; // Not used
, T7 `; `, I. t* [ mcasp->regs->DLBCTL = 0x00000000; // Not used+ N" I/ G- f- N* |7 D; X: D
mcasp->regs->AMUTE = 0x00000000; // Not used
% |' f0 }( e4 M4 A6 e
3 V% R( F; V4 t6 X) f/* Starting sections of the McASP*/. d3 K! Q" M0 }3 P4 N6 j
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ' y" o6 }% F8 P3 z# w! H
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); . X4 ?6 x) b5 _- n4 e, f5 t
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
, W; @* q# p8 W6 F" a while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );0 h# f0 e) |5 p* c% U
+ d2 p6 C7 [# o) q0 j2 ]
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ) d' R9 X1 q- B: a1 l0 o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );3 O7 q$ V% }1 s* L# K/ \. D
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
: u" m0 q* l7 a1 c, u while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
1 r: ]' v4 j$ m- W3 J! F) H( u. j* {
mcasp->regs->XSTAT = 0x0000ffff;
( F4 X9 p/ V7 \, K, f4 H mcasp->regs->RSTAT = 0x0000ffff;
* Q U+ Z/ X N6 D0 o) k- P7 L) T/ E0 U# _8 X
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
! z- N" {3 ]# i while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );+ A/ `; n" Y' c. |4 V3 E
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; % t q: Z i, P
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );9 T, m4 h. ~$ p
& U2 g% Z7 t* u: l2 {( I& F /* Write a 0, so that no underrun occurs after releasing the state machine */
9 Y$ v* E, O+ \0 ]. L mcasp->regs->XBUF5 = 0;
$ ]/ k& j- ]& n' p, j/ e mcasp->regs->RBUF0 = 0;
# X; r' a1 D' o5 D7 F+ a
6 K: ~( P6 m" q) Z }3 a mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ! h3 j5 @# P# l, b; K/ b
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
k& |( \( A! ?' G& D mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
2 j8 O4 }" ~$ i3 i1 E* } while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );# u; H$ h0 ^8 ?3 q
% R! w* K8 a# ?# P mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 5 _# d, l$ W. _8 [/ n
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );' A/ U7 D: L& Z0 m8 G) L
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
! N; G( f" w9 J P while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
" d% k2 {, \. {, L! G- A& |0 \1 z" y4 R' \
CSR = 0x0000;9 T: R2 y# [% R2 d; |! E0 `
INTC_INTMUX1 = 0x3d;( U5 }0 K& \9 p
ISTP = (unsigned int)vectors;6 N. ^9 @6 ?4 I$ Y* u1 ?
ICR = 0xFFF0;
' v5 D9 ]& V3 q& A! c$ X IER |= 0x12;
$ G8 }2 G8 [5 g2 m CSR |= 0x01;
8 Y r E$ t9 c
# v' h3 Y$ Z3 R+ V3 [3 n9 O% _ b( S" a; g
2 K& _5 s9 s$ G" p
还有就是两个输入输出函数:
& }& m* J F. R W" Wvoid output_sample(Int32 out_data)3 N2 r2 D7 N/ N8 C( q$ m
{' Z) g/ @+ c3 P% o
AIC31_data.uint = out_data;
; A4 ?5 Q7 z! m4 w2 ~" ]+ f MCASP1_XBUF5_32BIT = AIC31_data.uint;5 E) d! y" ^. S' {5 A8 l# k
}" j6 E9 J, q I* }7 O; z- o) d, e% R
0 p3 S4 e% c0 Q4 LInt32 input_sample(void)
+ Z ~0 g W# b; C0 T+ i* i6 c" o{
( V3 Z3 r( F; t% l9 E AIC31_data.uint = MCASP1_RBUF0_32BIT;
, {0 W1 ]- a; A' Z2 { return (AIC31_data.uint);
( v7 f$ ?0 ~( ]7 a' u5 L}% D' D4 H0 g# G' i9 g7 {! F* }
0 ?& q+ Q# w: c$ c$ ` |
|