|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
: |) ~7 k# X9 \4 Z qmain文件:& p# T, b$ ^5 Q6 ?6 x
interrupt void interrupt4(void)
/ Q3 l- Z+ |- l6 y S: Q{
8 T9 h, ~; \1 Q4 H2 V' \3 W" g. u5 ~5 r Uint32 sample;
6 `, S- s" f( l1 m; C% b' w! M7 M3 Y
sample = input_sample(); // read L + R samples from ADC
" w1 ]4 p) A- \; D5 O! w output_sample(sample); // write L + R samples to DAC
0 _1 H& }! ]8 V0 J/ ?. I6 g$ f return;
, z3 u, i0 g) u1 a- X0 _" J}
) x7 T$ _; l2 `2 o% L$ S
# c$ r0 i8 U' ? |int main( void )4 n l, [; L0 @
{
) x! d" f/ o% R: l# r1 y. O6 t; Y5 z( E$ I
/* Initialize BSL */) p: g1 W8 {4 R; E
EVMC6747_init( );
7 i3 _7 C$ h( O! M/ w: y6 r% ?- W /* Call evmc6747_intr function */) c, N- K* F4 m0 O
aic3106_init( );+ ~& I- h* N0 l7 \* l% `0 W8 l
while(1);) K2 J/ X* K2 @; Y$ s' X
}
* H1 v$ t9 c5 P: D I$ Y5 s
0 E9 R+ b) e, F& C
) `+ S% ] A! j% x! ~0 x# raic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题. g& Z" q+ e& e: j- Z
/* Initialize MCASP1 */
! Z4 a* F e: b4 c5 X mcasp = &MCASP_MODULE_1;
) U- O3 ~8 N9 z2 q& ` mcasp->regs->GBLCTL = 0; // Reset
. e' p6 i8 l& K$ h7 N/ G2 j2 J mcasp->regs->RGBLCTL = 0; // Reset RX
; G: ] Q1 A4 [1 D# d3 k# M mcasp->regs->XGBLCTL = 0; // Reset TX/ B& v4 Q/ }5 \" m4 Q6 F! i
mcasp->regs->PWRDEMU = 1; // Free-running
" z$ T5 ^* Q& j' q9 i // configure McASP0 receive registers
+ p6 C! Q8 j4 x* j$ w mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used8 O) I! }% c. x" H. B
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
# H% M) Y' i- t* @+ V0 _0 A3 X mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
+ v, [3 e% x! s4 w9 s9 y! B; y0 ` mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side): n9 U9 m5 ^6 ?4 ~8 R5 }
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)% C% x/ y) f' Q
mcasp->regs->RTDM = 0x00000003; // Slots 0,1, V ]' n" C0 N( S1 }
mcasp->regs->RINTCTL = 0x00000000; // Not used! V. y0 O" ]- f; v$ {
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 H' d+ ~- ^* J Q. O- Q
% |" s+ G2 ]- d mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used: i% @: F8 Q/ |! `2 }" n2 }9 s
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% V* Y* o3 m: K3 U+ z mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word G- f+ R# D3 w' Z2 j" p' Q$ ]
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16" d6 o; F7 ~/ } A7 x' @
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
. W% v4 r; m1 P' o mcasp->regs->XTDM = 0x00000003; // Slots 0,1) p. Q3 l" k u8 ~' Q/ r
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit3 }) r- L5 g! ~# R/ i
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
& B+ x- C- A1 n+ p$ a! j6 j7 o2 V# a6 f8 j c$ P' y0 H0 J% s4 E
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN- a2 ^! I( P( W* p7 Z# h: `
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT1 C1 ]+ w2 V* B9 Z8 }; k4 e
mcasp->regs->PFUNC = 0; // All MCASPs/ o( \4 Y+ J5 {) ~- t2 f) y
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
& j" ]- J) N6 ~6 x: I- R# |4 p3 N! u* X
mcasp->regs->DITCTL = 0x00000000; // Not used* M2 \. I$ o: T+ e- @! Q2 n
mcasp->regs->DLBCTL = 0x00000000; // Not used
( v8 x u6 C$ o8 Y& I" L0 x mcasp->regs->AMUTE = 0x00000000; // Not used$ X/ u. r, {' \+ ^9 Y
' }# P; D+ {1 O9 g2 W- I! s
/* Starting sections of the McASP*/
8 ^7 j4 v5 n# A mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
3 y M1 p/ D! N | while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
- ]8 q9 N' L$ c, R9 l v1 n! Y mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ; X3 t8 V5 }; N8 I6 y7 g+ M
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );% k& r1 o" O. I8 u
0 F; U: X# P7 m6 [: O
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 3 t# v) z; d: k& i9 i3 \7 S% O/ U
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
" H$ p3 c! v( _, }7 l* s6 t1 S mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 5 ]: r* D: f' i
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );8 {+ S/ i' q" t h; w; ^
6 r. R4 @" C5 c/ c2 e% T
mcasp->regs->XSTAT = 0x0000ffff; " x' n# b) N& E, D1 ^: W
mcasp->regs->RSTAT = 0x0000ffff;
$ m" K& x. {7 e+ C- j% Q: o5 ]! Q+ @; W" Q" E3 D7 J
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;. C0 f( t5 G& @" e
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
" b& T6 u7 n& G& } d. W mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; , v* t$ L4 A9 z3 B
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );6 Z2 U8 ~2 e% N! c3 j+ K( |
9 H/ R8 j; _6 _0 ]( w0 r3 ?
/* Write a 0, so that no underrun occurs after releasing the state machine */8 e4 s2 E$ G) {2 q: c7 x/ K
mcasp->regs->XBUF5 = 0;
8 j; v3 ]1 W8 k" t7 O mcasp->regs->RBUF0 = 0;: Y, W1 @4 x; F; L) e
, q3 e5 t, B! f
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
7 J5 h- l0 H. m5 i8 n while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
4 Q3 L* ^/ x, j3 g# c a; n( v4 \( } mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; , H0 b! i+ D2 r- L
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
2 q0 _, o9 i9 }" j9 u) j- U" L! M& X9 F9 d2 l4 L
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
, A! L! D3 p3 H2 \- @0 f while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );9 V6 [! Q0 {3 _9 @9 [
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 8 L$ v0 ?, t, K2 q v( C* X% z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );+ l! E Z) g; E+ _4 K; [, _
8 O! ^/ i0 Y l9 u CSR = 0x0000;
. Z; `! ~1 [7 o- n- _ INTC_INTMUX1 = 0x3d;
^. k1 I1 v# \/ c W ISTP = (unsigned int)vectors;
: S* N) ~ d* z8 h8 {0 g& J ICR = 0xFFF0;
# z& {; I6 X2 b$ C; G4 c IER |= 0x12; % D6 Y, H+ y" s% g7 g; M5 [
CSR |= 0x01;
3 h' Z: W2 K4 p2 V6 W
" {7 N6 w' _) u$ U: o
* F5 y& E3 k0 s! R
) s/ W6 j. n3 M h7 e还有就是两个输入输出函数:
- T7 j/ r { Wvoid output_sample(Int32 out_data)8 q; L( g+ I- z" T% }2 B* i: {4 p
{
' H) o3 ^" F# D* r9 J1 J AIC31_data.uint = out_data;
: M) ]3 M% ]0 P MCASP1_XBUF5_32BIT = AIC31_data.uint;
' B* ?3 _8 k/ V# C5 y9 X& e7 h" P% h}
% ?" l1 [/ B @3 O, J/ X1 S
* V0 M3 N6 F6 U% kInt32 input_sample(void)1 C9 d/ {. h7 k7 x' u- m
{
4 w) y8 U# c7 z# g AIC31_data.uint = MCASP1_RBUF0_32BIT;
/ ?/ j/ b7 D/ \& |/ | {( ^. [ return (AIC31_data.uint);
# L. z; [0 C- q, O& r}
; M- }' U. E8 K1 Y% z- g- q9 Y5 D
. Z1 C( J6 S- Z! m" M8 u |
|