标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 [打印本页] 作者: yusijiangchengm 时间: 2016-3-15 16:07 标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:4 S! e0 _- v4 y* [
main文件:" A2 @1 l% f7 k+ n' x' c: \
interrupt void interrupt4(void) % e! I4 l( Z: a; ?
{) \7 ?0 z3 b4 Y4 S6 }# L
Uint32 sample; . ]% \" m# l8 I/ g. j6 K , A+ Y# Y: }3 Q: v, D& c! }& ^ sample = input_sample(); // read L + R samples from ADC 3 B/ U7 t0 S. f* I2 M0 l* L2 q output_sample(sample); // write L + R samples to DAC 8 e7 J) c9 T. E6 j4 v
return; ) h/ _9 T0 W; q/ A" _/ h8 r3 k' @} 9 P3 k# }% W, E8 W4 V5 \8 W) K+ Z; N
int main( void ): ]; t2 E% A, e, t, C
{ 9 I" F- {1 z, @. o % P& l; A7 G- y; _! ^- \; d1 G" c8 E /* Initialize BSL */ - N9 {4 u0 F# Z- ?; x, X EVMC6747_init( ); / L, q1 b' x) Z /* Call evmc6747_intr function */ ( e; A, K) p- w, \ aic3106_init( );1 w5 S" N" |, u _
while(1);$ m5 B, d# q' F2 H) A
}# {! b% Q X" O# h! f8 [2 J5 q
6 a- c. v1 j# y1 Q, R- h& {4 r6 D8 }% {# e
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题 7 `5 P2 G" c& N4 Z$ T3 n6 K/* Initialize MCASP1 */ , l9 U5 B$ n1 f9 [, i. A2 `- r mcasp = &MCASP_MODULE_1;( o* S, T0 a3 ]) j5 v& V, w6 N! \
mcasp->regs->GBLCTL = 0; // Reset 8 q3 n9 i7 i$ k7 ?( i1 i' U# R' h mcasp->regs->RGBLCTL = 0; // Reset RX% V: J5 p7 }+ H! b3 A5 R% ?
mcasp->regs->XGBLCTL = 0; // Reset TX . T: w- @9 t7 Z3 S mcasp->regs->PWRDEMU = 1; // Free-running 5 i" h$ X, V1 S/ s- V // configure McASP0 receive registers 1 k. A; ~3 n9 G+ j; j* j2 |7 X mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used$ r/ P6 U3 h& a4 K2 i
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus5 J: d8 c3 H7 a& T$ h
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word/ G. S4 |$ W- i' f9 v" S
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)2 \, C4 F) I+ R2 w
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side) " ]5 s4 e4 n6 J7 J( E1 [$ a mcasp->regs->RTDM = 0x00000003; // Slots 0,1 ( L$ S- O3 ^4 P5 J) U mcasp->regs->RINTCTL = 0x00000000; // Not used r W1 D8 Q' t @ mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 ( |! p( g, `( U$ ^ 2 h/ o! N& M; l y* q8 @8 } mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used 3 @3 \6 _" C2 \7 g' m& R. N6 ]3 e& B mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus 1 K) b L+ j/ X* b: O' X mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word " h- g9 p/ l' o; r! I mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-168 d0 ]& C& V+ v9 | J
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK / @6 B3 m s9 s8 z1 q# d mcasp->regs->XTDM = 0x00000003; // Slots 0,17 R X3 [& }0 `1 {% k
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit* H) J1 M( W `9 t, L6 k
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 + a+ z+ S, W& y$ g! h* B1 e: I' B* n. u! ]
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN 1 b( {5 ]% f* d' a6 ^' T" ] mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT 2 n! u( M8 w' u0 J mcasp->regs->PFUNC = 0; // All MCASPs) I1 y# j7 L5 r" l
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1 ) t' \: R+ p0 e4 p ; ]4 b2 h8 k6 n. S7 O& J% g0 G mcasp->regs->DITCTL = 0x00000000; // Not used # D7 `. M1 n$ Z mcasp->regs->DLBCTL = 0x00000000; // Not used + H7 M% w' u* ?: W mcasp->regs->AMUTE = 0x00000000; // Not used" {. Z0 x& B8 p8 C8 i5 B5 k
) H* i) M5 O2 U2 D. T3 E* Y. S1 O5 D3 M/* Starting sections of the McASP*/ 3 k% M1 R( c. T; S6 H5 q4 r. T3 y& b mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; & l5 }$ c# W# `5 A4 w' ^% a while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 2 G S; L$ _9 G0 H3 r
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 4 U, i: H; G2 k' Q2 G3 \
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );) p) B9 Q* m) e2 o2 ?5 W+ A. \
- Q4 B* k" F/ |& [: @5 S m3 X mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; , S$ J# K' [3 r! r# x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );% E# M/ ]3 b/ r; p# `* V! J
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; , K) A2 c4 u8 a2 D: \0 ~4 A
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON ); : C* Z( O9 a! J J3 d. p! R1 T6 F' O
mcasp->regs->XSTAT = 0x0000ffff; ( y% |9 B/ u. f' v3 C. y, ~* q mcasp->regs->RSTAT = 0x0000ffff; , I* `2 [, ~$ w$ `8 A& f1 e # m+ Y1 D1 l! m. G: A mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;! K( x4 y: p( W6 h' x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON ); : G) |5 Y) o# Z* N mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; + B( \3 x/ d! s* F" \# Z g6 v* G& E while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );6 s: {& @' s% ^; H y& N
" @) C; o: [8 r0 a
/* Write a 0, so that no underrun occurs after releasing the state machine */6 z2 x9 G) F5 S6 H( H" C# M4 H
mcasp->regs->XBUF5 = 0; , t5 {7 E- o `/ G. u* U+ Q mcasp->regs->RBUF0 = 0;1 q4 W' |1 s7 P/ @% W* S
# p0 R+ S0 D9 m0 U$ Q5 I
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 1 q0 d* F5 m, z6 m6 [! S
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );. W }5 X8 R8 o5 i# }
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; & S. G3 o- M9 ?# V) h& z {+ k while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );. I0 ?+ @5 `& v0 z: i( w" E9 ~; j
+ J) I6 q, T* [( t+ F4 I/ n) o mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; * T! g; H+ W( b) E3 \6 c# w3 |2 v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON ); - j- G" D% S. l5 g mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; * I6 H, y3 V* C+ `* Q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON ); 1 J! B! @, X i) D7 v: n/ }* M& K/ P 4 k8 A5 m2 e6 R CSR = 0x0000;1 K: M- ^% k7 C1 Z( h+ T
INTC_INTMUX1 = 0x3d; 4 {" @$ e6 S" H2 C) ^9 [ ISTP = (unsigned int)vectors;" x) W! \3 Y9 U0 L# X1 i! \
ICR = 0xFFF0; 5 ?$ z s9 M, }9 ?% ~$ i/ u. d
IER |= 0x12; 3 @1 @4 b; e3 l4 e2 T CSR |= 0x01; ) |4 v {4 C8 H1 Q2 Q# v
5 H* ~7 d; F1 e. U" I5 f1 S+ ` i- h4 z. }; l- E0 g ) U x! m; j1 N; K0 ]2 U& ^& g还有就是两个输入输出函数:7 j: J! @# o% k- ]5 l: O
void output_sample(Int32 out_data) % ]" u3 l. @0 Q# |{ 2 L$ }) g' F; Y5 f M5 _6 Y% [+ X AIC31_data.uint = out_data; * H0 }% |: P; [3 P/ O MCASP1_XBUF5_32BIT = AIC31_data.uint; 2 W$ Y. f/ K% y5 d2 j3 u} 5 b& ~7 S% k5 l# v6 t) I % L: F4 `% W+ ]7 i3 y# q4 BInt32 input_sample(void) + z- n1 a% V M+ B7 A# c, m8 k{ ' q) U+ c5 a' {9 s AIC31_data.uint = MCASP1_RBUF0_32BIT; 9 b: r0 X9 a1 L0 ?6 B$ t return (AIC31_data.uint);* D- P9 A. }- s. R0 o( t
} ) `( m ~- x$ O ! E0 h( R+ x1 y5 j$ K作者: human 时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)