$ d( a" D9 i# l( p sample = input_sample(); // read L + R samples from ADC 3 V& j1 b0 L2 p4 H3 L$ w output_sample(sample); // write L + R samples to DAC / Q% c* x& x1 Z
return;9 }3 B1 h3 |& r& v H
} 7 b+ Y% \1 f1 N3 \, ] : }+ U( T0 e. R* {int main( void ) 5 F# r9 f) p2 f- }{* f3 Y7 L' D& _1 S7 T, H7 i
?: u0 Y3 {: H: P /* Initialize BSL */2 Z; n E: U: f8 G' c1 X& \1 V
EVMC6747_init( );9 I1 u* i) }9 |; x) \: n
/* Call evmc6747_intr function */3 @1 S4 O. o7 U# g3 L I
aic3106_init( );$ P- i4 C. j4 i4 F. q" H
while(1);% A' u5 ~% j! D0 j- Z( D
}/ t# p/ U' I) v* C% J5 q
: n" M, [ j3 B) m) R 5 p/ H* _& _" H, }- C7 {aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题' D) B* P# a" T
/* Initialize MCASP1 */+ v3 r" b; B9 ?7 o
mcasp = &MCASP_MODULE_1;4 \' l/ u+ n; H8 ^7 S5 \5 p
mcasp->regs->GBLCTL = 0; // Reset 6 u/ K! f' K9 N( R1 [4 H( R mcasp->regs->RGBLCTL = 0; // Reset RX 6 a2 V/ q2 Q9 ]" B mcasp->regs->XGBLCTL = 0; // Reset TX$ z4 v0 k- [9 |- ?: h& ]
mcasp->regs->PWRDEMU = 1; // Free-running8 [! S5 I. s, p% r- }' k
// configure McASP0 receive registers% y8 T' N3 c) T# s; D8 E' P
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used 0 K- R v# K3 B mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus , K) V+ n& a- i; V& _0 I) U mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word$ N6 ^9 f5 C L' m, m
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side) ( v$ U3 E0 h0 T# t+ h$ x mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side) - Q- E& T6 k- N. X mcasp->regs->RTDM = 0x00000003; // Slots 0,1 # B" z/ O9 @3 w0 z i* o# D mcasp->regs->RINTCTL = 0x00000000; // Not used + i4 Q* Z: l! b: h mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2568 J, k; ^. |$ y4 p. e8 P
7 @8 s. R6 X; _% y- }" V mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used) X' H' P. \: s; ^/ B0 }# u
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus 7 I" I# @3 [7 k0 O q: u mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word9 F5 p2 P% A* ^5 @; Q6 j: a7 g) ~1 ?
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16 # x# s- {( V1 w+ s mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK* S V# {2 N2 C
mcasp->regs->XTDM = 0x00000003; // Slots 0,1 ) N# b/ U, S: M2 \8 `0 a6 Y* x mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit ' z+ s8 {4 h! e mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 3 f, ~" L: u4 q& r' h 0 z; t' h+ r8 ` mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN d" f; {9 W6 O$ O1 f( w
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT7 ~) G7 M* M1 P+ _$ u
mcasp->regs->PFUNC = 0; // All MCASPs / C3 F4 p4 P% z mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX19 ^) S/ p/ F. u" P" Y* J4 j: a
) v/ E/ U& o( |; @6 Q$ t mcasp->regs->DITCTL = 0x00000000; // Not used 2 M! Q/ a0 P1 F0 f4 U mcasp->regs->DLBCTL = 0x00000000; // Not used - A( y6 n) J) Z2 q" w mcasp->regs->AMUTE = 0x00000000; // Not used9 d4 m r0 }2 H
! {* c5 j0 O2 I4 N w/* Starting sections of the McASP*/ * G) g( D9 a- @' e3 s+ ] mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 7 i& B6 z5 \( r# b6 U/ r( c, W6 q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); |" @# z+ [) }6 l mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; : Z2 f. P3 Q1 X) s5 z5 `
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON ); s! G8 n: d; t, y, G" V+ V
# K! z. [- {5 ?/ W mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; * H! Y! t* {' E+ a, l) g1 T while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON ); 2 _$ y' Q' Y$ e9 H- O mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 5 E, W* t, S# W8 ^, Y3 o) L& ?
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );& S" M8 V6 b" B6 \! q+ u5 ?
" |7 B( @" L7 t+ E9 Q
mcasp->regs->XSTAT = 0x0000ffff; * ? ~1 h. [1 s+ r( I mcasp->regs->RSTAT = 0x0000ffff; $ b0 n5 m. q: u) \
# Z% q2 g1 @1 |* w: m, b) ~ mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;0 e4 d( q5 R' ~5 |) f2 m/ g( I
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );6 v# b- y! y1 {
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 4 o5 U: _% j+ N# T while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON ); ) k7 B3 r7 n( ~5 ?: q# u. s+ Z# j- {6 `2 L
/* Write a 0, so that no underrun occurs after releasing the state machine */ 8 j2 n/ G" X- s! o# v mcasp->regs->XBUF5 = 0;9 B& e; f( R6 h, S. J
mcasp->regs->RBUF0 = 0;$ N8 U9 N: ^1 H9 J( _
3 e. F, V, O1 C5 W mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; $ w. F/ n$ D, K I' a& q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON ); 3 i6 z- g; w. Y+ S% D mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; # V% q" u/ [' w$ x
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );& F, G3 f$ a9 ^' v
2 E; c9 ^1 Y/ |, }+ {: T1 X$ i
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ( W* C8 ?' X `( v/ E8 g8 n1 A0 b
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );, l; b$ r3 i* ~
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; , P1 X7 e- e$ ] while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );9 c# q' `- j4 k& {0 a" M; [
- q4 S+ }% M, [ CSR = 0x0000; - f( z0 c9 E) L" z' Q* {1 i INTC_INTMUX1 = 0x3d;5 L K7 X r W) T3 X
ISTP = (unsigned int)vectors;, r% W( N! e* B/ X9 g J; U. U( H
ICR = 0xFFF0; 4 l$ {0 `+ o1 a
IER |= 0x12; 1 T( n+ }8 T _5 ]% U* ^ CSR |= 0x01; # `+ P3 ]2 Y Y$ G4 z
) Q6 F$ Q) U' m1 M2 l+ B 9 k4 G: {/ N; v. t( i2 r 2 c5 [" x# W5 W8 i还有就是两个输入输出函数: $ u3 a" a6 ^' |2 e1 W# Qvoid output_sample(Int32 out_data) " X) l5 L. c4 K) v1 S{ # M/ y4 L2 w- B P2 ? AIC31_data.uint = out_data; 9 ?4 Z: Z* `9 ?3 h
MCASP1_XBUF5_32BIT = AIC31_data.uint; 0 c+ l4 t) Y+ }7 Q} ; F; w6 G/ w$ R8 ]3 d6 _ 6 o* A) m9 s' L% sInt32 input_sample(void) : j5 _/ ]4 F ]9 S2 ^{ 8 O9 i# [+ X% k) f/ l AIC31_data.uint = MCASP1_RBUF0_32BIT; % Y2 a, H) A3 Y$ D return (AIC31_data.uint);& O3 }- \5 D2 A; t
} % h8 y3 s/ k; E/ j$ r$ Z' x0 h) Y7 [3 B 作者: human 时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)