|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:! f5 `; ] i% _/ S( W; ^- `% _* {
main文件:
* J! _: C9 K6 W6 `, Ointerrupt void interrupt4(void)
5 G# S( ^, g( B- M0 o{7 M, ]6 ~/ i- k' z! [7 c
Uint32 sample;
' D X. I0 m9 n- P
: x8 P; U4 \* X0 V& h7 G' Y4 \ sample = input_sample(); // read L + R samples from ADC/ `( T1 m+ f8 h7 \' M
output_sample(sample); // write L + R samples to DAC 2 t1 @# L2 ~9 o# F
return;
% p. N& o0 Y0 ]& R+ h$ t}
$ S9 O( i, A5 m9 T3 e
2 l/ |$ `/ E3 {$ ^1 iint main( void )2 O' u5 |* n, s6 Z1 T
{
: S+ S- E7 s4 m1 ~
5 d4 v# o7 }6 d /* Initialize BSL */
! [9 @3 N- F7 Z1 j( d$ y EVMC6747_init( );- W8 C5 K1 ?" H
/* Call evmc6747_intr function */
3 U& F' l: X" C9 o9 m aic3106_init( );/ r& u% C( L0 v- l
while(1);
- g1 {2 F& m- ~0 m}8 m$ h2 L1 r9 C
N- s& M3 F2 ?
1 r& c8 ^3 J/ Q) ]aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题7 P- t+ O9 |; c& X. [4 c
/* Initialize MCASP1 */- F5 S2 J! h# \( t
mcasp = &MCASP_MODULE_1;4 K9 G. p: `/ X' [
mcasp->regs->GBLCTL = 0; // Reset
+ ?8 c1 j! P, B4 b; i mcasp->regs->RGBLCTL = 0; // Reset RX
: q( P" c: W+ g. F3 f5 r2 B mcasp->regs->XGBLCTL = 0; // Reset TX- L" D. Y$ A3 q1 W) I `4 I& Y
mcasp->regs->PWRDEMU = 1; // Free-running
1 x) {* `' G3 X6 i5 d // configure McASP0 receive registers
) t( h9 v% U4 {6 G7 L mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used1 B# G1 d, g3 P- _
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: C- ^& n4 |! E# _% H# m# L: _- X mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
+ G% e1 S2 Z5 a6 i5 [! t# ? mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
( r1 m3 X8 W1 r* V% p) V: d mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)! B/ o) Z; b3 U6 e2 q5 m7 j
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
) M6 ]8 [) s% o5 w; Q4 p9 e mcasp->regs->RINTCTL = 0x00000000; // Not used O9 D1 y1 P+ r' o) @
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256+ ?4 C4 H7 n' l7 }2 J
3 x+ S C0 `; u" `7 K2 ?
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used: n+ w# R. U. \/ @
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
) {; s6 r$ s$ i3 E6 S mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word! P: ~* x. ?, Z0 B1 D' M- P
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-163 M0 [, S* b" T; W" d
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK& O& v" \3 n# @+ W1 c
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
+ p- P- V) `+ I9 G" l mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
- p0 \9 G/ ]& }6 c mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256* Q8 b* M- ]8 t/ g% q7 W. V G
( M( ]5 Y- B! J* y$ S mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
2 q0 v9 O3 s* ]* U; G" e mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
/ t- x6 n! w: m2 k mcasp->regs->PFUNC = 0; // All MCASPs4 \6 ?$ _, t! W3 j
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
& o5 h8 [: ]* X- {) v5 R% _) V- Y) C: T
mcasp->regs->DITCTL = 0x00000000; // Not used. B9 \3 h9 K6 i+ i* h: k4 m. H% v
mcasp->regs->DLBCTL = 0x00000000; // Not used
% L0 X! w& M$ `9 }- o9 C mcasp->regs->AMUTE = 0x00000000; // Not used& u0 X* y7 M; I0 a
, S- _, j" V2 f0 P; t/* Starting sections of the McASP*/
3 R- G! y* m) k. ~, R; J" F mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ! C* |) P8 s* S' _
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); ' X0 ^$ w+ G, o/ C8 a" `0 i S" b
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
& X- P- K8 X# N2 R) i while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );( j: r4 L. y( ~7 c# m9 O5 H. O
. M$ _; X% w2 p; e+ \( o
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
# N$ v* _* c8 E' s5 I while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );) v( B/ w1 h/ X5 }3 ]
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
- q g9 `: G0 B( e, } while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
( r0 h, o) G/ f7 ]7 M
! X$ q, O, Q2 B/ q" L4 S mcasp->regs->XSTAT = 0x0000ffff; i' Z+ D# F5 A% t8 c
mcasp->regs->RSTAT = 0x0000ffff;
( J2 s* f1 u6 _) i
8 D$ C7 e! k3 J/ g mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;9 m. @: K C! o! Z* t
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );5 y4 x. a8 U6 I, E& ]
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
g9 o; e5 G" {% s6 N while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );3 p& m' `$ [* Q5 O- h
^5 _; s! U2 I% N6 i/ F& K /* Write a 0, so that no underrun occurs after releasing the state machine */
7 q% W F# ^" C mcasp->regs->XBUF5 = 0;
, Z$ f5 l6 h5 @4 F. D* Z mcasp->regs->RBUF0 = 0;: w+ T9 M# } \& W4 ?
, x- g% r5 q$ L$ f
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
6 E) Q% }9 u. M1 K" |9 y: v while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
4 N" V$ p0 [' o) |3 n/ W7 N) c; Q7 Z mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
% ^ I( L' H0 z# z/ K( d9 ] while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );" H5 @1 ^+ G8 F1 n9 l
6 W# B0 a# {& _$ z# A. E( [! V
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
$ k; d$ q2 |3 ~( L0 q" W+ S6 p' n while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
5 D- X* y* ?- O$ Y mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
5 G* ^) x8 c6 ?7 |8 ~; Z while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );, P" ~, D! K3 _0 d4 p
8 Y2 j$ A9 S( {0 N) N9 F
CSR = 0x0000;
7 E3 V5 P: Y e# Y* H) w# N INTC_INTMUX1 = 0x3d;
; R. @8 q, ~" i ISTP = (unsigned int)vectors;
0 }( W/ G- Z8 @3 g ICR = 0xFFF0;
9 g' y) m; f* I/ j" ^6 a IER |= 0x12; - W8 y) o2 O7 M* O
CSR |= 0x01; . ~8 B# _! M/ E! b
# v, j& `6 ?: H" S# n0 }1 @# M3 ?3 r% s G1 y
& F7 ]) X r ?; D
还有就是两个输入输出函数:
+ A" ]5 Q o- V' u8 Yvoid output_sample(Int32 out_data)" S# o& m4 q2 F. `+ m+ T
{
8 Q: i0 T3 L' u' l AIC31_data.uint = out_data;
$ u7 T- b8 b5 {4 L MCASP1_XBUF5_32BIT = AIC31_data.uint;
4 A6 F: y. h! D}* ?( ~6 v* w9 i3 {6 P* e8 C
8 l3 f. N# J1 `$ d2 J6 [6 P. @Int32 input_sample(void)
7 p, v$ z2 m6 M- s{
, H' K9 i! l5 _% E, e AIC31_data.uint = MCASP1_RBUF0_32BIT;2 M* N3 W; c: H; v, F0 m
return (AIC31_data.uint);( Q2 r) m& c9 \8 s
}# y) E5 Z8 X7 {2 o% Q3 a
( L* q2 t8 l/ l# | h |
|