|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
. S2 z9 M/ [* k8 Y7 K; kmain文件:
3 b- M5 d, r* Y; B; F- {interrupt void interrupt4(void)
. j# q: c7 m, C{! d; ~8 y. W) v5 Q: Z
Uint32 sample;. G+ x8 m) O+ `
6 X5 g9 f0 z# ^" ]
sample = input_sample(); // read L + R samples from ADC$ j& j) m/ c7 x$ I1 Z V
output_sample(sample); // write L + R samples to DAC
" C+ _( v& E0 r3 ~: w9 @ return;# W) ]0 H6 f$ }& z
}
* e- h9 t8 U2 v& l5 M- y* r" Y
9 |' [: q/ _" uint main( void )
3 [( G9 |. [5 \5 t4 l g) |{! V1 J) |, x8 B
3 }* k, Z- h; }3 K. ~
/* Initialize BSL */% l1 V+ m: ]* w
EVMC6747_init( );6 f6 \+ E' l! E0 I6 R( R5 e: U
/* Call evmc6747_intr function */3 ~0 {: L' B( Q
aic3106_init( );
8 Z& ?; C: ^4 ]* V( _" a9 O3 K while(1);
: E! _) |, @5 U! u \1 B* e1 Q: u* C}5 v6 K0 m9 o* i) i2 X' \0 H* c. y
# L' ~; ]8 z! L. S4 ]5 d6 m# y b0 ~' g& h' E* E
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题/ V4 n+ G( g, _( b
/* Initialize MCASP1 */
9 ~. m! C- I8 V mcasp = &MCASP_MODULE_1;
2 Y; K! v6 s- ?, n6 ?1 }6 e mcasp->regs->GBLCTL = 0; // Reset
+ T5 c+ ~+ [$ J mcasp->regs->RGBLCTL = 0; // Reset RX
9 N( X+ l$ G! e* u% e& o mcasp->regs->XGBLCTL = 0; // Reset TX
5 C5 U! B$ g! Z7 ~ q mcasp->regs->PWRDEMU = 1; // Free-running
; J7 L+ s2 H' Y. C5 M6 T1 _ // configure McASP0 receive registers
8 t% _1 B+ D6 o- C mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used$ F f( D. W- d: \7 N9 d
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
, J4 x/ u8 k- M; F: d9 k+ L mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
4 o* Q: c4 p2 ?9 Y3 v3 `4 t mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)+ o$ J5 f% b2 C4 } {# N
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
; n; b9 m% z9 A. [0 a) w8 [5 U mcasp->regs->RTDM = 0x00000003; // Slots 0,1
) i& t% K, d/ R mcasp->regs->RINTCTL = 0x00000000; // Not used
) e' g3 v) p! M6 N9 Q2 X6 r mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256% U8 q# Q1 d3 g0 S
0 q$ B! T3 _3 T0 z2 M
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
5 o+ a7 y2 Z4 Y# A! S mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus: G6 V, q! ?; B/ Q$ B$ r
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word, r+ L D/ G0 D
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16/ Z8 f" R3 s. r8 I! m7 m& e- x
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK/ m8 m5 S1 K; b9 B2 b3 Z" l4 Q
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
3 ^ h, F, S, U5 P mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit% A" k. x. x/ V* h
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256: S/ t5 ^+ c( O0 S7 g9 g' p
" N5 I/ x1 N7 y6 G! e, T% `
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
+ }) q: H( i9 V, R& Q. i+ @ mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT( t) s4 W# ~" V0 k7 ~/ X
mcasp->regs->PFUNC = 0; // All MCASPs5 `# R& I; ~( C, ?- \
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
/ q: N: L9 @ j! T1 l& \
" S# [; i2 h( W- v b mcasp->regs->DITCTL = 0x00000000; // Not used8 J: J+ a/ B. v# @: n
mcasp->regs->DLBCTL = 0x00000000; // Not used
7 s! [; l& c/ N5 Z mcasp->regs->AMUTE = 0x00000000; // Not used- h2 r5 _- M. M
) D0 G. Q5 E! S/* Starting sections of the McASP*/$ o) c; [* y; g$ `/ w0 q( X
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
* H; q' F( P# h* @ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); " Q; k4 Z# S# r$ a( {: v5 {$ z" O
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 8 @1 y; s; `& L$ u, A; |6 K5 i
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
: @; e+ E6 }+ A ~: G4 m! K, f- L/ H6 D! X
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
# ]3 y. {( S/ O; M& r+ s9 a while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );5 U* l2 L8 p0 O' W4 } P) S4 e
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 7 J& O0 I, A M/ Q, R
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );5 q( h* F$ ^& P9 k$ y
1 P3 D$ D3 e5 C1 c: Y5 x
mcasp->regs->XSTAT = 0x0000ffff;
2 Y- O: z9 s" }0 }/ \9 M mcasp->regs->RSTAT = 0x0000ffff;
1 @6 R4 j. T3 v* u( O& W' \8 x% G3 K# _6 j, I! d* [ e8 [
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
; j" O1 s1 ?3 A# U8 w6 k1 z5 Q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
6 ~6 c" I" ~3 S- W: A4 q6 z mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; + v( Y; w: r; }" w. O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );4 X$ B% Z. L( h- B7 k' h
1 ?& D, B- E; E4 I e, A* s3 v
/* Write a 0, so that no underrun occurs after releasing the state machine */
( F$ m ^6 f) ~; d) ~& `: ?) Z% s mcasp->regs->XBUF5 = 0;5 o7 }6 }2 w5 S$ I
mcasp->regs->RBUF0 = 0;- x0 R# h; Z3 O
; ?3 b1 T9 U% J mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ( G* L3 b" `/ O- a7 L" z) x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );7 V/ U! d4 u9 B8 L8 Q
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
) Y; z0 y& F; H5 ?' w% ~ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );* Y/ L7 E) }1 @2 e# J) G
: i7 `! r! M# O/ f9 } mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; + i/ C$ N. N0 e+ c. A+ f9 n
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
' s$ f5 ~3 l: _ K* H mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
" x9 B, Z e0 ^ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );* N" k0 I3 m( C/ }$ C- E% W& B
3 C# c. n, C# ^: U
CSR = 0x0000;. c8 L S4 W: @% \6 p8 q+ x
INTC_INTMUX1 = 0x3d;( b2 v3 S2 V! o, k( z3 f
ISTP = (unsigned int)vectors;2 e j: @( a1 a9 W5 L. n
ICR = 0xFFF0;
2 [" C- f$ }/ c' y2 T3 O9 I p IER |= 0x12;
8 s+ M% q: [0 u) q CSR |= 0x01; ( P# i* x t9 v7 P/ o5 R
4 X" \- ?7 ^$ `/ \$ | i. Q% O+ j# k" E9 z8 ^1 f
& u/ l+ t( T6 k# d' k/ Z
还有就是两个输入输出函数:
" R/ i! D7 w: K3 c, ?7 Q$ r: mvoid output_sample(Int32 out_data)3 Z5 A" N& t- E3 Z ~
{' R O4 P# M) t+ { \$ |; X9 o5 Z
AIC31_data.uint = out_data; 3 E( x9 n) B" ` o
MCASP1_XBUF5_32BIT = AIC31_data.uint;# Z& h. B; _0 Y' D
}
& l8 S% v9 ?/ E0 A0 h' A+ E7 S# a* F6 L5 g/ l, a9 d8 c
Int32 input_sample(void)
_* F" r9 O& b3 k$ H{
% P2 L d* w7 t' L, ^; B7 ^ AIC31_data.uint = MCASP1_RBUF0_32BIT;) f3 O9 m! h1 r0 B
return (AIC31_data.uint);
% E4 k$ }" n4 \' t, c$ W) Z} y9 A0 E/ l8 c5 K
- a/ s* ^. o" r4 U. V x |
|