|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:4 c( I3 P N t9 x
main文件:
1 S5 j& a$ Y# K# f' e' Dinterrupt void interrupt4(void)
7 d8 \$ L u5 ]3 ^$ m{
' |( _# L, T1 b Uint32 sample;
0 y2 i% t/ }. y1 r8 Z& Z* K- y7 B+ }! B g, A
sample = input_sample(); // read L + R samples from ADC2 \* P. S& x/ F# z5 d6 f. c; `
output_sample(sample); // write L + R samples to DAC 7 g0 L* X: ?7 c' e$ F4 Z
return;3 z2 C$ _% H- a* i: n% w5 C' n- t
}
/ c( _4 B) j v9 _
: ~3 I; |! f3 j# L* S5 Sint main( void )+ P! N- G4 p" l9 E* u, G- o# F- r, Z+ i
{9 q- v+ k, d2 M% o' e" Q5 ~
# z% ~& s; i3 H
/* Initialize BSL */
: ^2 {; ]) q& t Z7 r EVMC6747_init( );! G' Q1 j) b8 f$ R! r
/* Call evmc6747_intr function */
/ W Y) I* W5 c/ J1 A aic3106_init( );
" J; ?1 v# o! r i( t0 l2 z while(1);
3 t0 T8 r4 ?+ J! [- ]}8 P& w- k0 O3 V/ f" q( u+ v" q
7 j, u' B4 }0 x1 n0 y; U
% ~, H/ p- b2 {2 u" ]) h7 O( l% _aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题( l. a2 N! q) a, ~
/* Initialize MCASP1 */
A; ?& ~$ Z& X5 d! K) ^" o0 b: H mcasp = &MCASP_MODULE_1;
! G; {' A1 b+ z3 U% F" ` mcasp->regs->GBLCTL = 0; // Reset* o$ O/ ?2 W, F6 Y: g2 ?
mcasp->regs->RGBLCTL = 0; // Reset RX
- d" l1 `6 J8 M0 B4 Q% n- ]& f1 x- C mcasp->regs->XGBLCTL = 0; // Reset TX& a F1 r; `( n. x$ q. ]! l' @0 P" q% @
mcasp->regs->PWRDEMU = 1; // Free-running% ^$ S7 S& B8 A$ o0 c5 X
// configure McASP0 receive registers
) t- Y1 x/ y6 ? mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used1 ~1 k: @; E' q& y% O4 r) w
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
# V7 L) F+ A( z! _9 ^. q! \ mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
) }* D" x; u; j# N& X mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)0 C3 ^& L$ Q. c4 z" i' o4 H
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)5 F& a* @& B _; l9 u2 W
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
1 Z$ Y+ K/ S- r8 \5 Z mcasp->regs->RINTCTL = 0x00000000; // Not used9 ?* L6 ^" h7 D/ q5 a, R
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* e- X+ J8 T8 m! q( Z8 a
, K' z; N3 o& n8 F4 x! S6 { mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
3 F: Y/ y; N" R2 V# v* K6 O2 B' k' b' j mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 ]4 G z5 i1 e: _3 `! d" v mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word& c1 v- I1 ?: x: Z# z/ o% v; H
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16! @" P/ s1 x* k3 b6 q+ |. `1 c% c% N
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK, l, ]: u& F1 I5 U1 n3 q7 u
mcasp->regs->XTDM = 0x00000003; // Slots 0,1/ z4 m K. P$ @! s
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit+ r) K; [" u( n( C9 \3 l
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256& Q5 H( n, ]5 }# s# m
. {& O; F7 I1 G- W* @
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN" I1 Y9 B8 H# J: L3 O8 ]
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT( D6 a9 s/ R* k1 y4 J. j1 q# z9 U/ B
mcasp->regs->PFUNC = 0; // All MCASPs2 B8 R. w6 j/ l* K! N8 v
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX16 E2 g' Y( }9 S
$ L5 R0 J1 J0 A) q& m mcasp->regs->DITCTL = 0x00000000; // Not used" X' s- r+ j6 E9 K/ f0 }5 n! C
mcasp->regs->DLBCTL = 0x00000000; // Not used
! |4 D- E' j5 j mcasp->regs->AMUTE = 0x00000000; // Not used
! s$ `* r# B3 S9 l
2 T8 M" ]5 d& H/* Starting sections of the McASP*/
) i+ |# {- f1 t$ P" o mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 8 {& G& o( D( }8 N
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
9 K" v$ P' P2 e* _0 E( Y5 o. G mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
R! v: n* O i2 j3 A4 y9 p5 |/ D while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
- g6 t% N9 q0 L9 s5 P, E8 I3 N. y( h9 O @6 E- {* U
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; # O3 @0 ~3 c' O- E, p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
/ `& [: B& o! v8 |/ ^/ O: g: J1 ?, r mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
; \2 b; x/ i: @! L: Y5 h while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
/ ^% e( p! f) {- Z( U2 B# b$ G. y2 d) b2 X& v
mcasp->regs->XSTAT = 0x0000ffff;
$ ]( O3 _2 A, {: P mcasp->regs->RSTAT = 0x0000ffff; ) [4 h- R5 V/ Y
4 [5 G& j3 G' K0 j7 a- f7 y1 V) |; a% r
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;* O) d c3 j B4 i
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
2 Y" i( c: _7 C E3 W" P. k3 I mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; : b/ f9 q& E& R: G6 V( o3 S* P, e
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );2 r6 t" e; `& r
# a# Q! q2 z' ?. h9 R# c
/* Write a 0, so that no underrun occurs after releasing the state machine */& o' V' q: @9 ?6 I: m
mcasp->regs->XBUF5 = 0;
1 m& {6 k8 z5 ?0 W, ~6 ~: i mcasp->regs->RBUF0 = 0;
* t7 |% O4 I$ o- Q8 C% p! b( _# {, m4 l' E* N
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; * f% A' d% g1 }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
% X, e$ A- [% |( p/ p+ A mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
6 T" h P! {- X0 f( s while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );9 f& V, H3 b# S% y8 }
7 _6 s8 H1 K( z, o mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
( |, o' ]6 e0 ]' V# M! { while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );* [- r3 y0 `$ Q) d: a
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; " S% B) `# W% S! G
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
( O3 {# n ?% W e3 v7 t+ h6 T* Z' K, D4 m, r$ ?# J
CSR = 0x0000;
l/ @& B! x5 t INTC_INTMUX1 = 0x3d;
- L) Y% J, f7 c2 w$ A: N( ?; ~/ E ISTP = (unsigned int)vectors;$ h, x' U& w! D0 z
ICR = 0xFFF0;
* i6 i( Q9 h; n3 M4 p. v IER |= 0x12; % W# q+ t5 I* ?2 i C4 A
CSR |= 0x01; 9 H3 ~9 e& F. e5 R. y+ Z4 V1 p# E
( D9 \& k' O$ o: ^$ C/ X5 r0 R2 g3 `( r- g% Y& A
5 K4 W( E W2 W2 I
还有就是两个输入输出函数:6 t2 D4 k9 o! x
void output_sample(Int32 out_data)
B- n, V# m @7 l; V{
6 C" i4 W( v! ]- v, r& a' s; Z: z6 | AIC31_data.uint = out_data; 9 q2 p F' E1 E# @: h7 g
MCASP1_XBUF5_32BIT = AIC31_data.uint;3 T1 R% E( s/ R; a
}3 y$ |3 K8 j, a) K
: d% G8 y% V* c/ t$ e4 l( K
Int32 input_sample(void)
2 p6 w9 s" _. a! }% @{ " L' q4 e5 o: b; d+ f
AIC31_data.uint = MCASP1_RBUF0_32BIT;
9 Q7 k9 j7 A! M6 u- ? return (AIC31_data.uint);! U- @; B ?* J# s
}5 m( i1 F2 a& U! p; r5 j1 m. Y' V
* s- k+ k. b3 x6 ? |
|