' S2 q2 W$ r; x2 @aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题: N0 C7 S2 X0 L
/* Initialize MCASP1 */ : n6 _9 }8 [8 ^8 ?8 d) _- _ mcasp = &MCASP_MODULE_1;$ A$ w4 B3 F# t
mcasp->regs->GBLCTL = 0; // Reset& V; X" ~: E' I2 H# N6 Z) ]' t
mcasp->regs->RGBLCTL = 0; // Reset RX- n4 v3 H: t+ N# j0 Z
mcasp->regs->XGBLCTL = 0; // Reset TX6 g- s' l, Y$ k! p9 u! i
mcasp->regs->PWRDEMU = 1; // Free-running : B$ o9 [- w9 ? k7 x' k. Z // configure McASP0 receive registers ' F6 [* D2 T3 K, q mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used ' D1 Y6 {0 } w }; P. s* F3 X mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus 5 i! d8 I% M& r: A# ^ mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word 6 V% a; @# J- `% ?6 \: _. { mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)5 \, f' M1 u6 Y6 r
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side) 6 p1 M* b6 W$ N. {9 x mcasp->regs->RTDM = 0x00000003; // Slots 0,1 " C9 H3 ~1 f, P7 [& C6 m mcasp->regs->RINTCTL = 0x00000000; // Not used + m" A; i* l: G/ I4 S mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 ) c: K; c& f" `$ z7 U5 |1 O/ Q. K# h* C' U. R
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used1 A) @. I9 Y, [; ~/ n* u
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus& b7 S4 E8 U# Q' R& H9 v! j
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word 3 E7 d$ ?" p3 w; [5 @2 F mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-168 \$ b9 `& ], {5 D' Z* Z; r
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK 3 s7 j2 _# \! f mcasp->regs->XTDM = 0x00000003; // Slots 0,1 7 ^* x! o# H8 a7 v. i3 p5 ~: P6 C mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit9 p. N8 Y# J2 [; ?9 L+ w
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 $ k) S! O0 X: O# k- e# e& [/ S+ L$ E
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN ; }0 P p, f( o; e5 d% m+ m mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT5 `4 B- c% y! g# i
mcasp->regs->PFUNC = 0; // All MCASPs$ y- g, f$ t" s" s# E" L4 L" l$ E+ o
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX15 n) s8 p" z) \+ u+ R: Q
2 i/ g) O" g; ^9 i3 [! B3 h. E
mcasp->regs->DITCTL = 0x00000000; // Not used6 o1 o$ P/ O c) \
mcasp->regs->DLBCTL = 0x00000000; // Not used % O1 C2 N$ d0 `" b+ h5 v mcasp->regs->AMUTE = 0x00000000; // Not used 7 d( g: s5 |. @+ S , i0 X$ H- z. s+ X! G# N0 g8 y/* Starting sections of the McASP*/, C( s& C2 F- A+ r" X. l
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 0 t. i) A2 i% V! B. a# }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); + a* J! f7 j1 K4 B- i& e2 B4 c8 P* D
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 4 B: ]. \4 X+ i: J" A while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON ); - Q Y2 o k! v# j. ]# _1 f5 O% G' h" F
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 9 F5 Q) a9 x* l7 Z$ G$ E while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON ); : a' g e2 n* N. G- Z" X0 u mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; , p' }5 K! [5 R" @1 W while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON ); $ M" p3 i D, @8 N/ S, v& r4 e7 i# Y; c' G: E$ w8 @: {
mcasp->regs->XSTAT = 0x0000ffff; # Q9 a6 p. @- m+ I* h& V8 V% }) |
mcasp->regs->RSTAT = 0x0000ffff; ; F: j" d; }* k( F8 Z1 [% Z; K K& g7 @$ S
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON; 0 E- d' B+ V" I) } while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );; E( a/ X* j+ E' c" H G. U/ E+ |' V9 G
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; : P0 r X' g/ L3 b* k% V5 i. \* t( L while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );" W; |/ U* ]! n1 I3 ]( z4 a( I/ {
8 E* s0 O& b- x' e. N# m /* Write a 0, so that no underrun occurs after releasing the state machine */ 0 [0 |+ x! r) E9 D mcasp->regs->XBUF5 = 0; ' m, p$ \* Q2 e/ k: e$ V mcasp->regs->RBUF0 = 0;6 b9 y6 c) Y+ H4 O: f. ~" Q
0 U3 H5 N% C# l) ^$ |6 w mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; . ?% M4 g4 z2 _, f' y0 Z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );! p$ x$ p- d8 [0 S
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; : v7 u, g6 a: n- e: \
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON ); + O6 g4 `; B. W0 j ?7 |, w 3 u# D1 W& z, } mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 6 ]4 [) H( y2 x8 b v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );2 L p% Q4 d; h* n
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; , l# Y: a# v1 u l( s, m while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON ); ! @, c- e6 t1 q h2 b& ?8 v0 |3 [
CSR = 0x0000;0 s: d2 h# V! @( a. P. U i2 L% B1 K
INTC_INTMUX1 = 0x3d; 2 d( [: r, B3 [* P6 `* ^' \ ISTP = (unsigned int)vectors;* [' N* |0 w9 R, g" L: F& d+ K0 y; S
ICR = 0xFFF0; * I. m* Z% B" X* Q+ q1 \
IER |= 0x12; 6 U- k! F6 x7 N. ?+ V CSR |= 0x01; ) y3 z+ O+ ]9 s! s* Q2 Y
8 F- p8 M7 l) E# k+ I4 G y
6 U6 {' V. I8 z 5 w q( Q- g$ D _0 ^还有就是两个输入输出函数: @3 f2 Z2 N5 v6 X
void output_sample(Int32 out_data) ! r) @$ M) H0 j: L3 n' a2 W{3 W/ u' v% E1 K6 l9 K, y: O* O
AIC31_data.uint = out_data; / S( F$ `% U% F9 ~
MCASP1_XBUF5_32BIT = AIC31_data.uint;7 e, G! n: ]5 @# M: N
} . `* n% N! f" F* i. A' m" d6 m' p) ~0 W y* J/ Y: {
Int32 input_sample(void) 4 q( g* S, u4 }+ y% ^, H{ + C0 Z3 O/ t4 F" j- Q/ S' @. \ AIC31_data.uint = MCASP1_RBUF0_32BIT;7 |3 z8 S* ?$ _( v8 U& n
return (AIC31_data.uint); . v# L' q5 N) Q: f}0 e' z8 D! R, d
8 o$ U0 C! O" }9 s, m8 [- k 作者: human 时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)