嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
+ M0 @# Z5 K+ i; n; ^
main文件:
7 z/ R8 F1 J0 D: ]/ E( E% b& C
interrupt void interrupt4(void)
. t9 I4 a# \5 X/ i
{
, f! P1 y4 j/ n0 J
Uint32 sample;
8 |) e7 _! v% L
. [0 D3 s! n) Y/ f6 R
sample = input_sample(); // read L + R samples from ADC
9 f0 u7 o# C" o/ c# g0 @" _" \
output_sample(sample); // write L + R samples to DAC
& T# J3 O5 f* _6 J: k9 y0 M: y3 I
return;
: y) G* ~3 ]' B4 H0 z" Z K8 e
}
4 o# j3 c z+ ^
% v4 k4 V. ?. {! Y8 O
int main( void )
# |# r0 e1 m1 z: L% j' V# V
{
7 Q" `9 U" O2 R/ v. a
/ h) L4 _+ i, ~/ F; r6 a# Y
/* Initialize BSL */
7 D0 ~' M4 N$ a4 u% W9 h
EVMC6747_init( );
) x$ t; Y4 f( g5 ~" G* p* Y
/* Call evmc6747_intr function */
* i7 W4 e: m, _1 r" `
aic3106_init( );
; o/ L5 y5 x8 w) E
while(1);
. G+ _( D% V2 j1 ^/ b1 ]$ Y$ i) R
}
9 Y" e4 ?2 m6 r9 W' A* L' ?
7 A) D) W( i( A- l4 C' i
& ]% u5 U' {3 x' R6 S9 M
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
& q3 R8 A& T! S+ S5 a( y
/* Initialize MCASP1 */
5 c4 W# M" ^' M1 b. k
mcasp = &MCASP_MODULE_1;
0 e1 c9 L$ q4 p" t
mcasp->regs->GBLCTL = 0; // Reset
7 l! w: q3 q: C
mcasp->regs->RGBLCTL = 0; // Reset RX
& a- I* c" d7 w+ l/ u& z. V
mcasp->regs->XGBLCTL = 0; // Reset TX
. U7 Q& n! d. z" E
mcasp->regs->PWRDEMU = 1; // Free-running
* B# W" j1 g+ U* D6 {: t6 c8 O4 `
// configure McASP0 receive registers
. b" `% E0 R( P$ ^- R' v
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
) T: n% T5 e4 S( c. N! {
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% Q0 K4 w+ c+ F3 W \7 o: u N
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
9 i; H f5 I$ p7 P
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
& R1 S6 Q% y$ x& m
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
+ h8 x& D3 R) S# {
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
/ B2 c9 J( l1 c! |2 r |' q
mcasp->regs->RINTCTL = 0x00000000; // Not used
- r' Y6 a" l p1 ~7 J
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 S9 Y u3 Z0 }' Q6 x2 T
! f" j: J- \; Z& `& ?- g: O9 I4 p
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
1 ~) z7 M3 c2 Z. K( Q* F
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
8 ^' r7 J0 M' B/ `( F( ]. H
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
# N5 J2 V: v1 m/ n$ ^9 C
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
Q2 k. R) l; J7 x. ~6 S
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
1 J* v/ D3 Y* q2 `3 q, j
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
7 k4 ~$ n* \1 |; C9 h
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
- T% Z' K4 b, x9 b" L9 _2 ?3 U
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 o- \( {! h2 e8 J. V
8 K4 l( q: M3 T- K
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
5 G% b" w8 Z+ h' {8 N
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
' O! t5 D" E+ J. A/ t
mcasp->regs->PFUNC = 0; // All MCASPs
* ]0 O6 O) S- ]
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
9 F6 u) G6 O# g6 Y X
) y' W, E& j: E7 k; q4 O
mcasp->regs->DITCTL = 0x00000000; // Not used
/ \" W7 K, ^3 l; g0 P, Z
mcasp->regs->DLBCTL = 0x00000000; // Not used
' f% Q- y" w c9 A4 y
mcasp->regs->AMUTE = 0x00000000; // Not used
# H* j* ^) v/ M3 g' I. ~+ y
; s& r+ W- A. X5 I1 a2 ~
/* Starting sections of the McASP*/
& Z! ?0 @& `: f$ p$ Y: f
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
' l: R) D: c9 v \& u( g D6 k
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
% ^; k$ m8 E8 E6 Y [0 h2 L% ?
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
O2 C/ u& z( [0 q' j9 ^
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
+ k( Q0 K' s# K: c1 Y3 c! j
# Z7 o9 O& I; D4 u5 N* @
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
6 X# V! I6 H5 X- p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
6 V. d4 @1 @6 q) `+ w' Z
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
* E5 ]7 Z% x8 p: A8 o$ _
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
9 k0 u7 S4 |4 [
7 F" l1 ~* o0 K! H6 V7 z$ _: u
mcasp->regs->XSTAT = 0x0000ffff;
5 S) W+ J' T; k: k( x* T- X9 @+ u$ l
mcasp->regs->RSTAT = 0x0000ffff;
4 O9 W/ }* r3 k
6 T( i( o9 W0 J/ z
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
4 g8 @0 @, p9 f% F8 Q" E4 J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
5 d7 W1 w1 L) W; U5 ]. r
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
X% p; Y/ c. B. h
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
' u( I3 e. E) x& _+ ] v
: a! S9 Z4 _" T. y( I, ^' X5 I6 f
/* Write a 0, so that no underrun occurs after releasing the state machine */
4 j; G: B: n4 t! v) ~. Y7 j z( k
mcasp->regs->XBUF5 = 0;
' @7 r. m: |: m8 ?7 j6 \! i2 F
mcasp->regs->RBUF0 = 0;
4 J, j$ b m! R
: B5 [( y: t. G
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
_5 u( b1 M$ g4 b& c4 @* _
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
4 m) r- |8 C3 W& D) W& |# T
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
6 x* @8 v, Y( ]8 n' U! h
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
: {3 H- `$ ^2 @+ }0 y Q
8 V% A% \) k% a% ]
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
; z* d2 O6 V, C4 q4 }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
5 O% ]; i7 |. H' w& T% W. D: |# t
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
+ ~4 p( N; i+ T& l, ~# C8 Z9 H
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
% P6 h6 b, O+ d9 x! L; q5 E
. |+ Y/ V" B$ o' |. v$ m6 d6 U6 h1 k
CSR = 0x0000;
% Y) v3 A7 N9 L2 S4 G! S
INTC_INTMUX1 = 0x3d;
$ j( l* _0 ^) N, i0 X% T
ISTP = (unsigned int)vectors;
# j) u @; v; K' Y6 q
ICR = 0xFFF0;
9 w: c! J- S$ G1 F7 y4 [6 x
IER |= 0x12;
A3 c! H; T6 |/ V0 y. _
CSR |= 0x01;
4 ]/ d- ]" `4 b' d3 y' B: @! h0 Q* V
8 F, {5 ~- E' {0 s0 K
4 A, O* b0 J5 f# R+ p
4 {& w t2 P8 {# O( e
还有就是两个输入输出函数:
) @5 e: N. [+ b7 J$ m# A, Q$ O0 W
void output_sample(Int32 out_data)
: r$ B6 K! M' t9 H( }% t
{
& |2 y* @+ A9 G4 p" q4 {% H" r
AIC31_data.uint = out_data;
$ R8 Z8 [; M; f+ l' ?: B
MCASP1_XBUF5_32BIT = AIC31_data.uint;
: q, S+ G, k' p/ m7 E9 S
}
. ~# v! O4 p0 u% N; u6 ?& Y
4 e* n" A/ L, l8 O
Int32 input_sample(void)
" F# o Y. V3 O0 k
{
( \4 F9 V0 A% [( K
AIC31_data.uint = MCASP1_RBUF0_32BIT;
: D( D' C+ ^- h* k% U" Z6 ^- W7 T
return (AIC31_data.uint);
. H) u2 x0 e5 q
}
( e! V3 n- m6 }* P
U8 O& ^ y* b- Z; F8 _4 m
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4