|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:" G! y0 H6 T8 q8 @
main文件:
8 r: E- ^! Y J1 R) T- Ginterrupt void interrupt4(void) 5 t( y+ t8 O! o9 Y1 q& p+ H* s
{/ f- H. t7 ]- h4 ^
Uint32 sample;
8 e, r: J; t$ y4 i
6 h: Q' r# o3 I) @ sample = input_sample(); // read L + R samples from ADC5 T F2 e& [# |2 J8 a
output_sample(sample); // write L + R samples to DAC
: ?5 A; N4 Q. u Q- A& I return;4 l6 I- Z% [- K) b
}
$ |- [8 a, w- I+ |8 p9 i
: I, j0 P! R) }/ [0 U9 Q2 eint main( void )
# v5 I8 o6 N- O9 Y) k; U) G{
2 H' X# R' G9 b& |; O( N7 W) s0 R* b/ E
/* Initialize BSL */
0 m& u4 i* j" q! c B: `8 L4 X EVMC6747_init( );
9 v; ~$ U$ k# E- N /* Call evmc6747_intr function */- b' F# Q0 y0 [$ J
aic3106_init( );
9 M: u0 y0 e/ G' V while(1);1 g/ G+ S$ V# s* Y [
}6 u+ q+ K; _5 C% E* L, J1 U
& F* b, V4 P, Y- N9 p' i( n+ J4 q" x9 x% W
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
& ]2 Q( R W1 G/* Initialize MCASP1 */. I+ @! R' {( C1 V# I# v
mcasp = &MCASP_MODULE_1;
5 L( R+ t, m& B9 ^ mcasp->regs->GBLCTL = 0; // Reset
3 j+ a+ t7 n2 [# M- h mcasp->regs->RGBLCTL = 0; // Reset RX
4 z* f6 x* C9 f+ Y; |# H mcasp->regs->XGBLCTL = 0; // Reset TX5 o x- O. L- w0 R$ }1 ]2 k) L$ A
mcasp->regs->PWRDEMU = 1; // Free-running+ K. ~/ l7 F' Z- n
// configure McASP0 receive registers
' m6 w( ]% V. U; C. B% c% | mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used+ N3 I) C; m! J+ i) A& W5 x" I
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus" K; \/ v4 V% ^- @9 z3 D( X
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word! R$ _$ q+ |# U6 y
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side) g7 z9 t1 `# F! O0 m8 n
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)0 F' C% Z/ @8 f1 }# w0 w) N. F
mcasp->regs->RTDM = 0x00000003; // Slots 0,10 d0 j/ K5 f# F7 \
mcasp->regs->RINTCTL = 0x00000000; // Not used/ [, e/ M& V; k
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
" l& d2 b7 T( b4 Z; |) r
2 Z1 J, J" `# d9 J7 U( s+ X mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used2 B* E; r9 b9 D0 ]+ ~
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
9 X5 D( x$ _% E! ?) a mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word! P Y# K1 C- o% U, I
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
0 k! C" O4 z' f mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
7 }: t) ^2 r* @7 N mcasp->regs->XTDM = 0x00000003; // Slots 0,1
, O2 b" g9 t$ t8 d mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
Y6 S, N4 w+ q% H mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! w& \0 b$ R/ k( r/ i9 i% k: J! K6 i _& |# A" Y2 S9 V- V: @) P$ M
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
: `5 c$ P% _! V9 t mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT0 [7 B) v1 D% Q4 p; C1 ~- Q
mcasp->regs->PFUNC = 0; // All MCASPs1 F- O2 ?# {) I; [+ l& z
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
+ ~, l. H: x6 {, |7 j# p) k7 y3 G% B: Y7 M. s( H( l7 F
mcasp->regs->DITCTL = 0x00000000; // Not used( r2 X3 }. p) v) B5 s
mcasp->regs->DLBCTL = 0x00000000; // Not used$ Z" c/ |& E% {, P
mcasp->regs->AMUTE = 0x00000000; // Not used
, J( I+ X7 }3 O8 C: _3 V8 a
" R+ U# b( {/ i2 i/* Starting sections of the McASP*/# t( p) o' ?) }' c7 ]
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
: {8 F! A& B1 H( F7 U/ } while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
3 d/ h1 w1 {- ~( N7 @ mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ! S2 q7 [* h. q, J# Q1 }/ X& E
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );& Q: E- p; X# d2 P4 `5 y
3 a5 Q1 W4 R5 v9 y( w mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; " @; h% J* m7 c( H3 w6 i
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );& f. ~. r( S' j( E6 O9 A# P% `
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 8 G& k# ~% u! }- @$ Y: h
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );% X0 R Q% s/ P5 I
$ Q t- v$ {: Q8 ? mcasp->regs->XSTAT = 0x0000ffff;
' d1 m J+ d% D( i5 T mcasp->regs->RSTAT = 0x0000ffff; ; A% |9 h- S# u8 ^& ]! o
3 V9 z/ ~7 f8 i* H mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
+ P6 _9 [1 l( B) D; Z/ |+ x while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );7 v5 m$ t& V9 w4 f# X
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 2 H9 Q" z! @4 h9 u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );( P% ]" `; r. T* u$ v
* m+ w8 X/ y; |1 G, u4 T
/* Write a 0, so that no underrun occurs after releasing the state machine */
# [1 }! R/ r3 \ mcasp->regs->XBUF5 = 0;
# d8 p. Y4 A- p mcasp->regs->RBUF0 = 0;3 K2 t- P8 H6 y1 u$ Z% Q, k
8 g Q; X( O' L2 z mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
) Y' c% Z% [2 d& a5 M& e4 Q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
8 L7 f' c2 Z, \8 y. Y1 i7 H mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
! @' `6 a) z9 ^+ V* Z1 \% l while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );' k1 x( I! v3 w4 m
5 G0 s4 m W% g9 g J/ D
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 3 s2 S8 z- |" v/ e
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
, {7 J& d" Y) _3 d* f ^ s* G' b mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 3 ^5 e: C$ M. @7 C) C8 @1 M6 t$ {- L y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
/ @# O `: I; r9 d& p
9 A9 E$ `& f1 P6 i" c, r CSR = 0x0000;
0 z3 `6 K# Q# |* f. r8 q INTC_INTMUX1 = 0x3d;
9 Q1 X3 R% S& a: V8 _ ?8 u, C ISTP = (unsigned int)vectors;
7 w6 ] U- r$ u! ~) ? ICR = 0xFFF0; : I% `, v" X& P" m2 J
IER |= 0x12; & X) U F0 n; z D+ {4 H4 J
CSR |= 0x01;
( v; }$ \3 f- [4 K3 [: g& @% n) E7 e7 k8 ~
) F1 l$ e2 L/ ]2 }: E h1 h
: Q. q+ I" C2 c$ L5 h0 w% ]$ Y7 l
还有就是两个输入输出函数:
$ }+ k) e3 K( I% L6 L& Vvoid output_sample(Int32 out_data)
/ b& D! B- a: I/ y# C' ~{+ x1 f, L( m( Q+ ?+ K' D7 h, ?; n& t
AIC31_data.uint = out_data; , x( w2 Z4 e4 k% t8 _' m4 |
MCASP1_XBUF5_32BIT = AIC31_data.uint;0 q4 g9 k! J" M9 g
}
8 h) l7 h$ a6 P8 _7 ?- C" M s0 v. _$ [6 l+ w$ I3 ?- v
Int32 input_sample(void)
2 r' X- @/ r$ W7 E# O6 x& C# P+ \2 q{ / L- }& G/ d% N A- u# G3 c' e5 b
AIC31_data.uint = MCASP1_RBUF0_32BIT;8 h* k0 B' z$ u" I) P
return (AIC31_data.uint);
% N: o) D s$ [* ]& V}. U3 x! c+ C% M4 F" J- W
( z8 f5 w, E" U" ?5 c |
|