标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 [打印本页] 作者: yusijiangchengm 时间: 2016-3-15 16:07 标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序: : h" H) a/ o. I4 i @% Lmain文件: 2 ]' k' _; r3 }9 z& o8 N# @: B. xinterrupt void interrupt4(void) 7 w7 p9 [: \2 W
{ 2 a2 v# } q. u7 ?% C" X Uint32 sample; 5 h4 X+ b& h# K e+ g" o) _9 c) j$ [( {3 E r- ^9 d
sample = input_sample(); // read L + R samples from ADC# U5 X/ d( u: w! @: q7 V/ R7 |) Q/ Y
output_sample(sample); // write L + R samples to DAC 6 W1 f* A" e) M% `( _4 a5 l return;& \5 T5 Q7 c4 \: e* L! h
} 4 g/ s% X5 _' D/ s' _ ) E* Q/ \# N# c6 Jint main( void ) + m; d5 Y: f0 ]{ 0 b4 j$ ]( {! W6 N7 j. h% \, r+ L7 h
/* Initialize BSL */ ' V H; \! R0 p# }+ c o+ } EVMC6747_init( ); 5 N2 J& S! \7 Y- v /* Call evmc6747_intr function */ * f% x0 q- }4 [8 \. c0 o1 E7 j# E aic3106_init( ); ! f `5 R: m+ x% R* {# h+ p while(1); 3 m/ X! [: w1 B; J} 4 M0 }: C! K' I ' K0 M6 C7 k' v 5 y* x8 e. I% @ r" d+ R g2 ^* E1 Faic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题( f- K8 Z3 W$ E% g! R+ `5 u
/* Initialize MCASP1 */! s- r3 P5 v; H$ r
mcasp = &MCASP_MODULE_1;# d: t1 B8 T3 k) P: f* L* j
mcasp->regs->GBLCTL = 0; // Reset ( ?9 H) L- P6 p) r" p mcasp->regs->RGBLCTL = 0; // Reset RX 3 {3 ^, e' v/ ^8 @ mcasp->regs->XGBLCTL = 0; // Reset TX y3 r5 ^: B8 K( B" U! O
mcasp->regs->PWRDEMU = 1; // Free-running : h6 _/ C( X+ e, T3 o) ^) F // configure McASP0 receive registers& f2 e. |' z G+ h
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used & ~$ B2 W2 `5 L mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus% Z, D4 A# ?6 W' h
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word 5 |+ [" `$ n7 h" j* e! W+ j mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side) ; l. r- m8 `. g2 P1 V' C1 o8 f( ^, V mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side) 1 t+ d) T. M: b# {/ D2 T% V0 c7 w mcasp->regs->RTDM = 0x00000003; // Slots 0,1: [* Q( ]4 e* D1 N8 |3 _1 [" a
mcasp->regs->RINTCTL = 0x00000000; // Not used$ c1 `8 @3 f R- Z7 e9 S6 F+ P- e
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 3 R2 K- ?' J( O: {. D4 T8 Z 0 A6 K& }* k r P mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used & h3 m1 t; `+ X mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus7 h2 F( J- S6 Y
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word 6 ?4 w, a% |5 ^ mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16 3 Q, N, }$ s7 |1 A! l) C( l/ {( d( U mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK / ~) }2 [8 l; N% | mcasp->regs->XTDM = 0x00000003; // Slots 0,1 , S: B4 V3 {) L* [+ [, A mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit 1 l6 ?, k) T4 ?8 G! O$ t+ D mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 C0 Z5 c# j2 [6 x) k. P& }6 i0 B8 ]0 N" \5 v) w9 k( Y. a4 o8 [
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN5 X% F# o: J! q6 }' u
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT ( B+ |6 `5 {( q mcasp->regs->PFUNC = 0; // All MCASPs. M' m8 ` m( _- V" H0 `
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1 " G# @; n. j' I- e3 \% q / `' d6 S+ l% m mcasp->regs->DITCTL = 0x00000000; // Not used ; _# G0 Y. c( m7 P2 ^ mcasp->regs->DLBCTL = 0x00000000; // Not used 5 ?2 \; V/ g; Z! y! i, Z mcasp->regs->AMUTE = 0x00000000; // Not used , R: i5 w2 ?9 Q/ G" n) ^: U( a; T
/* Starting sections of the McASP*/ & |: b5 Q% j! V6 n$ i& y mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 8 X& M6 {% r; w
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); % _4 j0 |2 z |8 A9 u mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; + j- Q' J7 C4 M# z while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON ); o3 `* m$ u: z- v( }
4 [9 W8 F- j% C, f- Q mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; * {6 M T6 g% y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON ); , F. y; \% u8 B mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 4 ^2 v' Z6 w& r$ {
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON ); ( H+ d' ^6 f" i0 G & n7 a8 _3 c F- G; c mcasp->regs->XSTAT = 0x0000ffff; 7 A/ W$ t h+ k& A9 p: w mcasp->regs->RSTAT = 0x0000ffff; 6 O! g6 ~% U! A ^# r+ q, ^
4 l3 F% w4 q m L) J6 `, e
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;+ F- q1 y* t8 W! e
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON ); N2 u u f: b* T$ @* z mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; " g& X( J. E1 Q7 Y0 s, r) `! u$ U while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );' A7 n* b* T% f% _; X( R
$ [& L- K' N6 ~! u& D3 ~. s& G /* Write a 0, so that no underrun occurs after releasing the state machine */! p5 ^0 [1 z. r; L4 q3 a
mcasp->regs->XBUF5 = 0;# E+ Y3 E: {" _# E5 f/ ` M! V- K7 B
mcasp->regs->RBUF0 = 0;1 {; A( v r) h) w; G) v
9 p. f* V b# u: x d mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 0 q2 k3 r. s- }0 J while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );/ \& a6 S" L0 F; H2 Z/ p; f
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 3 u1 L2 C# G/ y/ ?4 G0 a( k
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON ); " c- Q1 ~2 B$ z2 A1 p' Y/ l9 L7 \* L# a, M5 Q
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; $ v: E" t1 s9 K1 @) ~# M) @0 a1 H6 A while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );. n o$ c- Z) s/ |. @4 g% j
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; % d# [: I5 P" v, H2 x! O5 x0 n
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON ); r o) `4 l T: q6 [' W
* g: o c1 l% _$ O CSR = 0x0000; ?+ C Y1 H+ F" C4 h
INTC_INTMUX1 = 0x3d;* A/ Y/ e; t3 B$ I1 j- I' {
ISTP = (unsigned int)vectors;4 @. x9 D" I8 s# T( k% i) C4 e
ICR = 0xFFF0; X9 }3 @/ h' A/ I9 \$ H IER |= 0x12; + I$ H. k. W, a; H CSR |= 0x01; # B0 F% A3 O* G/ P4 ]
( v5 l6 s7 t- B8 m" I
4 W6 p# H& X/ w! j. ]# g5 k* m+ m( _( q, l" {6 h
还有就是两个输入输出函数:: e4 J2 b* `) E0 U) ]7 P% c' R
void output_sample(Int32 out_data) I0 z/ o) ]$ z
{ % o4 w, u3 k3 `$ l1 p( \7 T AIC31_data.uint = out_data; ; X" J. t4 C$ {) P: y9 k5 Q
MCASP1_XBUF5_32BIT = AIC31_data.uint; 3 K7 l6 `3 l* C9 s0 M} / e* T' }$ Z R$ b5 i" n5 R. }5 o) Y3 n& h
Int32 input_sample(void), l/ ]* \6 A5 Z1 n) d
{ . A* v1 E' @% D+ k s0 l
AIC31_data.uint = MCASP1_RBUF0_32BIT; ; f) Z6 r& ]' p- Q% p, e; U return (AIC31_data.uint); / L* m1 I: u4 ]6 [} S$ z p5 n; R5 Q- b# S
, \/ \6 |, t" l% n, d! |2 { 作者: human 时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)