|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:1 z' |5 c5 p5 I
main文件:
7 ^0 T5 E8 k. p2 ?: ?interrupt void interrupt4(void)
" p5 ~) O1 p7 z9 D7 D! Y/ I: P8 b' Q{
: W" k1 U- E; a! R Uint32 sample;
( ]( ?* ^4 q. R- I+ A
3 \# W$ L! r" D; I5 R sample = input_sample(); // read L + R samples from ADC
! t5 M5 L' d; Y% r output_sample(sample); // write L + R samples to DAC
. \" r7 Q) R. ~ m" q* M0 G& Y return;
) g, V6 A* M m1 p/ g' S3 ]}
. ^! B) m* L% \# q: K( L& s$ \! V @# a' e
int main( void )7 N( D7 R, v" J1 X S5 \
{6 ? m9 {+ u( _$ @1 {& O- @
; ^) N: H; p+ A \+ R [9 T1 W
/* Initialize BSL */
: n9 f) q2 J- z; G/ @ P. c EVMC6747_init( );5 x6 F+ @$ Z; C* r4 l- u
/* Call evmc6747_intr function */3 x, X2 g* a I
aic3106_init( );
7 ^7 z( M: r8 G* P M while(1);5 p- A* S ~4 \; q1 g5 [
}. s$ |+ m9 s, G/ q6 Q; \* J
6 t- T. M" O E5 U# C4 A: }
' K2 D+ ?& N* @aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
0 c: i% r" p: ^% Y/* Initialize MCASP1 */
* L1 k+ N. S2 B, s" p; U. l mcasp = &MCASP_MODULE_1;5 Z4 n6 C* ^ E; G* \. y# {" b& G
mcasp->regs->GBLCTL = 0; // Reset
6 W* ?5 a/ E$ K- P mcasp->regs->RGBLCTL = 0; // Reset RX
, i) q6 B9 Z& p" I4 W) Y) V mcasp->regs->XGBLCTL = 0; // Reset TX
' P$ g) Q" H, J mcasp->regs->PWRDEMU = 1; // Free-running
' H1 `) K* P' ~8 K: p; A2 B // configure McASP0 receive registers
7 Y( Y3 X. U2 O) v8 o- k4 ?$ \ mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
/ t; S& n6 L( F* D% a. |2 E mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus5 J J; p5 r) z! z, }. a
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
1 b& d- A- Z0 c5 M6 V$ x( F" a8 g mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)6 A: x+ n) D! |
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
7 Q4 ]* I: [+ X: G mcasp->regs->RTDM = 0x00000003; // Slots 0,1
" I$ j( B4 N* Q8 {: |* }4 t5 w mcasp->regs->RINTCTL = 0x00000000; // Not used
6 m" K R' O* U mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2566 D/ t2 K+ B: l2 {" K3 B
! d3 \5 X: Q/ }0 b: g mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
# W- K7 d6 e2 l% n0 H1 V0 X4 _% N9 W mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
8 r+ j( i; j$ R5 O" r6 p6 L mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
$ }! Q: L) H8 W5 Y mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
; e7 j$ A$ g0 f9 z } ?9 k4 e mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK9 `* o( G; T- F, U
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
. N' g0 V2 \0 A, C mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit& i" n/ q4 n: d+ |9 T
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
& n, S5 l8 s2 p
: Z( o1 }) O/ M mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN( o, d: h- G. m9 N2 m, x x5 a
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
/ G& y. ]* |) o mcasp->regs->PFUNC = 0; // All MCASPs" z# M% ]# B, I! N4 l2 E- Y& g
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX10 v& z# C6 U1 F& r% }$ c \# C6 E ^
Q/ q9 H w- p C mcasp->regs->DITCTL = 0x00000000; // Not used) e/ k* H) W& Y. v ], s
mcasp->regs->DLBCTL = 0x00000000; // Not used, i* M( a/ t* _6 {/ N
mcasp->regs->AMUTE = 0x00000000; // Not used& o0 ] h$ P# I+ V4 Z6 O
$ n+ B8 w; M, j% Y; S/* Starting sections of the McASP*/
+ R7 w( r' |% j mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
, N( A9 c( y' W5 @+ h% J while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
0 j( S7 s; A. _ mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ( p! U7 d6 [4 E9 j o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
0 ]+ d3 F8 d* h
3 v2 J' ]) D4 E) h* I mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
, F* b2 t6 A: W1 Y+ p while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
5 V$ E& y: {2 l. j+ _8 G" o mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 3 j" u# p* P' _- ^
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );2 ~. E& i( B2 u8 `# I
8 \- p f1 O0 M6 P
mcasp->regs->XSTAT = 0x0000ffff; 6 i3 K W) Y+ W7 F- r3 Z. n% v
mcasp->regs->RSTAT = 0x0000ffff; ! y' {# J) B) d y% p' o
) d. \0 ?# d* c( M J
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
- f4 x/ }3 d, F: [& ]9 q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
" a ~! F" l( ~5 i- {4 A5 `, G mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
; D. Q. g( y: ^0 p. h while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );- y+ D0 g8 x7 m+ j9 x
1 C7 s# Q% h4 l) \' U /* Write a 0, so that no underrun occurs after releasing the state machine */
) q) V- T: G. ?7 k mcasp->regs->XBUF5 = 0;
$ t1 e5 z2 [9 @; p" D; a mcasp->regs->RBUF0 = 0;; a# r& i1 q' b8 Q4 h
7 j- A4 a, j% R/ c mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
# d( w6 b+ w: K# m while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
0 Z! C3 c1 z' S mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
! `, l5 ]% p( \6 e" B while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
: D. n) O- H1 |9 ?+ `0 e1 k( u7 g! j; @9 e9 i9 K/ k, V% ]
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
' U; n( l2 C& P0 H" c5 G: f while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );' Q9 y! Y; ]' ~5 j2 v! G
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
4 Q. h, _0 M/ _* u1 `" [+ z) E while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );; h; i! e$ L+ B$ `7 p. J3 c
) x3 e. Z( T0 t: t" K
CSR = 0x0000;
7 Z3 k3 ~5 l" } INTC_INTMUX1 = 0x3d;3 ?) J3 z' Y4 d1 z) u$ ~+ z2 k
ISTP = (unsigned int)vectors;
. D2 w$ P& v t0 @" _9 u ICR = 0xFFF0; . t- X3 w& b7 ^" q
IER |= 0x12; 2 |7 ~- D+ f! R$ k% D. K
CSR |= 0x01; # r) Y x- L$ m5 G; n4 e
$ Z7 ]; W: e4 H0 y" Q) i9 \7 z
+ R5 [. F( `" A! O1 u8 a; D: R" k7 @
6 R2 x% p X/ I- K9 G还有就是两个输入输出函数:. q# W, L( x2 E! O
void output_sample(Int32 out_data)& m4 Q* ?; Y \/ V$ r% P- I
{( |$ @, B4 `3 g' g, Y+ S
AIC31_data.uint = out_data;
: E# ^0 c1 R4 A+ D% @ MCASP1_XBUF5_32BIT = AIC31_data.uint;6 q7 T' N- ]! g+ R, w* V# E
}0 ~: }, Z. w) Y: x- K1 \
0 o/ R2 H6 s% }1 i
Int32 input_sample(void)3 G2 o/ X2 w5 `: O) y
{ / M( I% }0 R c9 _1 N
AIC31_data.uint = MCASP1_RBUF0_32BIT;
$ n( {: X+ O. X return (AIC31_data.uint);
K) {: B6 Q: j5 I}
6 `8 [6 d! `- c# z6 m" z) ]. q* N* @' f! k' r. i8 @9 e# g
|
|