|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
+ _, q) t# Z8 v( ~2 Ymain文件:
! ~! y8 L. F/ z: Y: [interrupt void interrupt4(void)
* A3 M |, _* p{
2 n9 q8 {# ^$ M; o1 Z+ f6 P! [ Uint32 sample;, W x9 ^: U1 [5 _4 L/ Q
/ I# j& p% Q7 `. J! X sample = input_sample(); // read L + R samples from ADC' g& R! p$ }/ s- Z1 F2 `
output_sample(sample); // write L + R samples to DAC
! n0 N `$ Y& @1 G# B return;
$ ^, d% F' u) A9 @& P}
( B' T0 d* U' }) u' Z. A& C* o" O* C3 o
int main( void ): C% G! ?- f0 j& }7 k
{
0 x, Q p: m/ r; P5 {% J2 T" {2 c" c; q7 d' f. S
/* Initialize BSL */
+ ^) v! T N, k8 n* i EVMC6747_init( );% H0 R& C U/ X% u
/* Call evmc6747_intr function */
o, \ W. f0 y( D1 g. u6 Z aic3106_init( );3 y1 I+ z! d' s8 _! `+ h- Z+ |; K
while(1);1 i+ \$ z$ F. N7 T" `! s9 \
}! F! K |+ @1 }# K/ D: |
" O! b( Y, ~) z" V1 n3 s. `# ]9 `7 g$ f& Q- Z
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
; c& P; J% K+ e: g/* Initialize MCASP1 */& j& _( o+ o% x/ T1 V: G6 C
mcasp = &MCASP_MODULE_1;
1 W+ f2 x6 X' s* x mcasp->regs->GBLCTL = 0; // Reset
6 [) X m3 w: `$ n) I9 j mcasp->regs->RGBLCTL = 0; // Reset RX
/ ^$ k2 ^, y1 y4 v mcasp->regs->XGBLCTL = 0; // Reset TX- ]# E4 u# R) |3 n% _- Q+ r+ \
mcasp->regs->PWRDEMU = 1; // Free-running
V/ B2 R: n' P! q' f0 p // configure McASP0 receive registers# d6 }6 c5 A7 {+ _
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
* P5 [. I) F( t# v# z' B ?5 [ mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus! o5 y; P' c `5 |& x4 i
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word2 c2 ?6 u9 l, ^* z Q1 l8 S m
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
4 ?7 k: L. Z& J& B! Q" }- A1 o# L* _ mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
5 r6 C+ a8 h+ L8 B- o mcasp->regs->RTDM = 0x00000003; // Slots 0,1
, s; W" `7 ~6 ~/ Y' g4 w" F6 \( w mcasp->regs->RINTCTL = 0x00000000; // Not used
7 R+ j( @" t, C mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256$ k- g1 w& J% n8 _: S
. ~2 ?$ c2 ^4 x; R
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
. v6 {- B% v$ @2 K mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
+ I+ i9 y7 f5 f* d) p0 N, H mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
/ |7 y7 m8 R# Q5 T% o mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
, w& M# }6 w x% w3 b: V" ? mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK) Q! T% q0 C8 p. }2 i* R$ U
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
) k& x+ P/ u2 I7 L6 \' J% ~ q mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
3 ^ }6 i# Q- G) p( Y3 V) q8 Z2 G mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 a- j; r1 ?2 C3 _0 ^
( _4 G! t% {1 i5 v5 i% ~ mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
! Q6 h2 C) M8 k. [7 O5 ^2 T mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT6 c% ]$ t/ t( N
mcasp->regs->PFUNC = 0; // All MCASPs# `0 u' I9 Z4 ~- ], b2 K; i
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
' x m& Q: m( s4 Y% N4 G! a' ?8 R) a" Y9 Y8 j
mcasp->regs->DITCTL = 0x00000000; // Not used" _% J6 h2 ~' R
mcasp->regs->DLBCTL = 0x00000000; // Not used( g* C; f) }+ M! g: l! v& N
mcasp->regs->AMUTE = 0x00000000; // Not used
4 G9 ]0 r1 Q4 E. h2 U- c' j
5 y, C, I1 Q* |/* Starting sections of the McASP*/
Q4 z! u, M5 L2 x$ \ mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 6 I/ r: q) x4 q* E
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
2 B4 h5 H$ o) w* C4 ? mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
7 l. X* i* {0 c while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );$ s2 m0 ?9 T b* h
- g' _8 x; n A y mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; + H! z* Q$ C' O6 N' I
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );# g6 y. N6 b7 ]8 Y& g- W) ~# ^
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; & _3 @) B1 N8 K5 [
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
4 ^. B& f. P2 z
1 E: ?& y3 g! N0 k mcasp->regs->XSTAT = 0x0000ffff;
9 q, p& j) d( y4 i( m0 Y mcasp->regs->RSTAT = 0x0000ffff; N: _/ R8 S8 I* T9 a3 m
2 g! X( {. y' S+ J$ t
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
& N7 I0 b$ W9 H: Y6 w2 r) c while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
; ^+ Z) `# m, G \ mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
0 B% R" w/ z4 B' i, T% m' }- ?9 ?1 L while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
: t1 Y3 G) ]; \4 E$ m6 {$ d! Z4 l- W3 Z2 J3 C1 k
/* Write a 0, so that no underrun occurs after releasing the state machine */
; ?. l) w+ D- ^" D$ | mcasp->regs->XBUF5 = 0;7 Q, e* @5 F/ P7 d" z/ Q3 i
mcasp->regs->RBUF0 = 0;
6 r, }: `0 m* E b' K/ d. z/ B& F3 ~" b( S- u M C$ {
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; / f9 M% c# y7 R1 n" Y* o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );1 o+ a# P# ?. J2 m7 t
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
0 m, ~" o a& E* H" f while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );! T# }; w4 t8 s1 n" s
. s. V$ [% p9 P# C- \. j+ e4 \ mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
$ Q2 A. d3 `$ {- z while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
8 T/ a5 t5 z2 O! P mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
% W& ?$ t( U3 O while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );9 P% l+ Y# t3 f' ~
' V" @ C* |! V- a/ Q* K) q! b5 ~+ E, n# F
CSR = 0x0000;: i1 q8 C. [5 R& b2 }
INTC_INTMUX1 = 0x3d;
; U0 F9 R! l' J( a3 ?/ t ISTP = (unsigned int)vectors; W& V0 C/ X% a7 u. z$ N0 T
ICR = 0xFFF0; 6 s( L; }& g0 e' A! Z! c
IER |= 0x12; $ X4 W3 X, B8 U: ]& m. b
CSR |= 0x01; ! r! M8 M; J* H5 H
# M i+ M/ W$ q0 g8 Q
0 M0 e8 T. }# l5 m' R
1 i) r1 f6 s* n8 S还有就是两个输入输出函数:
; P* q4 x8 t- E E0 svoid output_sample(Int32 out_data). m- z z- \9 F& B) V6 _7 }# j
{6 J; c1 X, S& Y' E
AIC31_data.uint = out_data; 7 c( V) d$ M. [2 p6 L' c1 }1 O8 ~
MCASP1_XBUF5_32BIT = AIC31_data.uint;
# f( B. O; I2 z}
/ c+ S. O8 J: C# ~4 ^5 O0 c; e7 ?& \5 P; ^) X5 x/ ^3 R9 O+ J
Int32 input_sample(void)
8 s' H0 C3 c6 D0 i1 r) ~9 g{
! l7 D: k$ S+ r2 o; |% D AIC31_data.uint = MCASP1_RBUF0_32BIT;
6 t1 q! i p' j return (AIC31_data.uint);
/ |: i/ Q o1 W: W( M}
/ K: p( l: {! a3 B5 ~; Y3 @
! a- t; Y2 T/ s9 n) r _7 S" e) A |
|