|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
- s7 ?6 Y. k3 j- Z6 xmain文件:
6 E }3 H0 ^4 R" _/ \. U, i: Y2 finterrupt void interrupt4(void) 6 G; C* |# T9 w
{
: T) O" {6 o' B8 ` Uint32 sample;2 b* o: k" | k/ B5 a; Q
- e. o i! {' M; Z4 t' N/ B/ g
sample = input_sample(); // read L + R samples from ADC
# }9 I* Z) N' p* E( a0 G output_sample(sample); // write L + R samples to DAC
5 q% I/ F; w y* O M return;
: s7 G S# j% P7 ?& u6 `' ~2 l}8 o, e: ^- J' T$ h: t9 |, h& b6 _
3 k7 O6 ~& C7 U: I" @* F
int main( void )+ z# ^$ c; ]. x: B9 y
{8 y7 I& [( H& q5 D1 ]. n) `- _
* ]* \: N7 {% \6 Z8 _8 c5 [ /* Initialize BSL */
. U$ J8 O# A( T# J! Z- {# J EVMC6747_init( );& N6 }& d! B, r1 I. R1 J; p9 _
/* Call evmc6747_intr function */
9 v _& c7 N5 Q+ t aic3106_init( );0 Z9 r) X d' d D" p; i4 Q
while(1);' c+ e( U, p/ U) P3 b' @
}$ T! O* {# F! K, t+ T* A
5 }+ x& A; o6 M# ?) C/ r
: U _: P$ \' c7 l8 b6 S9 ~
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题" Q7 ~' H) _ `! @5 w! R6 M e
/* Initialize MCASP1 */
5 g' w( C+ u0 @/ C& ^& j/ d5 X1 C mcasp = &MCASP_MODULE_1;& s, {. |& N" D' V7 g0 l8 n6 P
mcasp->regs->GBLCTL = 0; // Reset/ [4 |5 d& r% n5 u
mcasp->regs->RGBLCTL = 0; // Reset RX
: {/ F2 t& ]) U6 R mcasp->regs->XGBLCTL = 0; // Reset TX) ^5 @! I% h! F) m3 s/ a
mcasp->regs->PWRDEMU = 1; // Free-running
3 c+ h6 n v& T1 W // configure McASP0 receive registers2 Q" U2 q& k& H! `9 c& B+ v) W
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
: @; t" E: ]0 r. s _* f4 Y mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
! _5 c$ i3 U8 T' M, W mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word8 L: v/ F: J# l# o) M+ Q
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
9 I, D6 z( E8 n1 _- x5 X ?2 x mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
) Y; p" T& i. z6 _! p% t mcasp->regs->RTDM = 0x00000003; // Slots 0,1- `% U# P5 L ?
mcasp->regs->RINTCTL = 0x00000000; // Not used
/ i5 C7 _( G e' k mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. ^% n. @) S1 @+ O4 e: D& ~2 v6 Q. N3 `/ E3 T. l
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used1 H1 O/ ?& U/ W/ G
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus' v5 \# O' ]3 N& `2 M( |: i
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
( P" ?1 x6 V7 Z1 c* J8 q mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
9 O% m+ Q; E6 a+ ] mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK; f3 ], y- H2 e) V' X
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
* Y1 e: j9 W9 m1 I+ r mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
- _3 _ V' _& Z0 b2 p) H" _ mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2566 H- | H/ G, X3 f
# ?% U( G8 m- \0 r4 A4 R \
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
! R! I4 \ Y1 K$ q mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT8 Q* ^8 l+ Z8 j7 w9 |' l$ J$ V
mcasp->regs->PFUNC = 0; // All MCASPs' @# L. Z3 ]5 ~ P! ]
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1: t/ T g/ \5 x6 ~, V8 ?9 ?
/ _* [7 Z* A8 I+ y* r
mcasp->regs->DITCTL = 0x00000000; // Not used0 ^) S! m- T0 q
mcasp->regs->DLBCTL = 0x00000000; // Not used
9 K( \3 x) t# A- I- a: N$ l mcasp->regs->AMUTE = 0x00000000; // Not used
! e! F9 N3 C a+ c( O& ` g/ w6 j% d8 |5 X2 L6 E
/* Starting sections of the McASP*/
, o+ y- A0 G* W$ q! ~ mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 6 K2 K* y8 a6 P- o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 2 D& @3 w1 K( W8 i, _
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; C: q5 Z9 `! j: l3 ]! Z1 n% E
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );; V& G9 g8 w3 Q( _/ c( O7 O6 a8 B* t
' P& C* s/ c4 M mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
7 m5 e9 J/ w' ?: M" [* M while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );7 h! X7 v! b1 [1 ]6 x
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ! T" F" P7 V1 k
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
) u; ^* t6 L0 ]" g/ O6 P' ^; ], A& k6 g4 E. f, i
mcasp->regs->XSTAT = 0x0000ffff; ( W& d, Z+ v2 f( y: l) o
mcasp->regs->RSTAT = 0x0000ffff;
# J/ q* }" b- x6 u
+ G, s# k. M: ]/ t6 ~$ k mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;* t" V5 V% a& C! ]
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );3 c& d/ |& [' t; P7 O; k+ l
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
2 S5 X2 q( j0 U7 w" P1 v2 f while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
! j/ F4 ]5 I! F9 U$ u
) w& \1 Q7 f, N. e7 p" t, J /* Write a 0, so that no underrun occurs after releasing the state machine */
# r* w$ [& `3 U; [* Y; m mcasp->regs->XBUF5 = 0;& j* K' s# f: t/ F+ y" s: _' l- O! j
mcasp->regs->RBUF0 = 0;
5 _; e$ x# l3 J1 o6 n+ l) i+ E& J
! V7 D: A+ d0 |" v! ?+ ]3 Q mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
% h# {. }' c |3 m9 Q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );7 J( c% L; i: Q& X4 W/ U9 E6 S
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
h5 b+ n5 Y2 ` while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
5 [* _* ]1 y1 [( e* c' @
8 l7 Z9 c8 L! e; t mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
% S. `2 B1 i- b) z8 ` while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
$ j% v) E3 m: L3 }% U mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 9 Q' K, q7 _% r: N
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
6 q& C0 m0 W4 r0 l; u, c, j1 N
9 ? H" L& y/ y& C9 P9 L0 P CSR = 0x0000;9 v( F# b4 w2 p
INTC_INTMUX1 = 0x3d;: q; X6 `! p; b
ISTP = (unsigned int)vectors;) i" J/ C9 P; k' f' `
ICR = 0xFFF0; ' g$ r; F$ `# m/ V
IER |= 0x12; + U) ?* l0 q* g* M
CSR |= 0x01; 3 X& ~+ w) q% n2 S& L( R
) H7 ]( e7 N$ e/ r1 m
: Z1 ^! N& i1 k
3 a+ X6 ]2 S |还有就是两个输入输出函数: U" r3 y, z% h8 G( |: {' P
void output_sample(Int32 out_data)% y8 S2 [4 W0 U$ v3 }% I
{/ b# D" @$ u& n& h$ ]
AIC31_data.uint = out_data;
: @$ U- \, S3 Q( Z" |! Y6 Y# t MCASP1_XBUF5_32BIT = AIC31_data.uint;
. j* r1 v( {2 _6 H}
9 {3 g0 \0 @* [% v2 W( L
) n) k6 ?* n% K: B" Z a! oInt32 input_sample(void)
- b. f' M* s4 ]! `{
5 O: n. T8 ?$ Y" |9 K) @ AIC31_data.uint = MCASP1_RBUF0_32BIT;& x' }! u& d) \3 ?
return (AIC31_data.uint);
2 x0 ^8 S! F# c) o1 w7 ]}
0 y: t% |2 \( a* O4 U, C. f# o( m0 L |2 C& I9 @
|
|