嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
4 P2 c9 x+ Q# p+ K& u
main文件:
( l9 a# T0 y% E* `0 L
interrupt void interrupt4(void)
7 [$ {' d8 X7 J } A/ r' n; K& ^
{
8 B% M/ l' h0 b! S0 S4 _3 _% v
Uint32 sample;
0 ]+ d1 p+ d8 K" R% W) W
7 X6 ]/ o, O' [
sample = input_sample(); // read L + R samples from ADC
+ p. E, ^; H( f( \2 ?/ R& h& r$ A- o
output_sample(sample); // write L + R samples to DAC
M. P3 g; I8 a5 `$ D1 U( ^, A
return;
% Q+ p" B; D8 N! z8 t
}
" A' V8 F F5 ~
9 p' A1 J+ D; f3 i' j
int main( void )
$ X( z! d. ?, K- j
{
# a0 H/ r% Y9 ~, i4 |& r8 P# ~ X9 h
* c. l1 E2 d; E
/* Initialize BSL */
$ A1 \; p7 U _# ~( z0 @5 A! G
EVMC6747_init( );
& T# d4 H. a5 |
/* Call evmc6747_intr function */
8 k6 a Y$ W( m% a
aic3106_init( );
* v' ~; N2 h; k1 Z6 q+ x3 P
while(1);
3 t! v+ Q5 U$ `0 S* F
}
$ o( o6 _- ~3 n! h9 M8 X
) x8 j7 ^/ A7 l( e( U
. m F! B9 p/ x7 t: ]7 `0 {
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
y4 Z5 O" B5 X4 A
/* Initialize MCASP1 */
0 B, z# G3 j( {
mcasp = &MCASP_MODULE_1;
; R4 P$ y9 `4 h: P0 l5 n) Y) J
mcasp->regs->GBLCTL = 0; // Reset
0 P# @& X) w f0 u3 ?) c; j
mcasp->regs->RGBLCTL = 0; // Reset RX
$ P; g/ K3 f" z& P1 m0 G4 ?* c; n
mcasp->regs->XGBLCTL = 0; // Reset TX
8 u7 Z2 f1 ?, t) N9 D
mcasp->regs->PWRDEMU = 1; // Free-running
3 `+ p3 E! @" S; [' K& J7 ^
// configure McASP0 receive registers
9 E- `- a7 C* J) s$ Z V
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
$ c! O& e- v% W' K
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% d% ^. }7 l/ ^! q! w
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
1 j$ x7 D% k1 c' ~* C. x" y5 X
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
! U: ]( E0 P+ `/ K# B
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
; L" I" t( y4 ]+ S. X( u
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
5 Q8 J' U* Z, h+ f9 S- @
mcasp->regs->RINTCTL = 0x00000000; // Not used
4 J' w) W$ Y& o; U' C6 e m, c1 x- j
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: I6 f! _4 h ]( a' p. ?
' _' ?5 B0 W7 Q: a+ L" `/ j
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
5 W5 x! ]/ s; [. t# d
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ u# s- V4 R8 k- K
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
$ Y; @$ H( \8 T! e# X
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
1 {& C) n2 [' K2 r( {& D% S
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
5 W) ~* S/ p6 ?6 Y) i/ O* D
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
' i: ^. ]$ v' D1 }9 B
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
* M9 [' x) V9 W6 w7 [( @( U
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
3 G% Q5 v' {- u: R( z5 Z
) ?+ n! N% [% l' p8 ? a P5 `+ a
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
+ U. Z8 ]4 w W% G3 ~( c
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
0 W& d* a: E0 J" w% J5 B
mcasp->regs->PFUNC = 0; // All MCASPs
. K6 U) m7 I$ F5 l2 t
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
2 B: h8 o- h- n/ ~: o) I! N0 S8 j
0 C) }- i( }6 a" J* Q8 P. B
mcasp->regs->DITCTL = 0x00000000; // Not used
5 W: o ~/ }( |7 L9 U; H
mcasp->regs->DLBCTL = 0x00000000; // Not used
* ]- \; Z. q% Q6 ]
mcasp->regs->AMUTE = 0x00000000; // Not used
& n+ c% u5 o: V |
% ]- x& f9 b) n1 [0 w6 k
/* Starting sections of the McASP*/
+ |: D8 h' N" ?; ~- h4 G5 `
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
. m2 A* P9 Y1 u$ S: D' o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
2 s; S0 }8 C7 D. b* G( _
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
) c5 |) X# Q S0 G8 F5 d
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
& B+ n7 a# @' _! t$ J6 | J
+ T3 F) v2 b5 c+ [
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
2 v- A' v7 T; m W
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
. u) F) {; a. U9 ` n8 v) X8 F$ y
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
7 q# o9 u" v$ b! n. B
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
; x, }) Y- t5 ~4 f
8 @4 \5 b# W/ c9 z- r+ ~
mcasp->regs->XSTAT = 0x0000ffff;
$ B% u% i5 h* S8 v" e
mcasp->regs->RSTAT = 0x0000ffff;
G, C; q4 m6 q/ ^
$ e$ }. w# T" a9 ~ p, W, v6 q7 U
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
* U( b5 n! m4 J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
# @( e+ W: o) } c4 P& m) o8 ~
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
2 O2 f: x, H; n/ L* m% u; d/ W
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
, \7 ~( E$ z, d8 P
$ ]' F# X% f4 S
/* Write a 0, so that no underrun occurs after releasing the state machine */
p5 @3 c- Q }5 }" A/ L1 W
mcasp->regs->XBUF5 = 0;
" h: |1 S0 R4 b+ ?" i# b- W
mcasp->regs->RBUF0 = 0;
[! x' g: U8 g* v, x: I- c! u
. @* j" f7 S3 ^9 ]1 J O
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
5 h7 k& [9 Z/ f& r% Y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
# v) t# A% v5 g/ X. D/ Z
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
8 Y# t' u# M8 ^. C
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
' D. T @3 m! z
5 @7 r6 N# x% R4 j: l9 B7 Q
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
- e" `8 @, n* v! E! j9 w; N
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
5 J9 t4 G, v0 ~2 ~7 h V' ?, o
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
9 k- ^. D7 h2 r1 K$ _% z7 Z4 ]& a
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
+ g' X$ |, I1 |; E
5 N) R8 |# C5 a$ `5 a8 }
CSR = 0x0000;
2 u# w: d4 k& r# L+ H
INTC_INTMUX1 = 0x3d;
3 @7 {7 p; |8 U" g
ISTP = (unsigned int)vectors;
6 b4 r( s/ \, t/ E
ICR = 0xFFF0;
& D9 G: p3 Q- b9 u% R! V# t
IER |= 0x12;
. c2 Y( z+ g, {4 g- B6 K
CSR |= 0x01;
+ w, Y7 b% L( `/ Z) m; Q
$ a* h1 z6 c1 P# `- m K
0 U: j i$ C \+ N M
2 Z* ]/ @" A) a- W: A
还有就是两个输入输出函数:
2 W q+ a: }' L1 j) \6 b" h
void output_sample(Int32 out_data)
2 M3 ~# g) R; v7 P9 P+ j
{
5 b4 W6 g1 j/ o. m1 ]6 n0 X
AIC31_data.uint = out_data;
2 i- N+ t+ n+ e3 k6 U2 Z0 {! u
MCASP1_XBUF5_32BIT = AIC31_data.uint;
# W, n0 `2 h5 W3 R/ ^
}
0 M5 b V5 S4 l# q* z d& L3 s) L
$ i( H' N0 I" s: [* X+ h
Int32 input_sample(void)
- @1 Q1 F P1 M) |8 [
{
+ X) v8 Y$ K, O) T
AIC31_data.uint = MCASP1_RBUF0_32BIT;
0 h* q% J; u s: M+ ^1 Q' i5 \5 z
return (AIC31_data.uint);
+ ]; t0 ?" C5 p1 I. m, s' M
}
3 s& d* `" j1 I& h) p9 V
3 B# ~- R ]& p6 ~+ b/ n
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4