嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
5 N: V% B: X7 M6 P) j G
main文件:
6 U, i3 H t; Y! x- W5 L5 p
interrupt void interrupt4(void)
; p( q) p4 Q& }% E8 v
{
; l9 h6 B8 b# o' ?. \! I0 W5 ~
Uint32 sample;
5 K) v2 e# Y+ ^: s! Q- r; M# X' t# \4 F
* }# D$ U- E% G7 v7 E" l) O$ o" r
sample = input_sample(); // read L + R samples from ADC
1 X' a# w$ b: R2 R, h
output_sample(sample); // write L + R samples to DAC
6 y( g# A& J# u
return;
" c9 V& n+ y) [, i+ A( h1 d
}
) U j# I" @+ g: C0 I% e5 n9 Y* R: \
' g' o3 i8 k6 S0 @# }. V! J
int main( void )
1 H' x/ v4 B4 a9 ~
{
. `1 b; \' q4 m' x/ t- N
. \" w$ a3 z% ], k
/* Initialize BSL */
, s) C% m. h1 q1 G7 b7 e7 q
EVMC6747_init( );
& q$ n4 i: ?9 l7 w! T8 c
/* Call evmc6747_intr function */
% r5 j" l& f) D4 q0 |# B
aic3106_init( );
6 N; m. e% N5 [# w
while(1);
" l, J+ O) ]6 W( V
}
5 P( h( t0 D2 }! b, ~) c4 J0 Y8 B
/ W& o# J3 m& |( h' O0 n
7 I" k {- K! G J/ f( W, s
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
, U4 } N& z& y
/* Initialize MCASP1 */
6 u3 ` Q7 d) I* n. f
mcasp = &MCASP_MODULE_1;
4 [. u: c0 p. `' T# ]! y9 e
mcasp->regs->GBLCTL = 0; // Reset
8 E' \) v' H7 d5 _# b
mcasp->regs->RGBLCTL = 0; // Reset RX
( c$ {# \1 O( Z: u5 l) y
mcasp->regs->XGBLCTL = 0; // Reset TX
* @ o* y3 d/ E3 O$ f3 j4 D" t2 A
mcasp->regs->PWRDEMU = 1; // Free-running
7 j* e" D) D3 t* w/ r
// configure McASP0 receive registers
- ?# i4 A( V. V9 y7 _
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
$ D6 e0 I% o5 F$ o+ _
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: _- |' j/ f& R) N4 P0 w: g8 n
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
+ l* h$ ~* [2 U# S; _ p/ S$ \( I
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
8 ?1 H% x- i0 G4 O
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
; @% y, K4 u: |: J) `& B
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
; O/ }/ _0 I. i/ @, `6 H3 o
mcasp->regs->RINTCTL = 0x00000000; // Not used
. T, i4 K: e1 D; a& O( G
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
- ?. e7 b( w6 z4 h2 l& Q5 @: h
. S7 n o& o6 H1 y
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
, J) ]; L! v2 V- u6 o$ {
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% F1 ^. ?1 ?5 [& i, {4 E% g
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
8 Y: C+ N% B% ~* q5 p0 h
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
9 r! V3 z& H) k2 c- I% `$ T1 d
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
2 M3 A4 i7 k. c' d: A9 Q
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
. K+ g; E' Z) Q4 I
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
" s8 q; V" Z/ V) i B
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
" v3 ?6 A, M# |
9 Q( D- y9 d: a3 u& V
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
$ f9 \$ b. s% c1 M1 l
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
" i- m8 m: q& `. E( H* x' L
mcasp->regs->PFUNC = 0; // All MCASPs
3 R1 O5 @! u! {4 _2 h1 L5 h
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
/ K( j5 W0 l' @0 \1 h3 Z: s2 `
: G- m% M8 x, t6 u9 v! s
mcasp->regs->DITCTL = 0x00000000; // Not used
& O; I0 G2 P! E |3 }
mcasp->regs->DLBCTL = 0x00000000; // Not used
. H: n) v% k& w* n$ }
mcasp->regs->AMUTE = 0x00000000; // Not used
$ J+ P% ^& {8 f/ S/ G% c2 x+ P; ?
: Q- {( e1 _" i1 L2 {
/* Starting sections of the McASP*/
# G% |9 |" b# e8 D* p' S: D
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
6 N8 t3 V( l9 @( D" Z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
# y- {$ ?2 J, ~! N" R% K5 C7 C# W- \# O
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
! W8 L9 Z3 d) z! r1 T
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
$ b/ Y/ o; x1 }1 N! c4 h* J7 ~5 f
. }0 c4 i$ t# [
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
- l) O `7 F# ]
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
/ d- p7 e0 j3 \$ N% O
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
8 J7 _4 S/ C2 A6 ^( \8 L( |, s+ j
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
- Y% K/ l0 x; ^3 Y6 x/ m# U
( s4 V2 P5 Q/ C% I; K9 D9 v
mcasp->regs->XSTAT = 0x0000ffff;
, Z; `! j+ u7 X
mcasp->regs->RSTAT = 0x0000ffff;
; c% }; A+ o, t L5 S( | c" v
! M8 [8 A; [8 V+ ?5 Y! G M1 Q1 x
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
6 B& f1 q* w1 G" \
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
, r* g8 m$ p' ?+ V" }
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
5 N" {% n, D# O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
# T$ P2 r! X9 S9 D; O s. e& n
% i$ }/ C# `( C/ B1 d! F
/* Write a 0, so that no underrun occurs after releasing the state machine */
8 M( w( Z7 e% L0 P
mcasp->regs->XBUF5 = 0;
; ~* ?1 m7 z6 X( A: ?; o+ @
mcasp->regs->RBUF0 = 0;
3 V% O$ Y$ E* k
/ |+ z. \. n5 A( T8 P
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
& ]- |# ]3 H8 b; a
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
" r, x& N5 C' P. m2 V7 m4 d
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
) w' I. j D( ~6 h/ D
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
3 n1 \. M3 @% ]! p* ^3 T
( ~ T+ n5 J. ^/ I. G
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
7 E! a+ b; @" l; L4 y1 r, o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
+ _' t( t$ H y0 s+ D# X$ j
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
" ^0 \) n1 l6 ?2 Z( O0 [# p; Q. k
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
m# w* B6 |( x$ ]: S( V7 f6 }
: r% n8 y9 c+ t& b
CSR = 0x0000;
% }! z+ J$ v/ P, r
INTC_INTMUX1 = 0x3d;
1 v5 p. Q: X$ l; y/ ~1 M/ Q
ISTP = (unsigned int)vectors;
5 \5 P! R% T+ M
ICR = 0xFFF0;
$ n& I- s5 w0 ?; `5 \$ _8 E
IER |= 0x12;
5 h1 w; v7 P6 V3 M' h
CSR |= 0x01;
6 H% c# d# y) Q; L+ y
: x4 K# X$ L- }8 U9 w6 P8 }. D
! S: W' ^+ Y: D3 \/ @9 q# `. x* @$ j
% p, T& I" Y7 F8 e
还有就是两个输入输出函数:
# c2 e/ l# N, L0 @" a0 w
void output_sample(Int32 out_data)
% C4 b! b; ~# m7 b- O$ c
{
1 |- t5 Y4 E$ i5 M7 n) E
AIC31_data.uint = out_data;
5 o6 m+ J5 O( l5 U& z
MCASP1_XBUF5_32BIT = AIC31_data.uint;
5 J# Y7 ?0 d5 M" O5 X
}
' @8 u6 \ g# N. C9 L+ y: A( F
# r: W0 t: i7 f$ S& L: h% q2 f( d
Int32 input_sample(void)
) D9 W; f0 V Y+ z/ u# X4 k6 S, w, e
{
- S) f- t# c) m6 n: u, x+ x: K
AIC31_data.uint = MCASP1_RBUF0_32BIT;
6 S" z& g/ M# h# L/ A/ O/ E
return (AIC31_data.uint);
& V' T; G' S) Z- r9 d
}
& o# e( S3 H2 N% V( A/ Z
9 f9 L5 A8 U9 @8 b: T& |$ A
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4