嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
5 R( l, [6 w! ~# G t5 H
main文件:
$ }3 V/ B7 U% B# }* g' n# r" l* s% h% x
interrupt void interrupt4(void)
, E' { I; E5 ~+ n* [3 l' i
{
7 ~. S$ k& } K4 }
Uint32 sample;
$ W& h# H, _8 P# I+ b
7 N+ Z6 X4 R' e- u( D0 _
sample = input_sample(); // read L + R samples from ADC
! c# }" R" _- @4 A) u0 J
output_sample(sample); // write L + R samples to DAC
# Q, I; H, O) [% \' Z( F5 v. m4 C8 s
return;
( ^* h/ y# f. [1 c+ ?3 @9 {# X
}
* O( I7 r0 C' a& Y) N8 Q8 n& w
* r; F- B! K4 K7 I
int main( void )
, K& d) A l. M" p: h$ U& |
{
* K* @7 E/ n: m
+ L% T% Y) ^, R- ^4 W3 v2 m
/* Initialize BSL */
: m7 ~+ K& b# A! w* i" [
EVMC6747_init( );
0 W4 ?* K7 N* N0 F. P
/* Call evmc6747_intr function */
3 A" u# \8 b2 n1 m
aic3106_init( );
5 D: `. q: K& o
while(1);
) z; s, I. N$ F
}
" M2 U; _; o2 A4 _0 U2 x
# n- ~% n3 _! o l, r- @# |
5 S$ g: p- z. M$ d
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
) [% J" Q6 F& n( m
/* Initialize MCASP1 */
; ]. X9 f5 b, x
mcasp = &MCASP_MODULE_1;
: P$ ?; A5 g, y5 F3 l2 U7 X
mcasp->regs->GBLCTL = 0; // Reset
. l6 \+ S6 ~, G; e9 [9 h/ `
mcasp->regs->RGBLCTL = 0; // Reset RX
+ r& ?4 v! n3 j
mcasp->regs->XGBLCTL = 0; // Reset TX
. [; O, M9 {4 h! Y4 V1 ^
mcasp->regs->PWRDEMU = 1; // Free-running
8 }3 V- M" e3 d. F
// configure McASP0 receive registers
" y, v2 G) ?$ a: o
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
- ?. p {1 a: X/ E' V" @ V+ r
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
8 G! C9 h: ^; W
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
* o" a' a: L0 d' T
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
9 S; e. k- w! a3 P, h- S+ ^
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
3 C" q5 K- _! e
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
1 `; _& b6 O; z
mcasp->regs->RINTCTL = 0x00000000; // Not used
( w$ N7 ?- m, Y
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
& p- F. b* ^ K/ {) [& I
1 S1 w/ R, r1 B5 H3 e
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
l. R" X! M9 N
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
# P! D( C/ M& |
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
4 A* v, c9 E- q& H
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
4 c2 Y$ H8 E) f' K$ y" [ c
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
0 ?* M1 o/ E. J8 l: A3 O. `
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
. `9 P& i& \5 m) ~
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
; e9 X! L9 E7 ~4 C# w
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 Y w) c C% E1 V6 C% J
" h( O/ ]; {4 |. A9 i+ N/ o; k
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
$ T/ m* ~- B! [; S
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
* `8 |6 r- D X1 Z: x$ j- i
mcasp->regs->PFUNC = 0; // All MCASPs
0 F+ S p+ `! s
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
& h. F7 G: O, r7 r9 }7 q
1 K! e, l& V3 i: p
mcasp->regs->DITCTL = 0x00000000; // Not used
' }. _5 x: [6 i; P8 y. a
mcasp->regs->DLBCTL = 0x00000000; // Not used
8 z# f( @+ `/ p7 d+ y# _
mcasp->regs->AMUTE = 0x00000000; // Not used
3 [( ~$ O1 H6 ~) S4 Y
e6 j' f: t `8 k
/* Starting sections of the McASP*/
}0 e; D T6 }7 g
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
3 l# g: X& V+ X) r( J: v) B
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
- U3 U- d3 T: H3 k4 f' H" V1 K0 h
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
% @2 T0 J+ Y; |
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
& g9 \, w7 E. A8 I ^+ x1 F
! J b- ^- W9 M, i/ T8 Y/ L
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
0 x3 }9 G( U9 Q$ [
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
. H" C; r0 y! w0 q
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
- {* J, J5 f% n2 X
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
) M& V5 P. z x. Y/ T5 M, R
) m' K% z! x9 e5 C0 E5 O8 V
mcasp->regs->XSTAT = 0x0000ffff;
3 L0 r C3 A q4 j0 n; v
mcasp->regs->RSTAT = 0x0000ffff;
) {, l8 d/ z6 e6 x9 f8 b6 H
! u0 G3 v9 T0 {) B' w* L, g' d9 n
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
7 j1 O; G' K* R# [8 L* g
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
3 e9 z5 i; Z3 {4 J# q+ K' V
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
2 H7 ^; O+ {5 _/ f& M$ p
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
( u+ P. f( ^% W& j! F: l/ [$ J
$ {1 e% ^3 j; D4 c, s; V! z9 M! a: I
/* Write a 0, so that no underrun occurs after releasing the state machine */
4 a" X: U, S! u' d3 v
mcasp->regs->XBUF5 = 0;
+ \% d' l, c+ V8 d# E7 J: P$ g
mcasp->regs->RBUF0 = 0;
$ ?- M1 z1 ?, y% {, R0 j: V
" B2 b; j, a# l% Q) ^. X
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
% J* m! c# e# D9 k4 R' L8 m
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
1 `! T+ ] x3 m
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
, N j$ T$ `( n: `4 G \
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
# G3 X' V$ G" a5 ]
. B( _& z$ i% t$ c$ X
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
( c+ m3 d/ \8 q& a# o% Q1 W
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
4 ?. n; n- w: K& h- Y8 L. P
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
1 f- m) L& v1 D3 O( r% i
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
/ k$ h0 Y& x# r) ~, _
; m* j% q3 r. |* S0 |
CSR = 0x0000;
$ C1 p+ ?: H+ r+ `! A6 o
INTC_INTMUX1 = 0x3d;
) ~- n$ {8 g. h* M$ n
ISTP = (unsigned int)vectors;
1 q% T2 {: O) e2 p. `9 s$ A
ICR = 0xFFF0;
$ n, L% _! v+ W' Z1 C
IER |= 0x12;
+ A" N* W# n/ J+ \
CSR |= 0x01;
6 x+ J& ]4 f; C' N3 S- F$ i
9 t+ O/ e" A7 ?; @9 |$ o( B0 B- M# M
2 N( n& M- x8 F2 t3 C) e& c2 m
. |6 g$ w: S. A, c* Y" ~- V# h3 z
还有就是两个输入输出函数:
, ?6 t. E- C( [; w
void output_sample(Int32 out_data)
7 T- b7 D3 P+ R/ k3 o* N
{
3 m, `- h1 F$ @% I# u' U9 I6 u/ u
AIC31_data.uint = out_data;
, R) I. d2 F( D" M% b6 A4 J5 t) g
MCASP1_XBUF5_32BIT = AIC31_data.uint;
, X& m, E/ v, N/ S8 K' b
}
" \# Y) u& @* K; p! J3 p
3 d }- O. @- Y( J! S8 T7 ]6 ]
Int32 input_sample(void)
: o- ?; ] ]% \% S0 d" k h; ]: j
{
. u3 h8 \) h8 l+ S0 V- _( s
AIC31_data.uint = MCASP1_RBUF0_32BIT;
+ I' `* ~' {; O+ {
return (AIC31_data.uint);
+ P; \) F' z1 w w: F3 d( C8 g
}
( j5 R1 K! C% j
8 `1 d; k6 }9 J2 h: x
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4