$ C) c! j. i7 {' ~8 |+ K sample = input_sample(); // read L + R samples from ADC 2 [( ^- i# M7 P( n output_sample(sample); // write L + R samples to DAC 3 p) W5 {$ A) _& _: {
return;1 {5 v$ ~3 m+ f0 e0 s$ B% c! w
} W4 R7 K ]$ Z. x& q s: d
w: J4 {, {% G# D* @8 g* r9 sint main( void ) 6 L) Y( B4 J, V* i{ % ?' Z6 j8 @0 b) D0 H5 O3 m / }4 _6 q2 B% A: Z& z4 H /* Initialize BSL */ 2 ^6 \+ M) Q& d2 A+ ~ EVMC6747_init( ); 9 y8 R6 A( n$ V' m /* Call evmc6747_intr function */ 9 `" `& A6 P2 |* N. Y f aic3106_init( );* S2 Q, Q6 r" g) g
while(1); # @- j$ T% p9 a+ ]! l( @% j8 n; U5 g} ) O% K( E3 a. u* l" j% r4 }* o/ S; I5 l6 d
8 _" t5 `$ ?: z1 J! f
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题" I, x" a0 X L; R
/* Initialize MCASP1 */0 R* H7 ^8 l1 }9 l2 D {1 |
mcasp = &MCASP_MODULE_1;$ k7 t+ _; J H; w V
mcasp->regs->GBLCTL = 0; // Reset% Z& r b/ [ y
mcasp->regs->RGBLCTL = 0; // Reset RX . A0 i2 _* k+ G& v3 o mcasp->regs->XGBLCTL = 0; // Reset TX ( J X+ ~ y5 m mcasp->regs->PWRDEMU = 1; // Free-running' F! L6 o6 ], c1 L
// configure McASP0 receive registers" x, J) t. y' ?0 }# n3 b
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used 0 H- \ J: p/ E! S$ T- g mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus/ P9 f. {2 O" g" p9 E" k
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word3 ] [+ Y8 ]. w; T0 G2 P
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)6 @4 x' B0 W: M/ O8 g2 v! D
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side) $ w& H3 c2 i" R- ` x mcasp->regs->RTDM = 0x00000003; // Slots 0,17 y6 d- O( g6 h# V0 p _
mcasp->regs->RINTCTL = 0x00000000; // Not used8 \8 S6 p1 B+ f* s
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256) e0 n& m# n" q) p
+ Q4 ]+ }* g- y1 l mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used % }2 k3 {: |0 J4 G9 q( w. v6 a: h6 W5 K mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus# n% o, }6 W, g6 M% ?
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word- s% ?0 [2 t& p9 Q' Y: |
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16. v+ O! j8 D& @; K2 [5 ^
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK( _1 k5 q3 e- G" d' x7 ^. Z3 U( y
mcasp->regs->XTDM = 0x00000003; // Slots 0,1 ; y o0 Q% v5 v; F& `5 t mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit# C2 C. ?" E+ C" I6 w
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 6 v6 _. K" `5 b+ o: N1 N 4 `( @6 }9 {9 |$ _0 Y. C* p mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN. \3 L7 r( \% ~/ S6 J7 b* K
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT, I# F- j+ ` T- |# c& _! K. F
mcasp->regs->PFUNC = 0; // All MCASPs: y+ W- X+ @* \* e& z
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1( {2 l; m; k3 Y* Q
6 Q: L, y; K( }$ O$ _
mcasp->regs->DITCTL = 0x00000000; // Not used ; @' E6 u& h. ~4 h mcasp->regs->DLBCTL = 0x00000000; // Not used 3 l0 h1 L/ c& q! X' t mcasp->regs->AMUTE = 0x00000000; // Not used! i! N+ z9 F5 F/ K' |
: n Y9 X, d1 X$ i/* Starting sections of the McASP*/( e) E ?9 X5 ?% ?
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 9 k/ P8 O" L- @: d" {
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); ( O% H8 Y2 B9 j9 Q* E mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 7 y2 a- r) p" z. X while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );9 O% k; Q, D7 f& W( K4 h
- _! O! G5 p- F( H/ Q: R
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; # J& U4 n0 X8 l
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON ); % W' m0 h4 `: K; X mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; & G, i2 T, _5 q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );% Z" X0 b$ @7 _
1 J# Y4 U, u4 S- K mcasp->regs->XSTAT = 0x0000ffff; " k) ]- `9 v( _- K6 e/ k
mcasp->regs->RSTAT = 0x0000ffff; / T3 X3 y( o8 L; z' e 9 |+ L# I1 |! n8 e5 H mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;9 p, E' V4 R1 s$ @
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON ); . e6 ]8 R* m" N# Q0 `' A mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; % S3 M C. x- r5 o5 c' r J while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );% ~' u% `9 C+ p& [& j% g q1 d" h
+ d, B: {* H+ Z /* Write a 0, so that no underrun occurs after releasing the state machine */4 m$ n; I1 ?- `
mcasp->regs->XBUF5 = 0; ! X- m1 h) k ^' x6 h! @. U4 ?5 H9 m mcasp->regs->RBUF0 = 0; " Z0 f2 r3 r! b5 o1 ^ q * [. o `: D" I! a$ ]- X# z9 {2 i mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ' m8 g3 O a* a* Y# \
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON ); % D' h2 _* A. U: d8 U# O0 H mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; " ?* F% O7 g( D3 m2 @; l
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );/ i& W$ U% ^7 R. o* L; O0 e9 S
0 U; Z" A9 I! ?( y" q* P
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 5 Z I& M% B/ e" V3 M1 O: B
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON ); 8 [% f) f2 G: N+ l9 v2 p8 h mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 8 p: i' a2 V7 ]
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );5 a- w2 Y8 X O: a
f( H* v3 g" @, r
CSR = 0x0000; ) U% w5 I* |9 A. q INTC_INTMUX1 = 0x3d; 5 S) w$ @# _: P# f ISTP = (unsigned int)vectors; ) {$ A+ s- e8 h7 o" T1 q ICR = 0xFFF0; : r+ b9 m9 e; {( ?- W } IER |= 0x12; & @, H" h [4 \4 Z8 ?1 Z; |
CSR |= 0x01; $ `7 ?: a2 _4 f: `5 r 1 z8 X$ }; U8 ^0 L! C$ U$ u6 d$ n 3 R( t$ u+ n/ D1 Y5 @5 M8 A 0 [' ?2 L( _- x& Z! m还有就是两个输入输出函数:- B; Y% W6 G. {( E9 u1 U+ H4 }
void output_sample(Int32 out_data) 6 I* v8 A6 e/ K. |& A{ & K8 v, ^8 B" Y4 @# O AIC31_data.uint = out_data; 3 O! r3 E, E) `7 ?0 o8 l9 j MCASP1_XBUF5_32BIT = AIC31_data.uint;( Q6 A1 u3 V! u! v4 K
} " e ` `+ Y$ i" c/ v7 J+ B1 a# i: K" F0 V) e. ]7 {# e1 l, @
Int32 input_sample(void) : s6 i( s& j6 {6 }9 r/ u{ # b3 [+ c8 |6 m, y, r/ p& } AIC31_data.uint = MCASP1_RBUF0_32BIT;; r% u& K8 u/ G; f% D$ J0 G
return (AIC31_data.uint); 8 |$ y' I3 T1 o0 U}* D( j) ?) x/ g8 t+ T
) n" G3 K% W% c& K/ U& t 作者: human 时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)