嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
$ H4 N7 a8 ?: y9 \' a& M
main文件:
) O! y7 P9 W/ M! h0 `
interrupt void interrupt4(void)
. \% \1 l9 A9 ?" @0 O/ f
{
( ?; H. j& m- o! _' G$ l
Uint32 sample;
1 L2 y# l% `: b, z* \: ^+ F
9 C1 P* t% |9 _/ r0 B! x. d2 h M
sample = input_sample(); // read L + R samples from ADC
# b* o& d8 U+ p3 V- L6 J$ V9 I
output_sample(sample); // write L + R samples to DAC
& {+ u% \- I3 I: ^
return;
' g) i4 P7 r: `$ r
}
7 I; b- S7 u0 g3 l
( U" E0 S- M. Q. o% g
int main( void )
0 S7 x3 s# u4 A* h- z a% S
{
; E* d$ H# b9 a" B3 r
1 @ w4 D1 F; c# `( P3 Z4 j- V0 ^: u
/* Initialize BSL */
2 i: R+ ^( R1 Q- \, `6 x
EVMC6747_init( );
2 d1 V7 t4 ?5 {- P+ Q) E
/* Call evmc6747_intr function */
' N3 u$ [3 {. E: A7 b/ {
aic3106_init( );
' q4 n( F3 ~, s& m5 I" ]( N% B. w
while(1);
7 X3 `, d- |& O) Y2 {
}
5 k1 A" t0 o' Q9 i2 T3 D) e
3 x. a/ S$ M$ E4 h# T/ l
) `$ L, d1 f! h4 u
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
0 c9 d: c+ D8 o$ u
/* Initialize MCASP1 */
$ ]* m2 w1 y0 n9 @
mcasp = &MCASP_MODULE_1;
/ B0 y1 X6 \$ e- k' N/ K% O. p
mcasp->regs->GBLCTL = 0; // Reset
& f1 g+ u( L5 g1 A: {
mcasp->regs->RGBLCTL = 0; // Reset RX
( Q# j! |+ O' i" F, ~' ~
mcasp->regs->XGBLCTL = 0; // Reset TX
5 t' T. B+ k I* e7 q! z1 a( z1 t
mcasp->regs->PWRDEMU = 1; // Free-running
9 H7 _0 t ~: B5 V
// configure McASP0 receive registers
a R' _3 v4 \
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
$ v0 M& |( h) H2 w
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
y. n* ?8 t- F) G1 z* \' l
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
, b; i1 _' G4 k6 L* L0 Y3 K o
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
# i: S# Y# f6 [
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
8 K& X& v, Y& j I0 L# ?' u
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
, z- i+ t8 _0 ]7 F0 q( H
mcasp->regs->RINTCTL = 0x00000000; // Not used
8 Q4 X7 E |0 v0 j+ q
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: N, i0 {/ T9 ?+ Q2 n* G
( S, a- B! G8 S
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
$ c3 \9 C6 S4 w8 c) K
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: Q$ j! j% B4 p) A+ F
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
8 [ g/ P8 \, N+ t, ^# F! U" m$ t
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
3 I1 g V' v) x* Z7 C
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
' x4 {! _6 u/ h+ g4 y2 }# f- r
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
: ^9 g$ G' }! |3 s6 H! C1 n" k4 e
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
) J9 `& K' V' i, O) f+ Z; y
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
- g* W0 p& P( d& b, l9 U1 v
+ F0 N9 R- K0 @3 I8 k, ?' }1 B
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
6 H: u& J1 }, E' ] P9 X' K- _
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
, i6 d/ \% J1 T, V
mcasp->regs->PFUNC = 0; // All MCASPs
1 t0 a' z: z G( a
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
% o' E7 ?( y) E( I/ M$ n* f
; U4 l* }' W- C) J2 l
mcasp->regs->DITCTL = 0x00000000; // Not used
; X4 q; Y) d9 |. |: ?! I2 `/ m
mcasp->regs->DLBCTL = 0x00000000; // Not used
& L) _9 T1 `; _6 F" @* [
mcasp->regs->AMUTE = 0x00000000; // Not used
$ j5 J8 p4 Z3 g P" s, j! K, t
# P) Z7 [5 z7 F3 \4 g
/* Starting sections of the McASP*/
' ]8 u' U: d5 u
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
, M4 }/ Z$ j: X% w7 J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
9 C! F- t; F8 f
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
1 `( O" J: l! `, U B3 o! r- R8 ]# {( C
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
/ g2 Q& i/ u- I8 d
/ l$ |, d, d2 C. h5 s; b% |
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
4 {% p F! Z3 ~) ^: Z" G: r* C L
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
$ ]/ o; n% \- z
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
# j, @* @/ U' S; g; S
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
) V4 s0 e) ~: t( z
1 R1 q1 u1 X S; m
mcasp->regs->XSTAT = 0x0000ffff;
6 Q) x4 k* `1 \% C
mcasp->regs->RSTAT = 0x0000ffff;
q% U- v- r- w% N: Y C1 M2 g3 g
8 \3 s+ D, F2 e( R
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
1 X% i: W6 i" l) z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
& K' ]$ y( k; O* s8 E# x
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
: p& e5 A* e) p$ q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
& w9 O0 E6 p b/ \" S; Y- J5 O
- t& M+ F: ]- [) q
/* Write a 0, so that no underrun occurs after releasing the state machine */
# W: F8 C( w! _* o% O% U9 ~
mcasp->regs->XBUF5 = 0;
6 Y* w4 W3 e- |! V
mcasp->regs->RBUF0 = 0;
0 p, {# g7 H5 h# |; O$ r5 Q I
{' ~& C& u) t5 a& O& X
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
, h o" R: L9 z. m
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
' l- d6 m; y( V( h4 ?. V: _
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
2 x- G" N/ m, Z, ^
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
. y3 q) ?$ G7 i; N
' A" h b4 q4 Y, d
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
. J& ^% q0 \8 d
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
% v9 p" i3 Y. S. ?4 @- w$ X+ M1 C
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
9 C& q$ Y: g, t d7 j3 t }
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
2 @8 j; h' i |+ t$ |$ \
8 v2 A" g! r/ @& P6 `
CSR = 0x0000;
9 C1 | r b/ g
INTC_INTMUX1 = 0x3d;
; f- E# ?- }: K' e0 P& k$ w+ v; n# q. k
ISTP = (unsigned int)vectors;
/ t+ R7 y* U% B9 x1 b r' M% v8 f
ICR = 0xFFF0;
( s! x# ^% d) G/ W
IER |= 0x12;
- j. B6 u# M+ u# c" M$ d" y
CSR |= 0x01;
+ v# z& a9 n; {1 F3 T1 B A N
0 M' p( o% t& m/ \) E
9 I! {. p: S6 r& _
) M8 W! t1 B- }- a& A* ~
还有就是两个输入输出函数:
/ }9 l8 X0 p! o6 p1 g% `
void output_sample(Int32 out_data)
4 n/ l5 Z* ` z1 Z
{
% D% P* f# {" g3 N# l! q2 ~* u8 c
AIC31_data.uint = out_data;
& p7 A* C* z' N9 a1 v$ `' ^
MCASP1_XBUF5_32BIT = AIC31_data.uint;
0 d* U1 V2 F- f# P
}
) B. M" }" E- v: _$ P/ I5 P
/ u# l4 o& b; n9 ~
Int32 input_sample(void)
( C5 Z# x) R$ _
{
1 |% j: a$ j6 s# X D' c
AIC31_data.uint = MCASP1_RBUF0_32BIT;
9 m$ C/ o S7 D4 U1 ? a) @* U
return (AIC31_data.uint);
6 A; M% A2 x2 `' z3 m( Q
}
% n" _: R2 u7 c$ R2 ]0 C) {8 W* c# f
7 ^, M* M) H$ X
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4