|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
' [" I F Q! n: H6 V" ]main文件:# c. `) J* E! a% j8 F$ X
interrupt void interrupt4(void)
* @6 {. X/ }- ^6 T; N0 L{( V9 @ K' S: F& C2 [$ g: R$ G
Uint32 sample;
4 A" T7 z5 M v# B8 w+ E$ Z& }3 y8 ^& B7 B: W. D
sample = input_sample(); // read L + R samples from ADC
! B# W3 @2 ]) i, V0 y, k output_sample(sample); // write L + R samples to DAC
$ B( x! E" j4 m" u3 R+ m4 W return;' R0 ^( Y# i5 T% {5 j
}9 q% M# H7 m" }) w$ O7 g3 z
3 r* c: r/ A: P
int main( void )
% @, h. A I, m; G{; ]6 n& w1 {0 Z0 f( X
9 W! x/ i3 J3 i, ?5 h7 u6 ~ /* Initialize BSL */
* r9 x9 t1 L$ u- z EVMC6747_init( );) Y3 X# S6 {! Z* T( p$ p) m/ W
/* Call evmc6747_intr function */
# I" m+ j' l( \ aic3106_init( );
& F- v4 v. W3 {& l5 ? while(1);
: @, s2 j0 o) ]7 W}
2 V; z6 J- c E6 t
# k# c* ?4 L+ b0 ?$ `. a0 N) C4 y( E& E( ? k2 n8 i3 |, F
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题) T. k$ K* t: o N* `5 M: ~
/* Initialize MCASP1 */
4 b1 s" c9 f! |$ C# X5 M( x# y Z# [ mcasp = &MCASP_MODULE_1;
+ p9 w1 r- R5 R. @: b1 b mcasp->regs->GBLCTL = 0; // Reset% f0 ~& {0 L9 K4 {1 w
mcasp->regs->RGBLCTL = 0; // Reset RX
0 \4 E5 R+ ]) p. t/ A' ~ mcasp->regs->XGBLCTL = 0; // Reset TX7 t) c. O7 { s" `
mcasp->regs->PWRDEMU = 1; // Free-running+ i9 H5 y3 x2 c/ @/ q
// configure McASP0 receive registers$ V9 K8 I! C/ ?* Y
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
+ Z2 m$ h2 }, M- U mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
) u- F# d [- |, H: C. Z mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
% `* B% o3 y1 D1 |! w! C' z mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)* h d2 P: D' C U% A5 m6 c( m
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)9 v; Z: w1 J- @7 a' P* U9 e" y" \3 p4 _
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
, S: V# _ w1 ] mcasp->regs->RINTCTL = 0x00000000; // Not used6 L3 Y) J0 ]% U3 o- N4 d9 F5 p! Q
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! U% I1 L" p+ I/ H3 X# F2 W
6 t7 q5 k* z% r, ] mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
$ m6 ~3 b( u. J$ N: J: L mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% B# R8 t7 h1 S( f3 B% z mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
8 p% L/ e& d6 u- v mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-167 D0 v. t4 e5 F5 l
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
. ^( a& o6 d1 y# N s mcasp->regs->XTDM = 0x00000003; // Slots 0,1
# K0 k/ V6 H. L$ w6 p2 o$ o) ^$ i3 y mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
3 b- G0 \) e+ v1 T6 v0 I mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: b, x4 V' C. u$ B$ a8 { m9 i0 H% E7 i$ j ?
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN- X5 {& [3 i: O- M
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
( M" t: R- @$ P( n0 {: } mcasp->regs->PFUNC = 0; // All MCASPs. w" y* m& Q8 ~# w6 N
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX13 [- ?6 M1 d1 p4 o! a
, ?1 [/ j0 ^ X0 S- @2 w2 N+ x* h- z
mcasp->regs->DITCTL = 0x00000000; // Not used6 Z( J; D% r: o) B
mcasp->regs->DLBCTL = 0x00000000; // Not used
B+ ?8 p! z) ], I! w0 {! i mcasp->regs->AMUTE = 0x00000000; // Not used& E. Y$ z& K. q
, z! ~7 n* Y9 M. V; o: q7 h9 r/* Starting sections of the McASP*/
# z3 s# @, R) K mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
! b, p/ Y8 X" b6 ~ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); ) X9 \5 J: i0 h% g9 o3 ]- c" I% {$ o, b
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 9 F9 Y" ^7 W' v7 n2 w( I
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
4 a7 h# i5 e( ]* ]
. t% z& O/ u1 X" K0 p! | mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; + u ? g4 r6 X; s F
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
! @) h4 l t! H' N1 S6 C mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
$ |( ~3 j* K7 h1 t! U8 ^2 Z while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );# H6 t$ a5 D( D2 C! V$ D
2 J* e% S- E3 B
mcasp->regs->XSTAT = 0x0000ffff;
, {8 j( F% {7 w+ l' | mcasp->regs->RSTAT = 0x0000ffff; # q" o9 ?5 K- z$ C
3 U+ H; y0 j" r
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;$ g1 ^% a/ s1 J% @
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );) \8 _' M" o5 X1 [9 P# @
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; - h( v: F# c m4 l. Q2 e, L
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );+ U2 N B- J2 O
6 S( g# R* l% k8 j2 X /* Write a 0, so that no underrun occurs after releasing the state machine */
* C: s+ w1 [+ f: M1 O. ~ mcasp->regs->XBUF5 = 0;; R7 ]) U* o+ W2 n. N
mcasp->regs->RBUF0 = 0;
8 l/ ?' u3 H4 D2 d. p) L: o7 y! v4 {
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
2 k7 t6 x# S' G while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
5 S1 W8 v+ w! N5 h5 H mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ( }9 v. H4 l& ]1 j2 \
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );5 M5 D, c( Z9 T, Z6 x( ^( L) A
: n- m+ q( i$ x f5 L% {& t mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; % ~. C. b' l5 [4 }/ v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
7 A+ W) A. s- {+ [- `) q mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
' H4 ~5 `, a- m, t) y B) W while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
0 ^& X; c5 ]$ _3 v3 U X3 n5 @
* g$ Y1 @! K: [: \( @ CSR = 0x0000;7 c8 S4 Q) a' v. K8 N! s9 o9 C1 k
INTC_INTMUX1 = 0x3d;
) F, n. z3 l1 O6 s) z% o* D' f ISTP = (unsigned int)vectors;- ?* `' o; l% u& Q; n
ICR = 0xFFF0;
: S5 y" m; w. }' W2 N! ^3 |/ S3 O$ u IER |= 0x12; * {" t3 I l* T& _8 z& ^
CSR |= 0x01;
/ }+ }9 U& ^9 z0 C/ t0 _2 h P. h, q
* e j; k! T G9 R7 R
; P3 E1 u( T+ p5 x* }$ \还有就是两个输入输出函数:( N. i: K' B! g6 X
void output_sample(Int32 out_data)5 ~ p# n m1 j8 T: o& g" M
{
2 _6 ^6 C( v- E) C3 ^0 v AIC31_data.uint = out_data;
& M9 {, N _8 e# L MCASP1_XBUF5_32BIT = AIC31_data.uint;& ]+ {6 H, l+ ]
}# Y \1 F+ V$ y6 }$ T
2 a4 w; y0 C) D0 ^* i5 T, r& ]Int32 input_sample(void)( u+ j4 J# Y1 S
{ . g; a1 v6 g0 u- s/ s
AIC31_data.uint = MCASP1_RBUF0_32BIT;6 L) D, x! l+ h% n% m2 o; {. v' I" j% o
return (AIC31_data.uint);! _/ ^7 J+ R' X" E
}; W! | z3 Y2 i1 e" X
1 B( X; |; V! M. K: } |
|