|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
$ u( P% e) `: U6 s6 l( Q7 Imain文件:
/ p; J% k V H1 Y$ _interrupt void interrupt4(void) & u& p7 m) R0 I h& |
{
' K1 P: ?/ E4 |, `1 ^* V Uint32 sample;
8 V. }! a; v, r, s
: B! ?( u" Z" Y1 N sample = input_sample(); // read L + R samples from ADC+ |# D8 T0 W5 R! N
output_sample(sample); // write L + R samples to DAC
, g& r! b: k+ R6 @# g J1 @0 C$ T4 u return;
* t2 u! _/ ~: H& }$ R}9 H0 y# q* ^! c/ b' j5 p1 l3 H
- q. V& ^9 W1 [$ d9 n; p
int main( void )
. s- B- \4 [. e h; a1 H{
, G3 S; A( r% |. I/ o* l: n0 |
$ Y u- v# {+ d ? /* Initialize BSL */4 t r+ k" M. `2 p& x2 Z6 [! E m
EVMC6747_init( );$ _' s8 X% d8 l6 L+ M& O( J
/* Call evmc6747_intr function */
/ y3 x4 p/ Q8 B, k, |/ s aic3106_init( );. f& `- D3 g/ ]
while(1);7 i) I# f' o, h% N
}( H1 G9 b) u2 G' F, z) ?0 U7 P
0 W3 B3 Y# K& r, Q: j! R9 s
* K4 e. R7 r* l6 maic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
! ^+ ~* d/ s# [# e/* Initialize MCASP1 */
* T8 K3 w o( n; z$ _ r& z mcasp = &MCASP_MODULE_1;# ~# Z7 }7 C/ O' }3 i3 M8 O
mcasp->regs->GBLCTL = 0; // Reset# ]. u+ _8 C; e) V
mcasp->regs->RGBLCTL = 0; // Reset RX
; k: r$ X9 h+ X4 }) u/ n mcasp->regs->XGBLCTL = 0; // Reset TX
4 s5 |+ X9 a6 P mcasp->regs->PWRDEMU = 1; // Free-running6 O" V. r+ P1 y" M: Z; P. f
// configure McASP0 receive registers3 v/ w0 Y8 x6 H2 _
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
" w9 F N% q1 K% ?# j mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus8 u d; N: `7 F
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
, S" u7 n w/ K mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side), C0 C8 W/ z5 X. x; ^0 h
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
/ x+ y' z9 F4 a. V6 K! X% T mcasp->regs->RTDM = 0x00000003; // Slots 0,1
2 L( S' X" V1 v mcasp->regs->RINTCTL = 0x00000000; // Not used0 }$ l( v( w, q/ L$ `
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 v8 C' W: L! a6 a- `6 `1 I/ O b2 K; S- d. A/ x
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used4 M& [, W& W+ @! S; m* o' b! Y
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus2 j0 w" c v1 _/ ?
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word; @* H1 B2 Q( o7 E; g- c6 f
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
, L+ w) \' @3 N! Y9 z" h! P: g3 t mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK. j* @* ~! U1 v i+ M# S
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
( |% v( q% ], ~5 {( I mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit+ ^2 f8 h! T' \
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256& T. M: P3 d" P6 m9 u4 n8 R% X
' c9 Z {4 Z4 {! \" q6 n mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
9 G B$ C$ ~- r9 R% ? mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
% v% }; P" Y: S1 J- F; X mcasp->regs->PFUNC = 0; // All MCASPs
( z* q' l- e U" f" C mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
. h4 }8 A' Z+ v# N/ w! U8 y' G, F$ w0 i# {2 E' K: c0 ~. N/ v
mcasp->regs->DITCTL = 0x00000000; // Not used0 m1 l. K; G+ |% |! ]
mcasp->regs->DLBCTL = 0x00000000; // Not used) {7 }" {4 ~1 T/ f* h# P
mcasp->regs->AMUTE = 0x00000000; // Not used
5 z& V& W, `8 ]8 k, m/ C6 h% J, x) U- \
/* Starting sections of the McASP*/
7 ]5 x- b( Q/ C6 @7 J mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
! d: W T! j. K) t; E* K. l while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
: h( s2 d% u7 V) X/ [ mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
. \) C- X N, s: I3 F while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
) [8 w Z; D% Q2 d; O$ t, S9 D% }: {; w+ `7 M' ^
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 2 ~: {. C: g+ o: n7 @
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
" g0 w( F6 o8 n w/ B9 @6 R& A mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
8 q0 \: ]! `; K8 U2 ]7 o while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );; @, U+ ~- U9 I% k
7 H& I9 T3 [" V! p. @
mcasp->regs->XSTAT = 0x0000ffff;
$ [4 j" o! \# W/ s6 P mcasp->regs->RSTAT = 0x0000ffff; 9 P# @! I" k' n+ v
9 d9 K L* N: p& N# ]7 [
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;" N, U: U; D& s# E& G9 }0 ~
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
4 x% g1 U/ E2 s% \4 n) o6 w mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 4 W/ t8 S4 E) H/ P# i8 Z# V
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
F& g! S2 s1 Q3 ` M" D/ Q2 [8 D( _5 `2 w: I5 c4 Z
/* Write a 0, so that no underrun occurs after releasing the state machine */
; W: a* E3 c1 x mcasp->regs->XBUF5 = 0;: \5 T0 M9 a! Z2 Z' P5 g8 P
mcasp->regs->RBUF0 = 0;
) R$ H( k p- T0 p/ H$ i" j3 K: b' s# X" h! p8 d9 [
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
2 C; _ [, n* x. T while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
5 X3 r7 d: }- r' R) m9 k% J7 V mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
^% p: Q' R4 M7 C8 U- t. i while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
* h" g+ C& q, I3 Q. x- K( `3 e3 i& g J2 K, j
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; # i8 Q5 {* c+ b D
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );, E! s! Y6 @, r3 R) E
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
" Z- |! E* y: H @( y9 J8 C- m while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );8 X7 ~( u2 p9 d" H
" w9 R: c3 A; z4 ^: f; l- _ CSR = 0x0000;
" o L0 A$ [3 A# g INTC_INTMUX1 = 0x3d;
8 g% P2 J0 Z7 l A' ^2 _( Z ISTP = (unsigned int)vectors;" r& E+ L# t" q* Q
ICR = 0xFFF0; 8 [, H. O" c/ {2 M4 C
IER |= 0x12;
. e& x f1 y* r CSR |= 0x01;
0 I5 L; z0 @' t4 `, t% O ?5 w" [0 Q9 m3 w
/ ?" w& ]- u9 z# Q: x" D
) G; ?9 K( r) ]9 E% q
还有就是两个输入输出函数:
3 E B2 N! P l7 c: ?' c7 Bvoid output_sample(Int32 out_data)7 r" \, h0 _* D! X$ B$ e
{
+ d/ }% @( F/ U* e/ x5 x9 G AIC31_data.uint = out_data;
9 b( Q: ^ ]3 g8 b& V# P5 n0 r T MCASP1_XBUF5_32BIT = AIC31_data.uint;) R9 C: w% G2 K* ?, [5 h1 p
}( W& q5 b: l; B5 L7 b2 x
+ J* |% o' g- v! V
Int32 input_sample(void)
, u: n0 h; Q& X$ F7 | K{
, o/ h2 K' H) ? s3 f! p# A AIC31_data.uint = MCASP1_RBUF0_32BIT;
8 E# A/ k0 o }: B% c0 q9 o, P$ W return (AIC31_data.uint);
! Z! h" T# o8 E2 z2 f |}
6 E6 S5 b9 R# c# j" A! r6 O* M+ w' p( G, p* T
|
|