|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:6 n4 _" D* t. Y' L
main文件:
) E8 M" C! {& ~, P4 i3 o7 Rinterrupt void interrupt4(void) ' L0 g& |# `7 E, C
{
4 l# K x. T( i Uint32 sample;1 l( N1 r* |$ h7 d# ], `7 |8 S
3 h h5 ^) i% M l0 l$ H
sample = input_sample(); // read L + R samples from ADC; I5 I4 U1 ~) ~, e& U
output_sample(sample); // write L + R samples to DAC 2 v; q/ q0 v: a2 W
return;
2 l" H' f6 a4 `+ G1 e# k}
# O+ z+ B; V& F3 e
3 o. }9 \3 k. l7 {int main( void )
; J7 @0 U2 T0 [# y: Y+ B2 K7 i{* ^* ?" ?; |, c: e6 ?0 j: V
) r0 z r9 h+ g2 ]' S, e- X
/* Initialize BSL */1 r. l8 a: I" v. t& b
EVMC6747_init( );
) y# B4 u9 k" h2 ?: J2 _; L /* Call evmc6747_intr function */# P) Y, ^4 }" R& X0 v( e/ y$ F1 j/ v
aic3106_init( );
# L& i- U" R7 p) ~/ g2 T while(1);/ y/ `% {$ C+ S
}
* s# X: e9 m& ]6 f
g7 [+ [1 j2 w$ z6 u6 }7 c( x: d' A* r
1 C+ o7 |$ H) g5 c# a$ Y$ Zaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
+ F( m" M! w. M/ E2 g/* Initialize MCASP1 */
0 C& w M4 U# A( ^/ x( ] mcasp = &MCASP_MODULE_1;
1 X7 N3 F5 m. I# C4 H$ O2 z mcasp->regs->GBLCTL = 0; // Reset
! U% j/ {+ C) v mcasp->regs->RGBLCTL = 0; // Reset RX1 b' N, ~, }: b: }( c b
mcasp->regs->XGBLCTL = 0; // Reset TX
% a; l+ u+ N' d, ?' L mcasp->regs->PWRDEMU = 1; // Free-running6 ~1 M' j& U, E. L& Y, R: E( e
// configure McASP0 receive registers7 k5 \$ K( _7 s& { h
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
3 w+ a# D) r) R& J mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus+ s& D, h0 j; o5 h/ E/ I1 {* Q
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word9 b2 S5 H. p8 W9 z. y, [: O" J
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
{6 r1 m; M" e4 h$ r3 U mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side) V q' |2 x0 G! W- }% L. q+ i% z
mcasp->regs->RTDM = 0x00000003; // Slots 0,1% U/ q1 u3 b( A5 B8 X
mcasp->regs->RINTCTL = 0x00000000; // Not used
$ X6 X+ Z$ O5 T+ V% ? mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2569 e, W+ P8 A; e: _. V# Q/ P( R+ r
' S! Q" Z! N+ v0 I# c, b, E- `
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
3 r% T- T5 B! @% T2 c; h mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
5 u5 O: l: }, I( ]3 @ mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
) n8 L$ Y9 M. ? mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16. ~8 T% x8 X( b4 e: I* I
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK$ u' [& V2 c( S/ q, Y" X- z
mcasp->regs->XTDM = 0x00000003; // Slots 0,19 P6 k# x S& X2 p+ H
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
& |2 j/ q: G: t9 Y7 m5 y mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256& U: q9 p5 ]( D6 y6 d7 z( m
" S. z3 V% R% Y8 k4 h5 a mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN: O8 S' i4 d" K
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
( z, r+ H- c+ b# R- Q. H mcasp->regs->PFUNC = 0; // All MCASPs2 u" Y7 O- M1 i9 P% _
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
9 w: D2 g: E" M* V1 @# ?* v" R) _8 z0 l0 S! g8 I
mcasp->regs->DITCTL = 0x00000000; // Not used
0 K. R/ b! K1 b& z mcasp->regs->DLBCTL = 0x00000000; // Not used" c/ P1 L7 U! k9 W9 v4 I
mcasp->regs->AMUTE = 0x00000000; // Not used
" u7 p" G! a5 r/ C9 ~: s }! e' L% C9 W9 _9 o2 F# ]
/* Starting sections of the McASP*/( ~5 a& c! X. I6 k" O
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
+ W! g( M. v$ j2 Y" ` while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
0 v7 R$ g; x$ R5 `; r mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
6 J3 V$ d+ Q: Z7 }, W/ w; b! ` while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
7 \( U& u8 G0 K, w
! @$ h' n) _# {3 a4 c' s mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
$ o8 r% n, n; \* i3 @& Z: H# O while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
# o. Z& f; e" r8 } mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; + D* \2 l3 J8 H5 m" a
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );$ y: ^0 ^. L) c5 G! m
3 h/ E5 a/ K0 C" d; j- [3 s
mcasp->regs->XSTAT = 0x0000ffff;
4 e9 x+ D$ j% \5 w& x e mcasp->regs->RSTAT = 0x0000ffff;
& j9 e- Z. l- G4 \+ ]! k5 e2 ]0 F0 N0 }6 j+ V
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
5 f4 K0 P( ~$ Y; Q* ] while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );; m' \, P$ v6 F+ K. o7 k
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
3 y* n4 p4 y2 j while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
) @. H) y m/ \* B' c: _. h/ J1 W. j/ s! I5 G _
/* Write a 0, so that no underrun occurs after releasing the state machine */0 p8 g0 K+ n2 k" N
mcasp->regs->XBUF5 = 0;
6 o7 k' p/ z$ b mcasp->regs->RBUF0 = 0;( k3 u. P9 V" A# @) H; ~
: `( a! t, D/ T3 l mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 8 |* @/ v \ g. _, [ d! h
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );# v9 w* D6 x" `; F4 R9 `
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
' Q, |: ~8 Y a% H while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );; N' Z; ]) J, v' S5 D! x
/ c9 h! @# v( z7 D8 F" K
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
' ?2 }: ?9 z+ @; E while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
4 D! t* y7 o/ f7 e+ k# `3 j mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; % E% F5 ?) _- `0 T1 U6 d
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );0 g8 X: r& D5 Z2 j3 g0 y
. x+ |7 T* E% c% ~ CSR = 0x0000;3 S8 v' U; o' Y5 Q. j
INTC_INTMUX1 = 0x3d;
, J/ V: P) q- S8 o; { ISTP = (unsigned int)vectors;8 r# m0 {& t3 x. x2 f
ICR = 0xFFF0;
8 H6 V0 K- L; E a2 Q$ M- r) d IER |= 0x12;
" U2 h* w& Q' X3 z8 { C CSR |= 0x01; : v# _7 M( b' ]5 U3 ^' [
. I: T( q& k. Y5 {6 A# K5 i& N& m( H
1 a& h0 C5 D5 O& a! K H还有就是两个输入输出函数:
5 |' S: f c# }void output_sample(Int32 out_data). T, [# D0 `6 _8 O r+ A
{' j+ Y S) s8 @" \# y7 u Y0 ]
AIC31_data.uint = out_data; & } [' u- l6 o, `
MCASP1_XBUF5_32BIT = AIC31_data.uint;
0 X+ L, V4 Y5 [* S}) z" X) F+ r/ c9 z
7 b' \6 u. A8 }( l$ ]& i
Int32 input_sample(void)
% F( X* U: F6 L{ ' S. @$ G8 u: G) y; n% y
AIC31_data.uint = MCASP1_RBUF0_32BIT;
& k% w& r; e! @3 b. P1 Q return (AIC31_data.uint);
. H6 w5 t9 a+ n4 l}8 E+ ^! B! U$ e; P2 y2 |
- Z" u( a( j4 o
|
|