9 R1 ]. p! M/ p' ] sample = input_sample(); // read L + R samples from ADC . s+ @2 G. ]7 Y/ w; ? output_sample(sample); // write L + R samples to DAC 0 T1 P* d |0 j) l0 k: a; Q, w return;: \! @% u% z1 B8 P- i! q
}" f; M7 d/ y9 M/ B
* d0 Q& h" U4 ^
int main( void ) , E* t; f$ [0 n0 v{ " `" q1 ` ~& r3 @+ G- [. W( ?) K" W6 {, @5 H: s8 q
/* Initialize BSL */ ( S3 H: X/ R/ T$ y" j+ W EVMC6747_init( ); + R7 j! ? R- ], W9 z) ` /* Call evmc6747_intr function */2 ^" }" j1 o0 z0 G8 p9 [% b5 U
aic3106_init( );) K. }4 b, U3 F' w8 G5 c& @! l
while(1); " e2 U9 W4 ^/ N' f' L7 | b} : E5 V) G2 q! e' e) ]7 p h* [ 1 g7 g" l( B* @; m+ X8 T& G3 M7 b& e* g8 j1 H4 P& X
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题2 g8 m1 g- B! p1 Y5 A
/* Initialize MCASP1 */ 6 c! e+ C8 H/ E; [ mcasp = &MCASP_MODULE_1;2 i+ n+ i4 Y7 Y6 ?8 n5 d# u
mcasp->regs->GBLCTL = 0; // Reset3 ?, e' O4 _4 O$ E5 W
mcasp->regs->RGBLCTL = 0; // Reset RX6 ?' b! a9 Z$ `6 G% }5 S0 Z
mcasp->regs->XGBLCTL = 0; // Reset TX + b% i8 q; }- S4 N k/ T1 t: r mcasp->regs->PWRDEMU = 1; // Free-running ) S# X2 h: } a+ o // configure McASP0 receive registers2 r2 d$ E4 I0 n# A: `& j, [
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used # Y9 J. y4 s `* g7 V8 q+ L mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus 7 a! v& N; j b) u+ v mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word( ? K( a7 m8 ^. h; O
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)3 M% u' i4 B% e; W: w
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side) " z- [3 |$ o( _( n mcasp->regs->RTDM = 0x00000003; // Slots 0,1) X, q+ @; O: v6 ~% }, c8 x
mcasp->regs->RINTCTL = 0x00000000; // Not used# f7 m% r/ Y$ q2 T4 @
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 9 q! h$ E& E8 J; X4 m4 f9 n4 V- G$ m4 w1 G
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used ) V/ g. y2 ^/ d mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus ; |5 Y9 K7 G I% @5 N$ B: p8 n mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word - C0 i) ~3 k6 x, Z mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16 0 D+ b: W1 D/ T0 e; o" F# p mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK * S: [0 d) v# { mcasp->regs->XTDM = 0x00000003; // Slots 0,1 6 E! K- [+ L$ S8 h8 ^ mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit 8 r/ ^1 f8 ?, Z& H# a mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2562 a2 N5 N* k: K; ^ ~; k3 O7 b
2 [8 b0 V8 \/ G: x7 U
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN, I5 Q$ ^- }9 p- O' k: X& y$ H
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT8 O. Y/ G I7 R, R: a5 Z
mcasp->regs->PFUNC = 0; // All MCASPs 5 ]' d' c, g; [) [ mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1$ ]. B4 ]/ |+ u) F
7 _3 v5 }, |& p2 B- V1 G. n/ R mcasp->regs->DITCTL = 0x00000000; // Not used0 i* A) Y O9 k1 k3 A
mcasp->regs->DLBCTL = 0x00000000; // Not used% @* N- z( {3 g
mcasp->regs->AMUTE = 0x00000000; // Not used, }# S' J) v/ Q
w+ ^4 v$ I7 n6 T8 }/* Starting sections of the McASP*/ ) X6 \1 s0 Q! w1 v mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 4 H4 \2 C6 n/ V- z* [ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); ; M" i, o& E3 K5 r: K mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; : Q5 C6 a! _5 T& Z' ?; j
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON ); ; D/ n; r1 r1 e - i* t! H5 f+ N; ~& o$ o mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ( z3 c- F- i% o$ f1 |( M0 m' R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );: a' P/ {( X# w# H
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; * c; i/ I' U' A/ I9 \
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );) t* I* F3 D9 Z+ t
9 e& G+ A$ x( q* g* S
mcasp->regs->XSTAT = 0x0000ffff; : C) Q" h" N4 Z: w0 t$ S' n* I mcasp->regs->RSTAT = 0x0000ffff; % w2 N/ u1 \# p5 i
5 y5 x8 X2 r- W& R7 f
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;- t. ? A( ?* ?& S5 q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON ); 3 N6 D! W9 p5 B& {+ B5 e mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; + @: h0 n( F$ k0 g! z" S while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON ); 9 ]' j3 ?; s* P- ?3 h$ j/ T5 e# b. _; c* _- ^; {2 i
/* Write a 0, so that no underrun occurs after releasing the state machine */ / E3 ?+ q& I4 C/ u% a; m, h& c mcasp->regs->XBUF5 = 0; - W# e5 r3 m: r% V9 ~: z9 y+ @ mcasp->regs->RBUF0 = 0; ) [0 v" g: C; i( v/ k% o. t + q+ k$ |* ]1 z" x z mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ' {) \. U1 X8 {- \ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON ); 1 b0 ^; A+ K) a! y. z+ g& t mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; $ F5 u2 j5 h& ]& ~, X! ?! j
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );9 C7 |4 `# y( q6 C6 d$ m: w
+ l% e t9 U7 _! g$ t mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; - M2 d' }: h c% k5 M4 F
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON ); 7 J! q" Z! [$ ~! u5 ` mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; - L: p8 c2 H4 u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );9 i% I$ {+ a4 E* A3 ^1 z
- z5 K. M. Z# H; \ CSR = 0x0000;) ?; A1 M6 u7 L) g" j: ~7 g
INTC_INTMUX1 = 0x3d;, Q: a1 u) v1 o% r
ISTP = (unsigned int)vectors;- P) d+ Q" S/ y
ICR = 0xFFF0; 3 B4 t) Y# [. F
IER |= 0x12; , Q- E* c1 g; L& O CSR |= 0x01; 3 {; {! q9 C9 ^+ Y4 j8 _) D
1 K" m- e# v( w! [/ r4 B/ M
) {9 t1 b! Z8 G5 }6 d
+ {3 M0 [/ ~7 s: M6 D7 @9 p; m% d还有就是两个输入输出函数: / I% p8 u* r3 t$ F7 F$ e3 D$ V9 zvoid output_sample(Int32 out_data) : `9 a- Y g- R* p& w9 t{- w3 B( ^) Q( x& p l3 j0 [
AIC31_data.uint = out_data; * k, c6 n; ?( [4 ~8 }5 n MCASP1_XBUF5_32BIT = AIC31_data.uint;6 H, Z, P' x" s5 l! B
}% R) e% O3 _$ `5 G; w( [5 }
) g. K- x4 H% A% p
Int32 input_sample(void)+ k: t% {0 D8 W7 [+ Z
{ & H5 T0 e' I: `3 J- `
AIC31_data.uint = MCASP1_RBUF0_32BIT; $ O$ j) t8 L' Z return (AIC31_data.uint);& w* W1 c& y. i, C6 b7 s
} - C' h3 K8 m |# ~/ b9 g/ L- _# W. g' P' J3 `! B 作者: human 时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)