标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 [打印本页] 作者: yusijiangchengm 时间: 2016-3-15 16:07 标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:8 v) g7 m7 ?5 [, i3 M
main文件:7 D* P: P6 W A8 l
interrupt void interrupt4(void) ' b$ v8 X9 v" M4 v
{ ! {: y5 n( V$ U! w* `$ V Uint32 sample; 3 H+ C& U! U2 p7 \2 B+ q" F3 I ' U+ Z! O8 v, t4 H4 s0 Y sample = input_sample(); // read L + R samples from ADC. |- u% e9 @1 w/ R, ^3 {' S( }7 Q+ i* F
output_sample(sample); // write L + R samples to DAC % G8 P+ [. }% r% o" ]9 a+ G: {! c return;6 ?* A9 L# W: Z# n
} 2 e; Z& Q- H3 V# p, t: p: v: l5 B0 K$ N
int main( void )1 `" `. C- s) l$ n
{ 0 p6 G$ G$ @& A- @2 K: P* W( U. n0 ^; T, t+ ~# f; K! D
/* Initialize BSL */ ( D8 i# y0 N( n EVMC6747_init( ); ; k, L4 R- t9 _9 G+ _" z/ b# a /* Call evmc6747_intr function */* D5 ~. w+ O2 X2 Y! ]
aic3106_init( ); 0 E0 w4 H7 o! H& B2 X- a& F while(1); + z( z/ y/ _3 m" n: t} x4 @3 }; O4 m& S" K i5 \5 m, F( @3 p5 k+ n2 c
- Y; V8 F" N( E
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题 9 w$ v' x& b' ^/* Initialize MCASP1 */ 9 r8 }2 Z2 t- o0 _1 W mcasp = &MCASP_MODULE_1; $ d4 E2 h9 S8 \& h6 L- P mcasp->regs->GBLCTL = 0; // Reset8 i- M( o* C0 f: u/ Y* h! U# o
mcasp->regs->RGBLCTL = 0; // Reset RX6 e4 C d6 [3 J a# ]/ @
mcasp->regs->XGBLCTL = 0; // Reset TX $ y& T- j' y+ E% Z( V mcasp->regs->PWRDEMU = 1; // Free-running 6 E& j) n+ ]" u4 B // configure McASP0 receive registers 9 \, n8 H+ ?# A( w, i4 \9 P mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used X1 F c* p+ S$ X6 g# R# o) m7 R
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus - |3 x' i s, f+ r mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word& h% `' _# M! l' x# C) F& b
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side) # H5 {. W0 ~! m; |& w mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side); S/ z: W8 M( @6 B
mcasp->regs->RTDM = 0x00000003; // Slots 0,10 ? y' y( P( ~. U* E7 Q2 { Z4 m
mcasp->regs->RINTCTL = 0x00000000; // Not used1 [! a; g+ l8 _& j
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 j, h. a1 k& y) o7 K
3 l9 c3 I5 V1 h8 ?
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used! x5 s5 N' X/ w3 C" D. K
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus % X2 u. A/ W( N. M( f1 G0 P- K! E mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word * K. d% d& N% p- [2 E mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-164 b) f" o; w* [& y
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK 1 P5 j( G" W* |0 [6 } mcasp->regs->XTDM = 0x00000003; // Slots 0,1 ( l- |: ]* q2 T, D& w- |# n9 L9 i mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit M+ |" Q" V: p7 b mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 & J( _1 n5 {5 n* b9 Y2 [ 5 B0 Z. p+ I t mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN ) Z6 t: R& o% J- Y. i- b6 ] mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT: B0 s# g. c) R5 M8 j u6 Z
mcasp->regs->PFUNC = 0; // All MCASPs4 m! R U8 F9 M5 v, T" _( l$ y
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX14 s4 }- @1 d$ G5 p
0 M) x" X) S, X% D2 F8 ]9 G
mcasp->regs->DITCTL = 0x00000000; // Not used0 u1 d/ f J3 ^+ x D" ^8 n& ~
mcasp->regs->DLBCTL = 0x00000000; // Not used 2 ~' W2 \( v" r& {+ R; b mcasp->regs->AMUTE = 0x00000000; // Not used 4 y/ Z- ^7 H& _ ( N# C" P. u+ T/* Starting sections of the McASP*/5 V8 ^: }& P* E8 |4 {
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; " C7 [4 I/ N3 c
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 1 P# E" Y7 x0 A; E% a) E" u) Q
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 7 ~/ V. o: I! B
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );8 R4 N/ o" I" c5 `
& g. y Q3 k. B) d) \/ w& N# W6 g0 b
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ; n b* w5 L6 g3 s# E& m+ g* \
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );6 w9 I b, K8 ?3 D. `
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 0 P3 Q& w% \7 S5 u. Q8 i) B2 B while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON ); + f- B" J% A Q $ w/ y& ^ ]& T mcasp->regs->XSTAT = 0x0000ffff; ) q4 i% x* a* d$ u/ ?2 s. N [ J mcasp->regs->RSTAT = 0x0000ffff; " [: m9 w% S1 W" Z( q: b ) m0 G, P# u1 G' C# M( D mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON; # G: b& P! D" X5 Y; P+ I7 d while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );) Z9 a% _% a1 @2 q* L }# R0 ^
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; & \; o2 I) e3 x, r. Z& C# k; P8 b( ? while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );1 [' B* S t1 u% e2 l! u% |$ ~( M+ C. y
; Y1 f1 \; @/ q+ e; f0 s N /* Write a 0, so that no underrun occurs after releasing the state machine */ z, j' u5 R l7 e$ j mcasp->regs->XBUF5 = 0;1 { t+ q1 G3 z' K! k: c5 z
mcasp->regs->RBUF0 = 0;& K3 Q- J6 {7 f: ], g; R
! x6 Q- ^2 W7 h" s: J0 a" m mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ' v% @, U6 t x& H/ u0 Y% a+ v/ q3 c while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON ); , W5 P. W' w6 D( Q. f- D' g mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ]* q, W* W) D! W5 B0 @
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );# a9 X ^2 h |6 i( X( r. I% ]
T5 b6 H* u4 B4 X3 X mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; : M; L4 g, h/ I3 {) S* J$ v. E while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );/ l, i3 P k3 g- D; j- Q: R8 |
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ( u- U/ [+ E3 s while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON ); ) U8 S- ]! `& K8 Y" X; T+ _; S3 Q! q- K4 q5 E' q: k
CSR = 0x0000;+ r3 I# f! p9 ? n8 g7 d
INTC_INTMUX1 = 0x3d; ( f* q# M7 k+ B. K: }+ A/ @: i+ h ISTP = (unsigned int)vectors; 7 L1 [2 `. N; k" R" ~ ICR = 0xFFF0; ; C3 |; V' J" M3 X4 b) X% F
IER |= 0x12; 3 f- {/ y+ x; l0 y& D& V; R
CSR |= 0x01; 5 P! p0 w& G, g/ B. V7 p
" J8 q% Z' Z/ R0 C- f- {; t& q% P3 ?& ]% ]8 K% W) @6 u( Z
0 O) D8 X1 n' p/ O
还有就是两个输入输出函数: 6 [' u% K* x6 Ovoid output_sample(Int32 out_data)' I H0 l! n8 W6 n g
{ ( \) k6 X. z" h! N/ M AIC31_data.uint = out_data; , C ]4 {8 j! A, A ?: x' [
MCASP1_XBUF5_32BIT = AIC31_data.uint;6 V4 Z4 B7 V. N) K, R0 t9 ]
} 3 s2 l4 U; q' _# R' W @3 X3 c: C2 N4 w+ @2 b* C$ y- ~
Int32 input_sample(void)/ p `# W& M" G3 M& n
{ $ J& |0 \ P3 }. H
AIC31_data.uint = MCASP1_RBUF0_32BIT;$ \' f, _6 \2 S" y- Q0 B$ l6 G. g3 y
return (AIC31_data.uint);8 _# g" A4 A6 \6 f
} ]% g# v$ d, W8 ?+ a" C
6 ^1 D4 @8 y) ^( J) G4 @( v; f作者: human 时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)