|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:9 l5 S: |' D4 d
main文件:
; M7 j ] I9 A, B+ X% zinterrupt void interrupt4(void)
9 g, _; G. P" ]8 A{
, u. J! I# n! }5 s. i' x Uint32 sample;" n O* }& t) P, o/ \6 u, ^
' ]7 [, K: b0 e2 [- r% ?$ }1 V' y! D sample = input_sample(); // read L + R samples from ADC
7 G* l, z8 b5 x6 \- O% a output_sample(sample); // write L + R samples to DAC
1 i- ^: L& c+ h& E% W$ n. X return;
! E! v( \) f5 Q, k}. }' k& p! _0 n) J6 w
" `- S. f" @7 G" ?! y
int main( void )
2 R" A) m W3 S/ ^{" M1 T' G. H/ _( G- w9 F7 s L
+ K$ F! ]0 _7 F5 j+ ^ /* Initialize BSL */8 P2 D( y' z# H7 D
EVMC6747_init( );
' i0 C) Z* k/ r% i, I' }, K0 g /* Call evmc6747_intr function */
& [6 F7 ]2 D k% D* E l aic3106_init( );
, ], M |% k& `, X1 A while(1);+ r, @3 h$ v. L! U' n/ u) [% K
}
9 s$ _, S7 P6 H) A
* z( a9 Q" \' l% z6 T- r7 E
! @* q! b8 L; _7 d/ aaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题7 ?* a% F; T* ~6 e/ `3 {
/* Initialize MCASP1 */
( d8 L x" I. w. C" S) T7 ~ mcasp = &MCASP_MODULE_1;
C6 @* J+ B) n q: r- B mcasp->regs->GBLCTL = 0; // Reset
6 }# v- j2 W/ x% q mcasp->regs->RGBLCTL = 0; // Reset RX: ?7 n, B% n/ o$ A. s( w3 r
mcasp->regs->XGBLCTL = 0; // Reset TX" F# C! U6 I: E7 F/ r8 ]
mcasp->regs->PWRDEMU = 1; // Free-running
' {. u5 V- V) }% E: U // configure McASP0 receive registers- y; v6 F( x* n
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
! {3 P, z% v- B1 O9 J& \ mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" w. Y: T3 b0 p9 W mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word3 h3 P) p; L' S8 ^4 J
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
) ^6 m; [1 G4 I$ K- o" ]' G& @* J mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)) J* j0 c: h) ?8 u/ H3 Y; k
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
8 J8 r, A# B& o8 l0 z mcasp->regs->RINTCTL = 0x00000000; // Not used5 j% l+ y5 x c, N0 X; q/ I
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# f' k6 i2 g) _$ K' _+ l: d% |5 J, L& Y- P
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used4 f! ]- K8 o) P7 `8 e
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus5 `4 q: r: y) ]9 v9 f
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
$ R- ^; r, ~6 |( i mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
* A9 z( ]6 D/ F& H8 x; d3 {0 [ mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK3 R( y6 ]; S3 C5 i
mcasp->regs->XTDM = 0x00000003; // Slots 0,15 d3 `+ w3 F) s- e" v
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit8 h' ]0 K# j4 h2 b( @& G
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
( A9 ?% T& t+ \5 [8 P% v$ t2 W
& j: Z/ i$ Y: y) B mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
# d3 Y" U9 M5 h3 A2 ^7 t+ q mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT+ e% U2 L( B8 p1 n. N. X
mcasp->regs->PFUNC = 0; // All MCASPs
9 @! y& h. s( I K9 n; i& w* q mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX14 o& G: H6 `5 ]( Z5 X; w: m
6 J+ p* F8 A4 E
mcasp->regs->DITCTL = 0x00000000; // Not used a: _# F9 e% w# f/ ]* e; N' P; G
mcasp->regs->DLBCTL = 0x00000000; // Not used
9 i: d7 G( o! D% Y( X mcasp->regs->AMUTE = 0x00000000; // Not used! h/ l0 A/ \1 A: E& i U
+ y+ H5 r# `: O- n
/* Starting sections of the McASP*/ e- S6 ^+ e( o) r
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
6 C( g1 i' H0 Y q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); " H" G4 v4 j: m# _5 B
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; # [4 @6 K6 N* C/ b, g) R. E
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );9 C- }: x, C+ R6 @7 i; o; i
6 I/ U- X% Z0 [3 Q' q0 ~. s- s" I
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
7 M3 l8 N' e" J1 s. K9 H( @; X* O$ e while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );( d$ i& g0 l0 |: L& F3 |
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; . r' p' U# d9 B( @8 Q/ ]+ N
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );' B0 X2 u; h) ~3 G! n
9 |0 f! W6 Z& O/ d
mcasp->regs->XSTAT = 0x0000ffff;
w4 K/ Y8 D* u( S {) L mcasp->regs->RSTAT = 0x0000ffff; 7 X% `" q5 A- q' P
; G: t1 }9 Q1 t1 R0 I/ |
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
) `- h& r- B5 X8 k' o$ A# M while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
* p- g! y$ r8 P, ^& R' _7 ^( X4 T mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; # h" A6 I. R- t
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );0 Q1 X1 L' G/ k0 Y% W1 t' N. j
5 D9 e. f2 P3 F/ l: ~( {
/* Write a 0, so that no underrun occurs after releasing the state machine */7 x4 n* }8 S6 w% w2 S5 i: f
mcasp->regs->XBUF5 = 0;8 {: g% Q) L. m [! E
mcasp->regs->RBUF0 = 0;, `2 S) k8 L" ~, ^
: U7 J) g: h7 W6 ]6 N6 @
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
: R9 @5 t, C0 |$ x: L6 t9 N2 L while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );3 W' H" g1 G4 L' f" P" ^+ \
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; : @$ a: n! ~' j8 \) {, |) J
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
2 |( q2 e' X) l% `, Q/ X- |8 l$ p, s0 O, K/ B" O1 Q, r7 J" J7 n% a
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; , L2 e4 j# Z" D C$ a2 k) c
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
3 D- X$ y( x1 n6 _& B mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
- L2 C4 x1 j7 e- W while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );) M% Y" G g! y
4 H, j( b2 _; Q C
CSR = 0x0000;
2 O. g. K' `5 x' S INTC_INTMUX1 = 0x3d;5 E! E9 {- i. E% O' y' v( f
ISTP = (unsigned int)vectors;
& v2 ^+ }7 n- |& z! J. } ICR = 0xFFF0; 4 n! X& f3 R2 ]
IER |= 0x12;
& ^5 B2 R5 Q( S CSR |= 0x01; 0 K; S$ t# S, A. P
) \6 g; V. w2 x0 V% ^
: r& v# A6 d+ R+ l) c3 u s4 Y* Q4 D
还有就是两个输入输出函数: o* ^: G4 @3 L3 f! r$ c' ]) |
void output_sample(Int32 out_data). m/ x- ~; T2 |" }: y' `) s8 f
{1 N. |2 ~. s) v; x( L
AIC31_data.uint = out_data; / S9 O$ t/ |1 Q( G$ m% R
MCASP1_XBUF5_32BIT = AIC31_data.uint;
3 L2 G. v8 ~0 k9 Q( a8 J}
m9 s0 |5 h7 G0 `& ^
u J" ~& d+ d2 _* K6 {( RInt32 input_sample(void); H/ P5 k0 M, Q m& k. c
{ 8 o6 P% G* p+ N; P3 D' q/ r
AIC31_data.uint = MCASP1_RBUF0_32BIT;+ {) |. ]( T7 H; ~
return (AIC31_data.uint);
$ r5 b% h) O* P) m}
9 ~9 o9 u" w: r
/ o( s) s( S( F1 m$ }: W; l4 ~ |
|