|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:; G, J0 v' {! b) {# c
main文件:
' @' e, f" I/ m1 v6 N5 ginterrupt void interrupt4(void)
% w% W- z$ W# o7 `3 J{4 Q( _" j) Q. K. }
Uint32 sample;0 C' h* g7 V" p
. ]4 C5 g& ?, v' ?9 C: n9 [ sample = input_sample(); // read L + R samples from ADC7 v2 b% ~- C0 u* `# A* q* u
output_sample(sample); // write L + R samples to DAC , J' G M# l/ V) C; t
return;
% H' B( f& L) w3 y}
8 V5 X' |1 i0 N! c" V0 E, j u
+ o! g8 Z1 w2 g# j- v. B! Rint main( void )2 P: Y. ]0 A1 V8 C. V7 O
{
4 t. x, s8 Y1 q2 m9 ]$ Y
, V2 n: j8 h) m# O7 T /* Initialize BSL */
! H% C G1 L$ ?& d6 N EVMC6747_init( );3 y1 T u; ^- ^- P9 l
/* Call evmc6747_intr function */+ [! z; n) X. Q! ]; {; W7 d, j" l& ~/ }
aic3106_init( );. e2 n$ Z N. V* h$ r7 q
while(1);
. v1 x8 c' Z/ Q: e}
3 E4 Y& m& i0 M# r f6 F7 K: h7 I& b) y& `
; f: o+ ?6 g- Z
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
+ [! x% r9 p2 m0 f; t/* Initialize MCASP1 */
" Y! S$ ^3 ` \! t mcasp = &MCASP_MODULE_1;
5 t! H, A& r8 Z& B7 `; z/ c mcasp->regs->GBLCTL = 0; // Reset8 [3 m0 t0 }: P6 u. v, v% w6 Z9 `
mcasp->regs->RGBLCTL = 0; // Reset RX. S- Y _! Z5 q8 s
mcasp->regs->XGBLCTL = 0; // Reset TX P* x# ?8 q5 Q: S+ G) J9 j
mcasp->regs->PWRDEMU = 1; // Free-running1 k2 Y, R, ^: }
// configure McASP0 receive registers2 J: ^, h; ~7 I- |8 }; o$ P: x
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used; s. Y9 m* j- D* X0 E
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus& j5 g/ D2 ^$ E5 Y+ p
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
: R+ [. t0 m V( _+ g mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)' Q6 j; M7 L3 G! e B
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
; G! F' E" |8 q; i( z* y3 h mcasp->regs->RTDM = 0x00000003; // Slots 0,1) X0 w3 T* s. c" r
mcasp->regs->RINTCTL = 0x00000000; // Not used! p0 J8 R; E8 B: E1 U
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
% w8 O6 F7 v& J3 v! ]* k% i
8 e7 y7 \7 K, ~/ \/ ~1 P mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used: k; \, q9 K- V3 M1 h
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus8 U" n: K3 S) i( \4 W
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word6 n4 j3 y7 a! d; Q! l8 a7 q
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
( _# ` j b; P2 O3 \7 i mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
* K3 E' k( p e% J% ] mcasp->regs->XTDM = 0x00000003; // Slots 0,1
1 ], ]- O' X0 Q( c# w$ x ~% O mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit9 A" v3 S. `8 V
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, b1 d' V }" y5 ~
) `6 t1 M1 y. D2 F6 c2 A mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN# R4 X' }4 ^- S1 F/ s% q4 ?
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT3 G( @# u P( Y: ~$ [/ {/ `' o
mcasp->regs->PFUNC = 0; // All MCASPs T* a8 R9 M* C6 j! ?$ d, ?
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
5 P: Y" R6 @5 `2 Y
- |2 n h; {. e mcasp->regs->DITCTL = 0x00000000; // Not used
. ?9 h1 G7 Y. O& A5 @, e) \% |8 L1 C mcasp->regs->DLBCTL = 0x00000000; // Not used
5 C' E3 q: P& Y0 } mcasp->regs->AMUTE = 0x00000000; // Not used( z" }" ]% o8 z2 e% v
: u4 I1 T6 ~! j0 ~: d
/* Starting sections of the McASP*/
1 _, u* ~1 U5 K9 v mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; # c* y n4 B# m9 [. @+ {* ]# R0 J. r
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
# H8 j/ c* a4 N. l _& J' [ mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; . R- L: \+ M% W# w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
* `+ w7 }7 r3 O9 \- _' z- R& K3 I" o
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
; ~9 {# B; d3 Z! h/ |1 w3 A while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
3 i+ a# E7 Z3 W% X( o* X `3 G0 |3 I mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; " v+ K' T# ?2 N* p
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );5 ^3 k( y: {9 F0 ?$ M" Y
o Q2 M* U: [: w, v+ j' J- T
mcasp->regs->XSTAT = 0x0000ffff;
: Q) j. U4 H4 d1 K# y' V mcasp->regs->RSTAT = 0x0000ffff;
6 s3 D* |2 E" K$ o3 }9 M% k
8 @' F6 A2 ~$ A8 L: p# H: N4 L* G mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;9 R% o' C% j# G8 O8 K( ?
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
8 I+ e. X4 s- e% L. j; e. a mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
1 ]: b* N0 u9 s( g1 Z while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
& |/ D, e! U9 Y$ R/ n) s* `( s- Y9 {8 y2 b# I
/* Write a 0, so that no underrun occurs after releasing the state machine */5 A r; K ]% T. z# a
mcasp->regs->XBUF5 = 0;
/ k4 R! |* V/ W. e mcasp->regs->RBUF0 = 0;% D3 g" q* o1 ]; s1 N
* c+ n0 ~. |6 E! ?: N8 h mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 6 ]* k: a. L S2 ^6 p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
6 c# j1 G/ U4 T mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
# z# g+ T* u# d while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );9 [8 g; |! h% O* w/ u
( H3 X, R7 y$ u* S
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; , Q P1 J; H1 ^
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );5 g8 L- e& k1 W4 {$ S1 l
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
6 w( K3 h) w P7 v while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );2 N0 c5 t) N8 Z- x" d J z& m
" f2 X% w: e) n* A& B CSR = 0x0000;6 C' g, F$ X, a/ ]. E
INTC_INTMUX1 = 0x3d;
1 A, e1 q+ F# O, y7 o! l& F ISTP = (unsigned int)vectors;3 v# D) [0 {1 H+ p/ \/ g5 G% q% ~
ICR = 0xFFF0;
+ [& z& V: {# v IER |= 0x12;
8 M0 C6 C, ~$ o* B8 B CSR |= 0x01; 6 u9 p; K5 C' `$ @. c1 m- l! d
% B8 F% i8 W$ i1 [$ [3 c& }8 S0 B/ ^6 S1 q0 D6 x% P+ {% L
- G, \' M8 d# a. K4 _; g$ }还有就是两个输入输出函数:
+ T, h/ v! V) l3 _ ]. _) fvoid output_sample(Int32 out_data)
9 C2 ^ a9 M; b0 _+ ^; N5 |{$ ^; ~+ P6 |+ x2 q. s
AIC31_data.uint = out_data;
$ j& G! o ?6 x# Y7 [# M: g0 L" s6 | MCASP1_XBUF5_32BIT = AIC31_data.uint;: W6 Q: `" N9 {- H0 U$ \
}
1 d& g1 Q7 h' Q: `' n2 E0 y4 b# v7 u9 U
Int32 input_sample(void)
) o" e& q+ c ~- z+ v{
/ M: f, f( G5 @0 ]$ O AIC31_data.uint = MCASP1_RBUF0_32BIT;3 a. V* T5 [1 t7 Z
return (AIC31_data.uint);
& b, y( s' {, G. R8 I( W}
' _, v7 a; N2 V# {; m2 F- t
0 U9 C, s" m! U. ? e7 B$ [ |
|