|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
$ F) q9 \/ I; ]. s9 n, Omain文件:
" w, R( U* C# \0 O( r3 d7 kinterrupt void interrupt4(void)
4 @* H- h6 [( P( n& \! o" c% \{2 b" o& C& \, O- ?5 j6 P; _1 E
Uint32 sample;' t% L6 W% @% r8 W
6 f# f* y8 ~" w+ @; s# k sample = input_sample(); // read L + R samples from ADC
2 W! p4 j: H* `& L output_sample(sample); // write L + R samples to DAC [% H6 }6 V& \% N- }( o& j: R
return;0 w9 _; s9 h% D& W" r! c; O
}
4 Y Q S: q0 @$ S
, s& N8 n& G$ q5 P: \int main( void )
! W. J; b# U G{2 _5 t& L* S1 s+ U$ b
& {5 [" T7 F1 L: j5 t2 B /* Initialize BSL */- l6 a' T/ A" o" \* W
EVMC6747_init( );
. C- R% _- D1 z3 d% r0 v( S /* Call evmc6747_intr function */7 {" s, E9 H+ u4 y4 p
aic3106_init( );
9 r7 |4 E3 |# O; y4 p8 M( N while(1);0 \$ X& [# H9 A' K! E
}: h& \6 @8 w! S) f
6 r+ Y8 I9 c4 \3 A6 p- y6 E
" t7 y! U. ]7 waic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
1 v5 B% \1 Z) ~; ^& I/* Initialize MCASP1 */
" D2 j h. c( ?! Y P$ z mcasp = &MCASP_MODULE_1;
" Q' d k: n6 i mcasp->regs->GBLCTL = 0; // Reset4 V9 D0 u3 o3 \. v7 y
mcasp->regs->RGBLCTL = 0; // Reset RX
: a* i; q* j$ c2 U* _, K2 { mcasp->regs->XGBLCTL = 0; // Reset TX
2 z$ R* I. q- q mcasp->regs->PWRDEMU = 1; // Free-running
! f6 ]: F% Q6 I // configure McASP0 receive registers+ ?2 A2 \, P% B% k/ P3 q9 r( K
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used* ~/ n& h, z( _; }9 i- a
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% G, W3 P* R7 M Z* s7 ^ mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word v. ?' D& L$ g' ^
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
& L; T) S; ~0 k- d mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)- U+ X2 j8 [, C6 g) q9 D+ Z( Y n$ E
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
N4 ?9 Y9 l* P( i' M4 | mcasp->regs->RINTCTL = 0x00000000; // Not used5 V/ Y0 y# M; z# P$ u" G
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 N5 A' _( Y( y# W8 Z; Q: Q4 g w% U6 r+ G
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used, q& U' g1 P$ G5 c% f, K" K! b
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus$ A, y Q# U0 |( Z9 m
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
% q+ d. k% f& D( R0 i mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-160 h3 O, ~# p6 ? R6 m1 g! ~6 j( I
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
# P+ v4 J: F; Z mcasp->regs->XTDM = 0x00000003; // Slots 0,1
5 z5 ^- f1 \7 W( @3 z+ | mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
- U7 U9 n# R$ F1 H3 {* \ mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 w. I3 w& m: Y7 _% d! y/ N) R& n' o! ?& j. Z# m3 `
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
2 r; |0 ]. b3 J- A( z1 S( P mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
& p8 h. ~( `; b; e mcasp->regs->PFUNC = 0; // All MCASPs/ |. A5 ]% |. m
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
8 \+ [) ^- s' a5 h* F
7 i+ G0 Q; B5 T$ d mcasp->regs->DITCTL = 0x00000000; // Not used
* G4 g2 {: U: Z: o9 x mcasp->regs->DLBCTL = 0x00000000; // Not used0 F8 E C' B; z A0 m3 K0 e
mcasp->regs->AMUTE = 0x00000000; // Not used
' z8 \' |! Q: i0 s) G" u: M7 W, ?% X9 W( G' b! l( `
/* Starting sections of the McASP*/
2 Q. i* T$ j7 D$ D2 z# ~ mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ( l& I+ U6 }' a- d' k
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 5 R8 l, ^$ ?. J q, B1 ~
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; $ c0 x% l5 h9 p+ v
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );9 z! N6 j6 S) o: P" n M
( n4 I, Q# ]* K8 m& N
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
: }( V7 B+ e* a- w3 c: |$ s3 ^ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );* O5 } J+ v" ~
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ( h* _8 {" v3 @. y6 U, z4 n0 a' p* ?. V
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
, P8 E; p) d" M& y3 ^8 @1 N: S( w6 @' o- a* {* X; R7 f( k8 v$ k9 _
mcasp->regs->XSTAT = 0x0000ffff; " V0 }* B, R& U* Q
mcasp->regs->RSTAT = 0x0000ffff; i X4 ~5 X: D5 H5 t/ s
# l$ h2 Q! b( h0 o mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
9 Y: L; H% `* ?0 e9 f8 H while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );4 ]8 k2 H) m& r- B
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; % j( E( }/ e3 c; G6 q5 ]) J( r
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
) A' K! x2 L* J' @- a6 R2 c+ m8 L" e1 X' V% ~; L3 Y8 ^/ j
/* Write a 0, so that no underrun occurs after releasing the state machine */9 I$ Y- A2 R$ j. _2 z
mcasp->regs->XBUF5 = 0;+ ?, a3 } V! A; E
mcasp->regs->RBUF0 = 0;
8 M6 L) u3 h v7 S' M0 O E+ U2 ^7 ]) ^& A& h, E; y8 C
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
2 J0 ~# ]6 G9 ?: P, W8 V q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
" W! g7 K' a6 l0 C- ^! m mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ! k/ P2 H% ]& I5 `% L/ ~* e
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );; W& x2 `# `! ]9 O0 D; U/ `7 l) z
, U& j6 g1 G s( h) t& O7 J3 b
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
) Q$ s9 x& L* Y7 D while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
# g: ~. M( F& b. f& y. E mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ! ?# ~& D7 T2 n
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );# o4 g( A* I. z7 p7 N
' Y6 b V# p4 S: l9 w( V8 @, Y CSR = 0x0000;
" e. k( [ i9 m; \; k. { | INTC_INTMUX1 = 0x3d;6 z, P" W$ G& j, n, B
ISTP = (unsigned int)vectors;% i8 T$ R7 x j& X
ICR = 0xFFF0; 0 ~* U9 j8 K8 \! _. B
IER |= 0x12;
+ J4 l8 p6 V1 N3 { CSR |= 0x01; 6 a# v$ |4 x. \# U9 m
, g# ^9 U1 J" y$ ?
+ M. B2 i! G% O: K
6 _4 {+ i, b; `7 V
还有就是两个输入输出函数:9 e! C Q# S: ]( j9 J1 W
void output_sample(Int32 out_data)
b; E( i! ?* S' P+ a9 T8 R1 M{$ |" A# |. `& C0 B
AIC31_data.uint = out_data;
* j1 \: |6 p* g% d. l/ F MCASP1_XBUF5_32BIT = AIC31_data.uint;
, f# e" l, B. J. m6 G/ d}, N$ V2 G( E9 K! F5 F
! E, l H7 O8 y* g; ^, M
Int32 input_sample(void)
b' u, B) p! V8 X. C" a# l' L" V{
, T3 z( h* ?9 j# v AIC31_data.uint = MCASP1_RBUF0_32BIT;) @( T; x, W0 m4 D
return (AIC31_data.uint);
, Z& X8 {; x- `7 t9 ~7 q} {9 a ~( n) y- ?
3 ]- F* e; Y! W+ g |
|