嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
[ c1 A5 s+ O* p" u8 w' A
main文件:
* K) C( c) q& [; f$ {0 n& P
interrupt void interrupt4(void)
" o! U) W! q! R0 i1 x7 U! x9 U
{
9 R1 v/ e Q2 F) W7 ]9 g% E) d
Uint32 sample;
7 @3 N! b7 V# y0 |5 W! ]$ p1 |
* o( ?6 g% s( [
sample = input_sample(); // read L + R samples from ADC
8 d7 `* Y( R" F, J7 h) J
output_sample(sample); // write L + R samples to DAC
) P0 V& b9 t7 U+ t! u8 k; B
return;
0 q# D& H: B+ q
}
/ C' z$ q+ M' Z# z! _$ p) H
. \, e! _4 m0 ^% U' l" H3 A" t
int main( void )
p2 f2 k2 |: t
{
6 n9 D6 R1 W+ K
# X4 M' l. _- ~( B A6 B+ u1 y
/* Initialize BSL */
( @2 y7 q, g% a# S1 P
EVMC6747_init( );
5 ^6 J" Y' B; _4 @: L
/* Call evmc6747_intr function */
; C0 b9 Z0 m+ t- L/ J
aic3106_init( );
; S$ j. X( o+ Z2 I- r+ v
while(1);
' b6 d0 U6 T* _6 s3 _7 P: s% c
}
1 Y/ j7 h1 v! K# N) P0 A
+ j6 o0 M, R$ _
( v+ Q" @0 w" j7 E0 z
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
! e$ l7 P/ e# I. x& _
/* Initialize MCASP1 */
. x( G! b8 r* k6 Y1 W9 _
mcasp = &MCASP_MODULE_1;
% G9 p4 \( r$ P( @5 V
mcasp->regs->GBLCTL = 0; // Reset
! T! S) p) r/ o H$ [7 C. Q; q
mcasp->regs->RGBLCTL = 0; // Reset RX
4 X" g* Q! i! z! f% g
mcasp->regs->XGBLCTL = 0; // Reset TX
B$ j4 { f4 E$ @' g
mcasp->regs->PWRDEMU = 1; // Free-running
4 w" V+ c5 D/ h9 E1 V/ E7 f7 }
// configure McASP0 receive registers
/ b. D8 `5 S; K% ?. g( D$ f6 G2 t
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
5 l% }8 f) a; ~" W# k9 e
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
( j; F. ]3 p# Z7 W4 N# }
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
% h5 k+ b) M; l, R% V
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
# T& Q8 F: {0 ^8 r: |9 y
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
' A+ z |. P8 f t
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
7 F H) F1 G; x# ~8 E) a
mcasp->regs->RINTCTL = 0x00000000; // Not used
& D; q+ M2 N0 _3 t) {' t
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
( L5 U7 L) U# v6 R, O$ s6 ~; }' g
2 [- d+ Y" R2 v
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
g. d1 y5 T8 Y! H) c7 Q
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
+ X4 |+ O. d- [0 y7 t4 K
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
7 ~$ l5 D; }( G, M0 n* Z
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
& P# B( J2 t4 O. o
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
2 R* ]% H; ?. L* U+ i! |4 |1 }
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
1 ~3 J {, f* J. J8 X% f6 v/ o
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
% _! c& L# v4 J! Y
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. B3 N( I" [& U, i- V
1 w7 I3 [" a( x0 F! O5 G4 ?+ D4 {0 l
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
1 L- U9 @* [) R# S# ?) Z* c% E
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
2 H& X" j/ P8 p+ r0 H8 P; o
mcasp->regs->PFUNC = 0; // All MCASPs
8 R+ b5 t* p5 P- H0 o! o
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
" F/ u; I. O* {
: a2 t2 V; `: ~. l: _! @) J/ ]! B
mcasp->regs->DITCTL = 0x00000000; // Not used
+ y+ U P! c4 @* D
mcasp->regs->DLBCTL = 0x00000000; // Not used
( u0 }) P. @1 V. L' p3 C
mcasp->regs->AMUTE = 0x00000000; // Not used
1 w. ?0 ?5 v8 ?) [6 M
4 S4 X# [$ t5 Y
/* Starting sections of the McASP*/
7 r: c6 V) X$ [" R; `
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
1 I1 n4 w2 R- t
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
1 ?' w* w$ K; ]: a
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
# q, S. j( `" ]9 w4 \* a( g5 a
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
2 c G3 j/ w; Q% m+ @. s
% W& `- E1 B8 Z8 R
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
, o0 @! w, g$ [- W5 R$ F
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
4 Y% h- t1 z3 Q7 \% R6 w8 G9 e. {" ]
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
4 ` ~* [/ h. O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
9 E C, {+ O) E4 h# O
) |, G; m& D$ b) F
mcasp->regs->XSTAT = 0x0000ffff;
, L5 n; K2 ]8 E! j) B" B3 e P9 N) _
mcasp->regs->RSTAT = 0x0000ffff;
# j5 @: G( i8 v0 H; z% h; @8 \& d/ a! ~
4 h, D- a+ P) U2 n* o3 d0 `" A
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
1 h# \( w |* \1 o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
9 o$ D8 G0 C$ h" `
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
1 D( f# s4 Z% z7 i
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
6 E0 U- s+ e# p# G1 t6 q) x. Q& b% d9 D
5 U( m i, d/ x8 O( T- p$ u
/* Write a 0, so that no underrun occurs after releasing the state machine */
7 ?' g. S2 o6 H5 l
mcasp->regs->XBUF5 = 0;
% F2 S' B7 ~" U& o
mcasp->regs->RBUF0 = 0;
: r1 n- B# ]' x: E2 t
' g( C3 E" S4 J) E2 n( s
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
5 }% x& t& \6 p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
9 _% V# M5 O% h- f
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
; `8 D. q1 D. L( F1 y4 M7 q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
0 j% }+ V: X" b: H
. o; m% w4 `6 p6 q. Z8 H+ L
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
4 q) P# P8 O9 r4 U2 x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
4 r" c( r" k1 A$ o8 Z% N1 J
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
$ ~+ g! Y" P3 n6 N# I1 }3 d# J
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
! ?4 C7 D6 X. z' C7 f+ B
& U( i/ g. S- {1 ^' H8 ?& V1 |0 l
CSR = 0x0000;
+ G. W5 `# M! a5 }; }' h" ` A* b
INTC_INTMUX1 = 0x3d;
: R" n4 z( c( _3 e
ISTP = (unsigned int)vectors;
4 t' h, E( [" a% j5 E
ICR = 0xFFF0;
3 S& K* G: D8 _
IER |= 0x12;
) Y. E" _% \5 j* T- {$ k
CSR |= 0x01;
U! V l b( i, j; l! T
! [0 H' E! F0 P2 P
0 D% l% a# u5 w. Q
. k3 \1 P% @! c0 i. k
还有就是两个输入输出函数:
6 A! P: ~( P' q+ @& x% U
void output_sample(Int32 out_data)
9 ]( @) G/ ]: t5 X
{
. r0 \$ J+ z& d
AIC31_data.uint = out_data;
3 A6 _! h7 q5 H- {/ b% L4 L& Z
MCASP1_XBUF5_32BIT = AIC31_data.uint;
1 p- b( a/ M! n0 v; m
}
5 ^! }' z3 g, F5 d9 T9 f
N r; O# u+ p: G/ @
Int32 input_sample(void)
; c, A3 w$ ?7 [ {0 S
{
8 @8 N; m/ T+ ~, @/ D: S
AIC31_data.uint = MCASP1_RBUF0_32BIT;
. s8 y6 ^9 r, u) Q& R _' i8 c
return (AIC31_data.uint);
2 N! c* _8 t6 e1 c( S2 l% \
}
! u# ^- W3 N P1 M6 ]8 W! K
, }+ }8 K: G2 j) p3 M
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4