嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
! m, i3 w4 z" E) [. \
main文件:
+ d% |5 ^: ?: G* V' F3 n
interrupt void interrupt4(void)
# _* R* J# f, t
{
* P# j; Q2 {. G4 B1 N' N! T
Uint32 sample;
: L# c) k [9 i
( z2 f& a/ W- q7 T
sample = input_sample(); // read L + R samples from ADC
& \9 w. X$ y% B( q8 Q5 a5 S
output_sample(sample); // write L + R samples to DAC
+ @0 W! j0 B* r. d
return;
4 B3 H- H3 V# b" k2 m7 N
}
/ e: k. W3 v: c) j5 N! Q
& N( z9 }' e4 J3 B Z
int main( void )
, u- _0 k" k* W4 V; J
{
+ b2 F% ^; n6 Y2 T; A! G# i; K
9 `& S1 k# d/ f8 Z+ L$ U% n
/* Initialize BSL */
3 c4 E Q% |' {1 @& Z# I$ f
EVMC6747_init( );
T& G" t7 c ^
/* Call evmc6747_intr function */
$ v+ y5 z. V( ~* H
aic3106_init( );
! |5 [% o8 W ]9 v; g7 Q/ w
while(1);
* P @2 s2 P! p, l+ p" k) [( C, x4 s
}
; t: H" L( M7 g9 x m0 V, F
( H+ u* v; d2 O% d' M6 A
7 c9 z6 H1 V/ _* j$ ]
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
) @* D; o- T0 X. B: h# F
/* Initialize MCASP1 */
: H% a; B. G6 f x0 D) i
mcasp = &MCASP_MODULE_1;
J* ^6 L, |: @
mcasp->regs->GBLCTL = 0; // Reset
) f6 g, q- n! H v
mcasp->regs->RGBLCTL = 0; // Reset RX
+ T. [4 x: \' Z" V% ~
mcasp->regs->XGBLCTL = 0; // Reset TX
4 W( k: q; \$ r1 C" {6 s
mcasp->regs->PWRDEMU = 1; // Free-running
# L; U' k, h# p, Y) [% F8 E- N
// configure McASP0 receive registers
) I4 k. k8 i* O% ^6 f! V' r# t0 T
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
/ f7 f& A* A7 ~: O
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% c/ E2 [% v. d- V: q* K5 ^2 S1 E8 p
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
2 e! S$ W7 w: O' h% D
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
, K5 I3 V+ K1 ^! }7 W: p; i; S7 g4 Y
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
/ h/ n1 Q3 @/ l$ o* N2 m' D, }
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
0 M8 p. j4 q) L# x$ t; J. s
mcasp->regs->RINTCTL = 0x00000000; // Not used
- J$ e- F, P% l6 i; l. k- V+ Z k
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, t# {# F; P! K0 a% ~' ^- N
. ^8 u' [, t: z0 U/ P( t! i
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
6 }- E9 h- a. x: V0 U
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. y7 \+ h2 E; Z: o
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
5 {1 h: L" w r3 I8 n$ j& R( @
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
) |9 f5 f( T6 U6 y9 j
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
9 A1 z1 P3 `3 p/ T
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
. C5 D% k6 R+ G( \. X1 P8 N8 g7 f* |6 k
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
% \+ k; Q& b3 B2 }" Q+ C0 `
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
- p: t, o' k* n* ?0 [, U
' x" i) B) a" F* k' s" l
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
9 v2 \2 @! ]* y' W
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
( a) e3 `/ J0 g6 O5 A$ A0 n
mcasp->regs->PFUNC = 0; // All MCASPs
; N8 G% e0 k, s+ Q0 t
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
- M, ^: o, U* K3 ?
4 J7 m- {9 n1 d% {+ f- ^% p
mcasp->regs->DITCTL = 0x00000000; // Not used
0 n# J3 t( R j4 N
mcasp->regs->DLBCTL = 0x00000000; // Not used
2 O& Z, G& q+ c. m% q: L4 q
mcasp->regs->AMUTE = 0x00000000; // Not used
$ v% }, ^: F+ X4 A( s- u& q/ K
; d9 b+ q1 z& j, M7 n+ L
/* Starting sections of the McASP*/
" H6 |* {) u% |- r) G
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
" i0 T. R' }: [$ B- {6 l
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
8 z5 f; _' S8 u
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
7 n3 B @* A, {. N- q2 V
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
' V2 |5 D8 M4 f7 R* G' F, `) o
+ p2 B; R! P, [& @9 u
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
4 B* d: B# N6 @) I
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
) D/ w2 j( G9 v& W% x
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
8 k; h* J0 A- B0 _: ]5 B+ Q- `; u5 a7 s
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
* A1 \: C( R- l7 I
7 H! C$ O6 [0 z- l3 H
mcasp->regs->XSTAT = 0x0000ffff;
4 Y! Z+ E4 F5 j* n0 R
mcasp->regs->RSTAT = 0x0000ffff;
$ \8 b% D# F! p
7 C8 D6 ~" n( ~2 f% m! p5 [
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
3 o, L2 R q% S. e# _% P& @
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
' D/ ~+ S, ^# r
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
4 H. z5 V4 d/ q2 D
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
3 W v* w, ]& H( A1 T, s2 c
: }5 ?$ m/ _) ^. T. G7 W# g
/* Write a 0, so that no underrun occurs after releasing the state machine */
) {; f5 b" A1 [; P. V, w) b
mcasp->regs->XBUF5 = 0;
X: y2 [. y9 a% J, S
mcasp->regs->RBUF0 = 0;
1 x. T) }+ `- b
. u# U* E" B% H
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
) F2 B. m1 t; ?: ^& C
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
0 \; E+ ]: {7 C9 `: Q
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
1 H9 a. F. ?8 F( z. G% z: C
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
% _3 E2 I% B7 \ d* l
: y- [8 h) F0 `- {+ L' x! |
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
& Z4 D9 u8 N3 q" J) i$ z' G- F. J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
) k0 k- d% M2 l8 v$ j
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
/ p4 o: y2 S5 n1 @
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
. |- S' r+ Z9 K' E' A. ~, A
8 B' q5 I7 `8 f
CSR = 0x0000;
/ t* _. Z4 N& a8 g( n( \5 H
INTC_INTMUX1 = 0x3d;
) c, t, e, R% ^
ISTP = (unsigned int)vectors;
% Q+ q7 n: \7 z1 X: w' y
ICR = 0xFFF0;
* W$ E6 V) f+ ?" g
IER |= 0x12;
: ~) G9 k7 W+ {, L. @
CSR |= 0x01;
" v" a! h6 c3 c# @! P$ p0 u
- P$ b, T1 ^# W, D9 [
, F& a$ G3 m/ m( o: E' s* L/ q) y" o
! \& O: T+ N/ ~
还有就是两个输入输出函数:
1 ^" V C& J: U( q+ J# i' z
void output_sample(Int32 out_data)
% B6 V& F* Q$ R$ a8 V/ x
{
6 t! d. p: N& f9 O2 W- q
AIC31_data.uint = out_data;
" B# |! f! m9 O0 P0 k4 S K% A* k
MCASP1_XBUF5_32BIT = AIC31_data.uint;
6 b7 `' d5 h1 d* f! n# {9 w% A
}
; E+ _9 Q5 w# X& c8 W4 N
% i# ?3 o$ a: g, I
Int32 input_sample(void)
5 a1 [, s* e& O! q6 [" u7 o7 l
{
9 _! @3 c' b. F/ \
AIC31_data.uint = MCASP1_RBUF0_32BIT;
9 ] O. U8 l3 _ m
return (AIC31_data.uint);
* Y1 \3 D. |" J6 N+ t5 }; p
}
+ u. P. @3 n: @
" v; p' o9 M( N+ f; Y$ l1 ]- e
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4