|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:) Q* }1 \8 {( h6 j0 R; H' t& ~
main文件:& ]& O# u# b& i/ d) ~' q
interrupt void interrupt4(void) $ `/ n' y/ \5 L* U" h2 P0 ?7 a
{
9 w) G& f8 z/ \ Uint32 sample;9 _, d5 [# q( J" g3 s0 d. D
% I) O, h' z! Y3 f0 R, f" [0 k
sample = input_sample(); // read L + R samples from ADC# B% H1 F# I3 C5 b$ n
output_sample(sample); // write L + R samples to DAC / D1 S4 Q; y8 g+ W# X0 Y& n
return;
# x9 M$ X( W w* f. R0 i0 G) Q}0 g/ A; P7 X. ]' y0 L' o5 K7 n6 p
6 J+ F0 c8 g$ W- Mint main( void )( w0 d- z d8 w6 e
{
* s: c, M( B) f4 ^ p" ?# n( g
2 w( T6 ~: s1 ~1 m/ E% N /* Initialize BSL */
D1 E. p8 D! O) R. R5 N% }% s2 b9 V EVMC6747_init( );! B5 A8 Y4 m: ~& I! ?0 U) R
/* Call evmc6747_intr function */
, ~" Y" Z% A: I/ U aic3106_init( );0 g7 ]6 c- S( C$ n
while(1);0 `! z+ A+ `" e9 z$ J' e
}
1 j( J, D# Y8 b$ ~2 B. e! ]& f9 h; W7 m5 t9 J
' a7 }8 {, z" F
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
6 z; m! ?3 E$ ~1 u/* Initialize MCASP1 */
3 W, A7 J1 V: J0 q( [) H mcasp = &MCASP_MODULE_1;
% A* ?2 U+ \) b$ ~6 V% c" h1 o mcasp->regs->GBLCTL = 0; // Reset
3 m6 A# ? R0 L% }& {7 E8 v mcasp->regs->RGBLCTL = 0; // Reset RX I- d r# |0 o' y1 L$ z' y
mcasp->regs->XGBLCTL = 0; // Reset TX
$ l5 O6 H9 X R mcasp->regs->PWRDEMU = 1; // Free-running$ O0 u* v& j+ H# L1 T
// configure McASP0 receive registers
, u( S, C9 t. A mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
$ {! \ o: ]" J: K0 q! e7 U p mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 q+ T- i8 @! I5 B5 U mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
# l, N8 N& g' J) T7 z4 g& p5 l; j mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)+ U3 I" [; q% ^1 q( p% x1 S
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
V+ Y5 e" W# ~/ N0 T6 F8 N mcasp->regs->RTDM = 0x00000003; // Slots 0,1: w$ ~* w( D" x1 V
mcasp->regs->RINTCTL = 0x00000000; // Not used
$ |* D0 R9 @4 J1 ^6 e4 m mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256! c# B% S4 \' A
: q$ ]! O9 I% C mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
@5 ?: l/ S/ {! i, J$ e mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus5 u# |& w8 M5 |. ~8 \: _4 Z
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
9 w* ?6 V, m1 B/ W# n mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16 T8 o- d! @7 O: u: ]
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
$ j0 R3 G- P$ W7 d* p" H mcasp->regs->XTDM = 0x00000003; // Slots 0,1
, Z- R; n1 S# U. o1 v: ] mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit4 n# P9 l0 E# U: d; [
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256" N7 o. A9 }2 p: V1 |5 Y* u
( M" f x( o4 r/ w mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
7 l5 e8 {& \4 e" T' S0 V mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT8 h2 |- Y4 ^* F0 R& J: P! u
mcasp->regs->PFUNC = 0; // All MCASPs" l0 X& ]9 o6 V/ `+ M
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1+ o( b" v6 @/ Y! ?
0 o( y6 l, q. M+ e. i2 Q mcasp->regs->DITCTL = 0x00000000; // Not used/ _" W* S C; J% m* s o/ a0 Y
mcasp->regs->DLBCTL = 0x00000000; // Not used
8 g4 u& P. f- y1 G mcasp->regs->AMUTE = 0x00000000; // Not used1 B" \- m& R* h0 N
: I6 K3 H; h# h% E3 x6 Q [
/* Starting sections of the McASP*/
9 g( i7 S; N; [) N. v& ~4 z mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
) |. n+ Q, F' W4 |& |9 U while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
/ t0 B" O7 Y0 G9 C3 ~9 K+ b- A& @ mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
3 p1 H; h Z1 a$ a3 ^ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );9 L( i+ x+ X" Y4 F% j
! z, o ^! y& V2 i; p+ y mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
/ C) e' O, P1 r2 ` while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );0 Z' f u, ^/ z3 Z( d
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; , o" A" t2 a8 d4 P' X
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );/ [, d p8 W0 |0 i; A4 t
2 r; x2 F6 {5 \ Z# V! Y7 b) ?0 D
mcasp->regs->XSTAT = 0x0000ffff;
$ D8 s+ Z( T( ?/ \, I! ?7 K mcasp->regs->RSTAT = 0x0000ffff; W7 F( d: n7 n, [0 d% ~$ F r
' B7 S1 E# m8 }, v/ e! _: X mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;5 R' [2 j/ m, j* n( K* Y" d
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );0 X2 t% H) u0 ^
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 9 E* @/ \+ q! H: E
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
$ d% s7 z( M3 Q3 T' G: ?' _! V0 o
% X9 t' Z- B: d- q0 N /* Write a 0, so that no underrun occurs after releasing the state machine */* V+ i, I. m- c/ s( c. |2 p
mcasp->regs->XBUF5 = 0;: |; h+ q/ K; H+ I0 w t
mcasp->regs->RBUF0 = 0;0 F4 w7 w0 I0 G4 C; v+ K4 J
( o- \4 l/ E/ c. u% ~% {! N: w
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ' Q: ~: o, Q( A0 `: D4 r
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
5 Z7 m# T- x: Y+ O mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
% z" C; L' W5 a& Y while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );1 f. P$ j% t8 h( r5 p
: j- Y6 Z& @2 K4 ]' j mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 1 R1 R( {: p2 c7 I( |3 l7 O5 Y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );, }; @ a f3 Y n
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; * q: [. c' ?! q. ^& ^4 |5 d! v
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );8 S5 k, M: f" ]: F5 e( G
6 K+ {3 z n* z i& J CSR = 0x0000;
# p& I' o, e( ^' Y/ J5 D INTC_INTMUX1 = 0x3d;
1 D0 U' }; \3 C+ B9 k( t$ P/ W* p ISTP = (unsigned int)vectors;. Z: k) q1 p7 e) I; T6 Y5 ]
ICR = 0xFFF0; 5 m2 z" W( M+ R' A9 J2 J5 P6 a$ B9 F+ e
IER |= 0x12;
9 a/ b9 g* y' Q0 G CSR |= 0x01; 8 Q, e' r K4 d/ w2 y+ ^ O+ k
- I: s. e3 E3 ?0 _
: W- W$ T j& n# g5 ?, s# a; X, j8 Y# o7 B' Y
还有就是两个输入输出函数:- v# \* Q, o. A
void output_sample(Int32 out_data)
6 g% A6 S& O4 v5 t{9 m, |8 D3 W& Q/ X4 }2 ^8 u
AIC31_data.uint = out_data; % c' X% J' F6 O- Y$ |6 F* K* G
MCASP1_XBUF5_32BIT = AIC31_data.uint;
3 B V4 X# U. F# V! f) F' e3 x}
& K, Y. Q9 d) n. _' C X5 R! C2 V# } W
Int32 input_sample(void)
3 U! F- V# S5 u% O6 R; C{ + `% Y; M. i2 P; _+ y* L
AIC31_data.uint = MCASP1_RBUF0_32BIT;
! e9 h: k+ F: I8 \$ _ O return (AIC31_data.uint);
( D: @7 i, h. q8 n8 m( n* p& O8 x. K}
. X, _; d7 u/ y. l3 `+ l# ]; V
4 u: | I2 w: }, b( o6 G |
|