嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
0 x( z& p5 s1 S6 L, V2 s- \
main文件:
, ^3 J+ R$ G; x) B: c
interrupt void interrupt4(void)
3 R2 Q/ V6 x1 Y+ s5 {9 S6 a
{
. U6 M5 q8 l* j) U9 O |% F
Uint32 sample;
" ]. d2 p- X5 v- p% H# U8 ]; f
# M# v, t# @% p/ A
sample = input_sample(); // read L + R samples from ADC
0 B# B$ E! y- ?; T2 C% a
output_sample(sample); // write L + R samples to DAC
% Z* l" I! b" ^, K8 Y% ^
return;
% H4 S8 s- N7 `: H! r4 j
}
& B. {* H- G* P( b7 L0 |
# D) W% U/ J- x% |. s6 q. Q3 D/ G
int main( void )
) w$ h6 U8 X8 Q
{
) d2 P5 @9 H, A2 W: f
9 X. n% I1 U1 M
/* Initialize BSL */
* R } R' a3 Z l
EVMC6747_init( );
, W2 n5 ]! W( {# g; c
/* Call evmc6747_intr function */
( H' w7 ^) [2 y& e) o9 w2 u" e0 I
aic3106_init( );
8 H3 Y, c( o: h
while(1);
- N& ]+ c6 _! D% m; W7 e5 Z: O
}
2 ~* c( s% [) z: ~" v: U
' S% L6 _& J2 p! S
1 F: }+ n2 @+ Q1 u6 i! C
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
+ y8 Y, p" f K% F% T1 V `
/* Initialize MCASP1 */
* H: f& x! L- M+ u5 N+ t( K! F8 z
mcasp = &MCASP_MODULE_1;
' b9 d# W5 W; N( I
mcasp->regs->GBLCTL = 0; // Reset
4 z1 x: E& _+ q; Y, ^7 X5 s
mcasp->regs->RGBLCTL = 0; // Reset RX
% ~9 `# ]) W8 u0 Z
mcasp->regs->XGBLCTL = 0; // Reset TX
! i6 w/ `* G" @
mcasp->regs->PWRDEMU = 1; // Free-running
. a4 |: g9 n3 M
// configure McASP0 receive registers
( Q( Q% O' O3 l/ [( u, O- L* ]
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
4 ^9 V5 b* S% g
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 ^2 @5 A% x- O O- O& V
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
* V, v* h2 @5 k& u
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
7 P! N" g* q- |7 @' m6 ^# v8 E
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
/ U9 m& U* {6 Z& ` U/ O/ _/ p; ?! Z
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
+ Q \+ C7 h! `0 E- a5 L: u
mcasp->regs->RINTCTL = 0x00000000; // Not used
6 y* V& P. e/ n D" ]! Z
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
) F5 S5 k$ `; W4 I7 |3 V- _' `) `/ C
) A' y" f7 ^1 Y. V4 a- R
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
; G2 J4 n9 G( K5 ?( b
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 y2 Q: a) X, ~
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
! t* Y z7 U/ e5 e( o. x2 P
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
3 p) J/ c( Q7 Q( Y) l
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
; j& P& ^2 d/ z; f
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
. L" q% L0 N; ?1 x
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
7 c0 F' r& A$ j. v, [# x1 x6 G
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ s7 c9 }, q# _/ ?) F6 ?
9 A8 f) F( n% b; Q) X- ~" l4 L' g e
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
2 \1 ]5 l7 H4 W: [
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
6 _' L- O& _9 ^
mcasp->regs->PFUNC = 0; // All MCASPs
$ J3 E6 S7 W% {+ j+ n* U
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
5 ^" C/ \1 z& {4 u% ?6 }& x
4 y# A; G6 o7 l3 `/ F
mcasp->regs->DITCTL = 0x00000000; // Not used
' E: @, U1 V1 Z4 p
mcasp->regs->DLBCTL = 0x00000000; // Not used
$ a9 L# ?9 `( Q# O. v. T! T
mcasp->regs->AMUTE = 0x00000000; // Not used
0 z- }" ~+ c0 c: U, a R3 P8 E1 I$ C
9 H/ B$ G! j7 X9 _
/* Starting sections of the McASP*/
* k7 m" i7 Y. J
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
/ ?% |; T7 Z4 J6 s4 S9 X8 z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
9 ~; H/ P6 O+ r. `: ?% H& O
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
* I0 t+ S) }. Y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
' x1 M' Z) t6 A
- e+ J( H; _) F z6 k8 Q$ s0 w6 R
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
% A2 C+ }! B" I+ r# q- Q2 p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
( r) d7 B) G9 q6 f
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
8 m( J" D% O! j2 ^
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
3 V& [' y* D+ { y7 }& v6 n( |
9 g6 f1 n" H/ T1 C- J0 X9 D
mcasp->regs->XSTAT = 0x0000ffff;
/ n- X. ~" S# O
mcasp->regs->RSTAT = 0x0000ffff;
( @3 l. _: ^' \6 {" ^) G
) W2 i! q. V/ i' w
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
2 T. P8 ]% r1 |# Z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
* b, U) S3 ]% v8 Q1 L- s' k
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
2 c0 s+ O" u. P/ c7 b
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
0 z4 s: Z# o0 s( c1 X
- C8 l& Y6 C) A1 a
/* Write a 0, so that no underrun occurs after releasing the state machine */
& @2 {& [7 F$ q$ A/ k) m
mcasp->regs->XBUF5 = 0;
3 U" _# p' O" B
mcasp->regs->RBUF0 = 0;
* G& d3 A. e3 v6 ?( X( r2 L
# s# a8 ^; n, s' }# y3 ], q9 V, _* {5 m
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
1 {0 G* u m) ]
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
1 S8 z& H$ G- ?! } k
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
, N0 p8 E2 o# }
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
. x0 k$ l- M% q. n7 Y; c
; r) t4 C) Y$ Y
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
2 [8 I3 d3 e$ j9 x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
& k4 B) b8 r( S! s
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
8 L a8 e0 D- @ P' o( h
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
# ]% `8 U$ s) H& P6 l9 [
$ b! c! b$ L8 x" K
CSR = 0x0000;
! S. b* l8 u& q" Q4 E y, d" m
INTC_INTMUX1 = 0x3d;
4 j6 ^$ d: x6 m1 a; M
ISTP = (unsigned int)vectors;
& |- {' V5 t/ m7 w5 I2 ~% c
ICR = 0xFFF0;
" h! t. K5 G6 c. j5 [+ o; c3 h
IER |= 0x12;
* k, @6 ^0 _# @& [" z
CSR |= 0x01;
" ~, |5 a3 ^( y$ u) z2 j, X% }
3 ?# Q8 T8 R7 n7 n+ E
$ f. d6 ?6 \% N' Y4 D. V+ z
. p+ \6 y6 x7 z! i4 }9 L
还有就是两个输入输出函数:
: j& m _3 ]0 `0 L5 n$ Q
void output_sample(Int32 out_data)
0 z/ y6 J- O" B
{
/ }5 ?$ _% c' n5 H
AIC31_data.uint = out_data;
2 q. V; [* ?4 s* X% c' A
MCASP1_XBUF5_32BIT = AIC31_data.uint;
- B8 D0 X3 ^' Z7 r: B& W2 C
}
# ?5 s2 M2 K0 _: F* ]
8 u; d7 c9 i0 I# I# c
Int32 input_sample(void)
; b4 d( O9 e& o2 v8 p5 F ~: g( ]1 |
{
) h& ^' D; Z. o- e( e$ @* a1 o
AIC31_data.uint = MCASP1_RBUF0_32BIT;
3 L9 `' N% _- [& I/ V
return (AIC31_data.uint);
* f8 U3 L! @7 l3 C A+ G
}
4 B) f+ ~. n0 U; J5 ^
" x5 z3 h* z! F% I+ \& H6 a X
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4