标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 [打印本页] 作者: yusijiangchengm 时间: 2016-3-15 16:07 标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序: * [( O4 ]4 u" n5 I# xmain文件:3 |& S* W$ c! z. C# a
interrupt void interrupt4(void) 4 ]0 i4 I! ^. e/ P
{& L$ |8 [; D% a! o/ r+ f6 g' Y. H; w
Uint32 sample;# V4 ?4 g N( M8 q, G' x4 H3 ~
& r1 O6 s( A( G B; Z2 G O sample = input_sample(); // read L + R samples from ADC# q, k) Q/ \# N P0 J3 k
output_sample(sample); // write L + R samples to DAC 2 l/ n- D8 J* X5 `0 ?$ `- P, j* z return;: ?' Q* b( ]0 B4 O0 j+ I/ `
} 9 i. m F6 x8 }9 w' F* Q7 @' n$ h0 @) d ]; ~
int main( void ) , r h/ e* O$ t `4 x ^5 r{0 S) P# O$ m i; J9 z5 p
" d% o; B8 z# M3 H8 V /* Initialize BSL */ 0 _' {, M( H7 a [ EVMC6747_init( ); ' k# i* ?1 G3 E. U2 x( u# }0 q8 I /* Call evmc6747_intr function */ % ?5 _0 i% Q& ]- N! D3 t aic3106_init( );% b- t, U. F& ]; N: g7 E
while(1); " x+ D& w7 e+ h} 0 a" j5 z! H0 p2 B! t) Z, h7 {4 f% V( S0 y8 b
9 k6 W8 [+ @2 t5 y+ G" w8 \aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题 $ Y4 L$ X0 Q9 Q/* Initialize MCASP1 */. h3 D/ X9 M% C3 E# M0 D9 z
mcasp = &MCASP_MODULE_1;& q( y0 V4 _+ Y: D3 b& q
mcasp->regs->GBLCTL = 0; // Reset' h, u' h- u: u
mcasp->regs->RGBLCTL = 0; // Reset RX+ L, R0 |0 @: c6 v6 v
mcasp->regs->XGBLCTL = 0; // Reset TX + C0 X: G2 ~; ~2 }: m mcasp->regs->PWRDEMU = 1; // Free-running ' L: y' @+ F8 M" @) f9 { // configure McASP0 receive registers0 `6 }3 }) D @
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used 6 C) G& \3 A4 o( ]! [ mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus 9 A) z7 ?7 e" A mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word $ U2 k9 v; B- i( @& n: s; m+ Z0 e5 r mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)# S5 C. V# p2 H% _
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)+ V. y H( w: z
mcasp->regs->RTDM = 0x00000003; // Slots 0,1 9 }& w; O/ M. C mcasp->regs->RINTCTL = 0x00000000; // Not used . e4 Y6 x6 G+ n6 b( a6 \" p/ q, o mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 ; d& J Z9 y3 J6 v6 T# Z 3 w: ]$ c$ b+ Z( C* p mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used' r) h: x `" s
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus 9 ~; x Y% Y2 R @1 X! B mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word) Z& Z2 {" X/ y4 p3 e+ c4 S
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16, ^; P# D0 s7 m2 X$ \
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK' R6 v2 c. ?' ]; f
mcasp->regs->XTDM = 0x00000003; // Slots 0,12 \. T' L$ G* V1 G7 ~# z9 n
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit2 @6 E' W+ P) u1 _- {: R5 e
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 / m) c9 C0 m9 v8 T; J+ f, u & X- N# P8 f# L% H mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN& K7 d( K% k" q( k
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT3 _0 m4 z$ Q/ y* K
mcasp->regs->PFUNC = 0; // All MCASPs" y2 r$ r+ v% W0 I- d. T
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1 m2 ]+ a0 U+ x
- e9 H6 |/ V( S4 E
mcasp->regs->DITCTL = 0x00000000; // Not used ; W) r {; o+ t' I; n mcasp->regs->DLBCTL = 0x00000000; // Not used $ Y% P6 q' \" v4 O/ E mcasp->regs->AMUTE = 0x00000000; // Not used/ k( R$ o8 j& ]( ?% N; q
. H( T3 K- Z( S6 M9 L3 _/* Starting sections of the McASP*/ % ~" \1 ^/ J4 ]$ Q8 f' _- _ mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 4 [& Q& h7 S( ^' C; p; M+ k% i$ h while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); ' Q% G3 V$ Y! I; A# k8 ]
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ' c5 D J* x+ \6 w @7 t+ b
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON ); # g9 L! D. }$ m) O9 r: N' t* X: k% |7 c2 d1 k9 G* S
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 3 q1 U- Y, i6 R! r while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON ); $ {; v0 h' x7 g0 W; J$ A% V mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; % d1 d5 w' h6 A0 g( @ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );& |5 n4 j! C' l
) c" n% ]8 T' I% n4 y0 t mcasp->regs->XSTAT = 0x0000ffff; 1 H3 o, g+ F8 z0 y: v5 j, D
mcasp->regs->RSTAT = 0x0000ffff; $ U: Z0 d' O5 |2 ]3 d. ~/ `1 k4 E S * m6 `" X9 L3 M2 T8 \0 R4 D8 L% Z mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;& I. l) Z$ l' b" D; v, j
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );1 Q- \/ b6 a0 g3 o/ n- e
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 3 a V; F+ b" s8 A while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON ); 7 A) r: U1 y- V) e% [7 T, U- Q$ R7 C5 x% B3 i0 }
/* Write a 0, so that no underrun occurs after releasing the state machine */ Q: a' K0 D0 X- E% G! L2 h8 R" `
mcasp->regs->XBUF5 = 0; 9 w& R6 Q+ K$ @- k1 \3 { mcasp->regs->RBUF0 = 0;4 H) P* n5 r5 `* ^* { o7 g
5 {0 Y1 P, v- n; s& t
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 2 | ~6 e9 X d; @- f: n8 c9 s
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );+ ?5 V. |% x% @: i9 B/ v. `: R
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 8 C6 F7 |8 I* b' Q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON ); u7 }2 ~6 _ u6 b. } K7 Q
: K M( N5 [ V( h, b7 a
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 1 b. V. J" m, }6 a' s- }5 v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );8 k3 P5 N& g3 W4 n3 p; E
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; # z* @5 X) v4 Z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );) z* v, g3 n7 |8 t6 z% P2 X
5 K5 T3 n7 ]8 q5 H3 F d# n CSR = 0x0000; % i, C4 b e) u INTC_INTMUX1 = 0x3d;$ d9 @& F* I1 j: H- k% k
ISTP = (unsigned int)vectors;) `/ E4 ?) _' J
ICR = 0xFFF0; : u; L; s$ D3 ^. z* M5 I+ ? IER |= 0x12; " Q; K* o6 ?# O& {. {% W CSR |= 0x01; # B6 [2 q' L& k. \" w( y5 @, h% a, M2 v& Q
+ B: l3 Q, r4 _* X2 Y, D 6 Y+ M" T8 l: @' J还有就是两个输入输出函数:6 X* L- O4 p0 ], A. `; _. z
void output_sample(Int32 out_data)$ D/ P4 h% I2 L
{+ v0 Q& L7 ]: s% K5 Q7 I
AIC31_data.uint = out_data; ) A8 E$ T- f. g+ t3 H3 p
MCASP1_XBUF5_32BIT = AIC31_data.uint; ! I- O! [# R' A! B6 c: m}; K% \- Q0 e7 ]5 h9 x
+ x2 v% [0 M- h0 h4 w9 B
Int32 input_sample(void) * o2 p9 C5 @5 e+ U$ z{ 0 q7 w; @' l& w1 j s. ^2 V, } AIC31_data.uint = MCASP1_RBUF0_32BIT;! E- K4 L4 G3 q
return (AIC31_data.uint);. {0 i) s3 Z7 O8 n6 w1 ~
} * Z2 Z2 A% Z. c) B2 G) e l 3 ~, D( N& c. F: U' ?! l/ f作者: human 时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)