|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
3 J( X- u8 B7 Y6 @5 }main文件:
* D& \- G) O9 Uinterrupt void interrupt4(void)
: {7 t' |2 h# B" `{
3 Y. s- i/ M* @# g" n Uint32 sample;& w- F; r% y/ n, i
$ N! O9 w: }! R. W& z sample = input_sample(); // read L + R samples from ADC
) I( z, N ?* Y7 R. A0 a output_sample(sample); // write L + R samples to DAC 7 @* U' F% n8 z
return; H; ?8 ^! T; ~- G6 g V; `. d
}2 k! \$ z0 o" R. G: x9 }; H
) n, I# u! V1 @! d. J1 E. p1 t3 Z9 \int main( void )8 U, t9 q4 H2 d
{
% D- D, e2 h- V6 q/ m$ Z
! o# E0 S0 k2 V0 g) @$ I /* Initialize BSL */
& L( K& g, V0 {$ y2 S1 Y EVMC6747_init( );
7 `8 L4 l: B! k /* Call evmc6747_intr function */0 l+ Q8 }' Y) J2 b
aic3106_init( );5 a3 F" l& W2 h3 z
while(1);
. z9 d( [& Q- t1 ]( [2 R}
* i# F' Y7 k3 f' D
6 r. o5 O% E! l9 z3 ~ x4 h7 A" |4 v: z
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
! S, p4 ~. h9 \, }/* Initialize MCASP1 */
3 y: n$ Y* }7 N U1 I5 P" {( U" T mcasp = &MCASP_MODULE_1;
- }' n7 c$ m& x$ k mcasp->regs->GBLCTL = 0; // Reset( f8 a# n4 Z* L4 s# }; j6 Q: Y
mcasp->regs->RGBLCTL = 0; // Reset RX. K M( H! o& \/ y/ U
mcasp->regs->XGBLCTL = 0; // Reset TX) c1 g! g. M, j1 M
mcasp->regs->PWRDEMU = 1; // Free-running# C' ^! f- {3 g" g
// configure McASP0 receive registers. N9 a6 P0 @( b( G6 b
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
. A: q+ v) w; r' l* ^$ I* u% \ mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
+ g- l7 L% R7 U. ^1 z* Y mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
8 _* S" i2 d' ?; P t mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side) i: Y' Y$ \2 J. V( [4 B1 y3 B, B
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
7 X) S9 R/ m- ^: Z7 j" J mcasp->regs->RTDM = 0x00000003; // Slots 0,1" h0 I' Z5 r4 C( ?- T" G4 F
mcasp->regs->RINTCTL = 0x00000000; // Not used
- C% v: P5 I6 X; T0 G7 @7 j# T mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 z1 x: `& i: A+ H' h: _. C J$ H! [: h0 |: ?( T9 X
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used- t: P `+ {7 e- P) |) E; B( S c" j4 o
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus7 `( k! v) ^- I4 U* J
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
- c/ h% }) `* C" [, Q1 t mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-166 ]% W* y3 V- @& I0 {1 F* y! t
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
0 x6 ?* ]/ j1 A1 k" z2 s mcasp->regs->XTDM = 0x00000003; // Slots 0,1
7 n0 J" `' a/ d( K* x# m4 L. v- @ mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit! P: o- M+ m) w5 K' v' d& l7 g' O
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256, u* y% w( e) S# ?0 k n
+ M$ F6 s/ ^/ u3 ~. z Z! P: F mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN. h2 p. A) n3 e* O1 s
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT( H6 g* \: |# n. P, V# ]3 }0 w, T
mcasp->regs->PFUNC = 0; // All MCASPs
8 I/ w# F! `2 K; X mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1. k- ~/ H+ H# {1 p0 U( b/ o, W5 R( t
5 h+ f& u& A7 X; ~# W
mcasp->regs->DITCTL = 0x00000000; // Not used
- M) \: P1 P1 l$ N7 P mcasp->regs->DLBCTL = 0x00000000; // Not used
) s6 e# ` ?5 k! k& q/ | mcasp->regs->AMUTE = 0x00000000; // Not used
. b) z+ ?! z( F* z
# A, E, Y0 T- M/ |; g/* Starting sections of the McASP*/: n4 y. L3 {* D+ f+ }- ?
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; - F' l5 W/ ~& l& ^8 }4 }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 1 h; t* i+ W7 {3 j; B) t
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
% V- l8 q7 f R3 p3 x; F while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
! P( f, D. V- `9 h9 r" k$ P
, }% U" |3 E% g6 T) m4 z; z J mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 8 f) v; k4 b% @3 ]( a
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );0 e2 G; _$ I0 s8 l) S) ^+ K" B) W
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
' i+ B7 Q. s, v1 F @/ ] while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );5 W" e7 y& @3 j; Q
8 o5 ~) m; B% }+ f6 v
mcasp->regs->XSTAT = 0x0000ffff; 9 h# n* W2 }9 u0 ?9 @
mcasp->regs->RSTAT = 0x0000ffff; + C4 [1 J/ u! l" m4 f# g) e" J
3 o2 u$ q. Z; B1 R8 Y2 U% K' `1 Z. M mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;' h; m# P# L2 I2 X! N
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );' b* Q' S9 k# Y
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
( _5 c9 _ M( q( E( y7 Z: s while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
" k# g) f+ \) T. @; I+ O& |6 i! O( S" L/ T; ^
/* Write a 0, so that no underrun occurs after releasing the state machine */- ]# ?, K" q* E, J" r' E8 f8 q
mcasp->regs->XBUF5 = 0;
* q2 i1 _; b4 B/ ~4 o+ J" w/ q; w mcasp->regs->RBUF0 = 0;
" M: Y. A9 C% n- s
* a L( v+ ~5 V _ E5 K( ?3 D/ ?+ M# o mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
9 O. n+ D. g' S+ h6 R* x while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
, l! B2 g7 T# X" D- k7 d* Z1 N mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; . U6 }% N9 Q; m6 g! f' H
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON ); n3 f9 Y3 M/ V3 o$ J3 Q! U$ H
+ Q2 o' x4 O0 A mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 9 e5 y/ `8 K! v( ^& I @# O, d
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );' X" a9 Q; r# }& E
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; * L& n0 j2 c" Z. Z$ C1 z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );+ c3 U' v: l1 N8 _$ G) ]
) \' n6 G9 [1 C. {0 ~
CSR = 0x0000;
0 R$ e. ?) O+ R2 y INTC_INTMUX1 = 0x3d;% H0 b O; f+ w$ j; _ B8 Y
ISTP = (unsigned int)vectors;
( q) F& \" i l4 @) G* ~' Q ICR = 0xFFF0; % H& K, h" ?! m
IER |= 0x12; " C. V' c- c$ E
CSR |= 0x01; 4 R, Z" k* b {8 [
* a! w' R% J& u( F8 y, E# g2 x
$ Q( H: y. w& I6 u5 T: R- @" E' ~4 o7 [4 Z
还有就是两个输入输出函数:
; i* Q: Z) p+ V hvoid output_sample(Int32 out_data)6 E+ ^2 }3 E6 ]7 T
{
^- J4 O0 e4 `/ W8 M AIC31_data.uint = out_data; ; q" N- |# r0 ]+ w* m, \- s9 [7 c
MCASP1_XBUF5_32BIT = AIC31_data.uint;
1 M8 g4 G! x+ {3 }}
8 |! I8 V$ M* D" ]6 b" k% e, v( o* R1 y" k4 i
Int32 input_sample(void). W3 d( _5 v( N: }! Z1 \. H1 e
{ 5 D8 ~7 r" x! d
AIC31_data.uint = MCASP1_RBUF0_32BIT;
" @7 c* O) N- u. Y/ h. \, b+ K" l7 k return (AIC31_data.uint);
" k; B1 @# K* F+ w$ a}
G. w# y; s. a8 o8 N$ L% W1 l, K0 [' ]7 m
|
|