|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:$ L: c5 E( K5 C5 `* v( L
main文件:
% `! R1 u }; Q. a c/ Z- r9 {$ Binterrupt void interrupt4(void)
3 Q+ ^8 I8 M) n% [{
5 C. p. r; k5 D) H5 D8 v Uint32 sample;
0 o7 v) H+ _* g @/ q: t+ Z9 T) e8 u
sample = input_sample(); // read L + R samples from ADC8 w1 o/ \; H* J
output_sample(sample); // write L + R samples to DAC - m) n9 N* c# L
return;
: |9 `- L/ i6 D% `2 V}
: G6 G% l% x$ z) a: H8 q( L% f* M& C
int main( void )
" I( f N4 @* I; |6 \7 S4 ^6 S. U3 L9 ]* x{
4 K4 B9 u+ y' R( Z% c9 `
* i5 E2 \+ r# _ /* Initialize BSL */- m, \# C* S) A! J3 ]
EVMC6747_init( );/ _5 B2 F0 V9 P& r8 J. T
/* Call evmc6747_intr function */
0 \: w# o: s( K/ X aic3106_init( );
+ G4 y0 w: U Y6 X* x while(1);
9 C1 T' S( G k}# D' m; x( w2 @2 J; O5 J
; R" a2 `# T7 B: L# n
, z" r$ Y/ s2 r% h8 F
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
/ _" J5 D0 {6 i" o3 J5 g8 f8 o; a. f/* Initialize MCASP1 */9 u( b% p L H1 u1 K( N
mcasp = &MCASP_MODULE_1;
9 ~7 i6 f! j7 I8 N1 h) j* ~ O; K, g mcasp->regs->GBLCTL = 0; // Reset
7 t$ O7 N0 }; r) d8 x& z7 Q mcasp->regs->RGBLCTL = 0; // Reset RX6 p9 |' y; U8 Z. b4 w( V
mcasp->regs->XGBLCTL = 0; // Reset TX
# J2 A: w$ e: L7 E mcasp->regs->PWRDEMU = 1; // Free-running4 K( {% I5 S. D
// configure McASP0 receive registers
1 B( T3 [8 o+ ?5 o1 U) z+ [ mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used* J; F6 k. U# d" K! h2 d
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
T7 s6 @" h! p3 w( X mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word( H% P# {9 v1 l$ h8 M# w4 R$ U
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
' L" H, x& T. t mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)- ?7 j8 ^8 I* I7 r8 g
mcasp->regs->RTDM = 0x00000003; // Slots 0,1" a1 w+ k1 t$ P1 U
mcasp->regs->RINTCTL = 0x00000000; // Not used
?) j% G4 @3 d N mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 b+ ^& s% x' T5 a
* ~$ G1 h: [8 ?0 Q6 c6 S mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
' I/ V5 O$ k3 m% p- s1 w' w mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus9 W" {! L$ L- g3 S4 M' {9 E
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
% W! Z z' U% Q* ~ mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16$ }# S8 u& l9 \4 f u" U
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
+ w5 ?# l; P v; B0 C. A; I: V8 c mcasp->regs->XTDM = 0x00000003; // Slots 0,1
7 U- ]* a4 \ Q4 K o2 @6 } mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
8 V U( |' U% l u2 E, G- g mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 K9 u, u/ u* t
: E* a, G' n- E- D0 j9 c mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
|6 t2 Y3 q6 u9 b; S+ m4 [4 S mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
8 F0 \) g) Q5 Y+ V9 N4 W mcasp->regs->PFUNC = 0; // All MCASPs
' p3 U8 d# N6 o1 H2 m2 l1 V mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
k' s0 j) X/ T0 |, J6 [* r
' }3 o! {# m$ @+ q1 |, c mcasp->regs->DITCTL = 0x00000000; // Not used! M! z4 e& {# s( x
mcasp->regs->DLBCTL = 0x00000000; // Not used* H1 ~! |; X* `, x" @* P3 |8 P
mcasp->regs->AMUTE = 0x00000000; // Not used# v" o9 f8 a3 ~" Z5 u
- s, t. N0 O @" W0 H9 V
/* Starting sections of the McASP*/# H: j0 c: J+ R+ H: P5 ]
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
# U- Y6 U6 f) B. O4 M4 S( K while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
9 M$ u5 X @0 O1 c1 c& ^ mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
, u' a2 f7 Q- W5 y0 l$ q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
; X" v/ n7 u8 h, z d3 |$ I! {+ T4 C6 r; ]) w2 I0 M: U" J
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
/ o- D7 Y3 a$ p5 x while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
! K" l# o8 \- K" O: ^ mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
# |2 f- L+ W. c while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
$ n( V; M& Y# d* `, z! d" c: i0 |2 b% V5 D- ~; g! V, z6 E
mcasp->regs->XSTAT = 0x0000ffff;
4 o% V! G7 o% S u mcasp->regs->RSTAT = 0x0000ffff; & u5 ?' {, f5 | K
4 O& C3 @: q* I
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;3 n1 F# C) w' m9 e( v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
9 t& P, `% ]" X mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ) Q4 i' W2 m6 L
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
# V2 [5 r, q* e
! a$ {" [3 r7 r /* Write a 0, so that no underrun occurs after releasing the state machine */
6 ^% U% T; M# X* [8 c mcasp->regs->XBUF5 = 0;, T Y: F1 d ?0 ?6 |* q
mcasp->regs->RBUF0 = 0;
3 {$ Q$ o8 r8 G
. P! |- y' Q; Z' n7 e& I7 ~3 X8 H6 | mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; n, m e4 r$ a% _$ d+ Z" M
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
5 O& L5 T/ t) o# J mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
1 [) g* s, b! z4 ]; {9 E- S0 [' r while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
4 N9 k9 e" T) i p: L) V
" J- K* s- A7 c8 X. \6 ~$ B mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
2 o; g1 c- Z6 T6 m2 x while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );6 q @, S0 Z# ?4 K
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
& Z! F& }0 \0 O' [ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );3 n- E! n3 X- u" F1 i2 ^
( p1 i x: q0 K3 D: N8 g/ _ CSR = 0x0000;
% |6 A. Y! \6 q3 G6 W# m5 N INTC_INTMUX1 = 0x3d;
9 D/ X* v, I# I0 T ISTP = (unsigned int)vectors;8 {, ]1 b$ E7 |/ ^8 e& f4 E8 A
ICR = 0xFFF0;
! g" ?/ L' ?% |3 {; ~; _4 }1 @" O IER |= 0x12; 4 H) c% ?# t' Z" ]
CSR |= 0x01; - T: @$ B `, v+ u8 X+ I& s! `( l
" M+ ~4 D. b$ i+ G
' J: K9 q( N! \! `0 A. o
( T. k3 N$ l$ K8 q& g9 F' K还有就是两个输入输出函数:
6 J1 _9 c8 s f7 ~" o/ p' x; Xvoid output_sample(Int32 out_data)
% z$ E1 D+ i: J! i' W1 R& h: ?{
3 G: e7 F3 L9 ]0 Y3 C. K. X AIC31_data.uint = out_data;
0 S% \$ Z0 m) E ~. }0 c( V/ P MCASP1_XBUF5_32BIT = AIC31_data.uint;) e* A7 _/ X. H9 q+ r8 S
}5 j( i% e4 v; u" R
5 c& I3 z8 b0 E
Int32 input_sample(void)0 u- J% s. P4 n
{
* ^* J7 X5 x0 L+ Q* k6 f AIC31_data.uint = MCASP1_RBUF0_32BIT;; p7 e' H& G* [$ ~
return (AIC31_data.uint);, c8 ^* ]) i# Y- L E
}: I7 j A/ @% h" |( u& w* k. Q
0 @/ U3 U) h: B+ I$ b) ~
|
|