标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 [打印本页] 作者: yusijiangchengm 时间: 2016-3-15 16:07 标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:5 _" Z$ t9 V/ T- o' t7 R
main文件: ; ?" ]7 u0 V# c; E, F3 [0 Vinterrupt void interrupt4(void) 4 ?" e3 b( b8 f6 b{6 f: `+ k, s+ q" F+ N
Uint32 sample;8 V) M# u( v( p/ z0 C
5 W% ]( X3 }; t) J% I+ ]! p! a/ F- ?
sample = input_sample(); // read L + R samples from ADC! P+ G& \2 p) X R3 g
output_sample(sample); // write L + R samples to DAC 1 I8 C4 V* K, B" b return; # j8 e Z; u, ]# V/ d) x& H3 U} ; | a) h3 E3 x8 D# G" l7 R+ @) J2 u$ ^
int main( void ) 3 k6 |. ?5 n6 D: }! W7 U, P{ 5 D; f6 `* V4 N8 c+ A2 ^ ' Y. z, s4 H8 s, K; F /* Initialize BSL */ 3 E1 G+ ?% d* ] EVMC6747_init( ); 9 g9 x# S5 ?9 {8 z" ^* z5 b) a /* Call evmc6747_intr function */5 J/ k8 l- S% k$ D: v( |
aic3106_init( );0 J* R; _' m( L' Z* i% I: o3 `9 Q
while(1); 4 Q* b R/ R0 P3 e: } v}. z, E& G5 c1 H4 }7 P; c5 E
0 a( o( a2 T8 L O+ v. ]/ D' R0 @. A4 M
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题 ; A N, U& p. j7 Y/* Initialize MCASP1 */7 S5 A8 l2 N- D" c
mcasp = &MCASP_MODULE_1;) ]5 b0 ~/ {4 m2 r
mcasp->regs->GBLCTL = 0; // Reset 9 @1 l( q5 v- ^ mcasp->regs->RGBLCTL = 0; // Reset RX 6 N+ M. L. }& ?& Z ?+ B6 z1 ~0 v mcasp->regs->XGBLCTL = 0; // Reset TX8 I2 X# l8 c$ y7 \' P
mcasp->regs->PWRDEMU = 1; // Free-running # C" J0 T9 e7 E% h* }' N // configure McASP0 receive registers( I) u2 T: y0 o+ `% n5 W4 r3 x
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used. E4 L' w2 D3 [- x; Q" f
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus- o u/ u; s; X+ J0 N, D' }/ c
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word 2 E, i. ^- X% V# T mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side) ) c' [0 X; A* v3 L3 _ mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)# e# u, J* q1 N0 }/ l) M4 F
mcasp->regs->RTDM = 0x00000003; // Slots 0,1 ! `& o. T2 _( C7 O7 h4 y$ j, s' s& _ mcasp->regs->RINTCTL = 0x00000000; // Not used( [# D5 H) Z) e
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256" n+ X; f+ X9 j: T' |
* D3 { @. L3 g6 B
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used& M( [) }- R& p% @ v" s8 R5 c4 w2 `
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus / }# H! k# i% p mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word+ Q( f1 m# I8 I6 C- d; e! Q) F1 l
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16& U& O* b# _$ | f9 W! y
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK 3 U( V8 R5 k2 I6 H/ I/ o: U mcasp->regs->XTDM = 0x00000003; // Slots 0,1 4 [2 X; R" r e- \0 i! N mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit : x9 ]7 @2 N/ X# Q v) H mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 ; C8 @( { X" O% p" z. t, d$ c* i( R# d1 y: Z4 B: J2 F
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN # Q- [7 Q* V7 ?( s w- \0 z mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT, Q8 i8 H5 a$ [0 |- u' V5 E; O0 {
mcasp->regs->PFUNC = 0; // All MCASPs/ y; \- a5 Q+ y+ N* X
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1 ( K3 y( Z% d; P0 C( H7 o, Q4 l) b# y, Q8 X7 L
mcasp->regs->DITCTL = 0x00000000; // Not used: V* \9 W! c- i6 }" a3 {
mcasp->regs->DLBCTL = 0x00000000; // Not used+ L; y1 L" T) ^% B1 Q
mcasp->regs->AMUTE = 0x00000000; // Not used # | p$ ]* @1 B, ?6 q1 D/ ^; U# R" h) i! `( _2 U0 Y1 G' _
/* Starting sections of the McASP*/! w& B: Y+ a/ e, z
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 4 H7 X* Y$ C+ M8 k9 K7 w while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); / l/ @& ` z+ ]7 b
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ) ?6 P- B' x( Z) [4 u5 y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );2 N3 f3 s% N" f" M
! {/ |8 L6 C. f! {7 I( N0 m j) r mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; & ^1 X, X7 N' x. `& T+ W- ] while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );$ u4 E/ s' o- j; e. M3 e5 s
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ! L8 x" d% ^, F4 |1 N7 b
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );: @3 x" f3 C' X
4 `; K! I0 `0 d* d Z0 N' }- v mcasp->regs->XSTAT = 0x0000ffff; / M! v" \+ M$ G$ w) j, B8 u9 e1 M mcasp->regs->RSTAT = 0x0000ffff; % Q) i3 j* y4 c9 j" {: Q+ D 6 h/ K0 I: H3 L+ L) c" ]* ? mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;5 K1 ^+ z' s6 r/ D0 R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );1 N: _) M3 X+ b7 J* F _
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 1 y5 M6 s; p$ V- M" C while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );- i9 X/ {% x! E5 r0 O& ^. B
( g) I# ?+ S/ }! s2 t: [) g /* Write a 0, so that no underrun occurs after releasing the state machine */7 Y( O: N8 ~! M* X: f
mcasp->regs->XBUF5 = 0; 2 G3 P# e4 h$ e4 [) C5 u mcasp->regs->RBUF0 = 0;1 T0 L9 c b) `( r6 o
$ h, U% ^$ z/ l! E/ y5 F mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 4 e1 y; D* d1 d0 `, l4 R* R while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );; n* U' x4 @1 ?
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 0 o6 S' ]5 S: B5 a/ M; r( r% }. F& q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );) v* m4 A+ ]1 E4 j: ~& Z3 ?
4 C1 @% ]) i, e5 }
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 7 q+ i: a, k& O' t$ b. { while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );6 w3 y2 E* X6 J+ G) X( a1 u: h
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 5 [+ C: u5 h' F. z% q& ? while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON ); 9 p8 T" b( \- }1 }1 x' O0 Y' i, r/ D) ^* X6 j# |( z
CSR = 0x0000;! |0 W/ d2 v" M& S; W
INTC_INTMUX1 = 0x3d;0 m! e7 R/ g8 I9 z
ISTP = (unsigned int)vectors; / D, m. b1 T: I; ? ICR = 0xFFF0; , d2 C) I( W3 n9 \8 \' y3 X IER |= 0x12; : g2 h) D, d) i9 b2 {5 I" r. ` CSR |= 0x01; & k) C* x1 Q1 S! K, r% `/ j ' t: m- r5 Y3 t" e6 F1 `8 i0 q ! Q% @/ \( g- a+ U& d3 Y - }! X# G" v: @4 {; p0 z还有就是两个输入输出函数:) l* F7 x, o( k2 |% x
void output_sample(Int32 out_data)" G1 A! @8 f- f1 k
{1 J, L" c2 ^( i$ f' @
AIC31_data.uint = out_data; , u3 Q' L) E; M" l- w2 ~6 f MCASP1_XBUF5_32BIT = AIC31_data.uint; * Y, q3 @* I. U, Y6 m9 j8 ^}2 j# n {$ U) y# n- x \0 }. v+ A
" `, G: S2 i7 ^, o' }8 a( h" [
Int32 input_sample(void) 6 ^. b5 l: j1 m! ]( x6 w& @{ + P2 C7 y6 D9 k4 _' c; f
AIC31_data.uint = MCASP1_RBUF0_32BIT; ) U9 M* u/ E4 u3 I% h$ r) K return (AIC31_data.uint);; b' _. n; K2 c) U
} - K0 q: n" V0 A* i+ y: ~. u' z) v( ]7 f 作者: human 时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)