嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
! r* P1 @4 d m3 f: r, p) |
main文件:
s0 @9 P$ u8 R! A" D7 j
interrupt void interrupt4(void)
4 d" \" s+ t; W% j, S9 S T
{
1 I, V8 r9 o: q" |' L: X- c# [, l
Uint32 sample;
4 w2 r- }% o5 E
! a/ L! J$ v! ?3 C
sample = input_sample(); // read L + R samples from ADC
. u- m: {- }/ T/ g \
output_sample(sample); // write L + R samples to DAC
6 m6 a' O, f( q, o# Q( [
return;
, T6 J+ s; D3 w d' k5 x4 s
}
& h$ k6 G; r/ m" Q$ l! K# W& A
& p; q8 d9 K: g
int main( void )
' Z3 x! ~3 N3 m9 B
{
# @/ e2 D8 i) a
9 K- q8 ]: p8 N. @* c+ A
/* Initialize BSL */
& N$ T$ O/ M! K
EVMC6747_init( );
' J/ a/ e! n: N# D
/* Call evmc6747_intr function */
6 P. D8 @0 ^4 n+ J6 y4 q7 }
aic3106_init( );
7 X4 i! p6 ]& p0 p! m6 G
while(1);
" R3 J+ D W/ F) A& k
}
: R! m. @; R c% f6 u$ ~
% O/ Q3 u8 b) E
/ d4 H0 f0 Y; U1 z$ V" d
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
. o# z7 i. ]: h3 g3 u3 V1 E5 j" w
/* Initialize MCASP1 */
4 O. n) J& T; F9 o) H' k
mcasp = &MCASP_MODULE_1;
- D3 q# c* X' [: o7 t' o, E# ~
mcasp->regs->GBLCTL = 0; // Reset
F! R: }, O) f/ W- D
mcasp->regs->RGBLCTL = 0; // Reset RX
- h6 s8 a5 \" `
mcasp->regs->XGBLCTL = 0; // Reset TX
5 N6 q3 D4 m+ B% [' ~) n4 R; y
mcasp->regs->PWRDEMU = 1; // Free-running
& v, Q3 v& d' l& q5 X6 y4 p
// configure McASP0 receive registers
& N6 U5 t* s1 I# x4 a# U
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
6 u" M) l$ _$ \# K3 X2 ~4 y4 N
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. ]3 V! L+ L- X
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
6 M c) q1 p3 H8 W
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
8 Q; W# S+ _, t0 o
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
- f! l3 J! `+ e, p/ [
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
$ ]) ^6 P2 v" O6 g' r5 n
mcasp->regs->RINTCTL = 0x00000000; // Not used
# O( I; T/ X7 F$ X& v% _+ H: a9 I( N" ]6 B
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 n* G; _' R; ^( h8 N
9 M* K" b/ }0 {
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
9 R$ s* Q4 m! O" j1 K7 L/ M
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% X" `4 g7 K0 ?/ R2 b
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
5 @5 Z4 d f: E. `: c, S1 J
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
& I( a3 m- U( H; [5 I+ O, \
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
, `/ x# t4 w+ w8 u: S8 I/ N
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
* W4 M4 {9 h, _3 k* Y9 l' O
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
. A1 @: `" n$ g) ~
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
' Z3 ?4 w$ o( `
$ ^7 E! K$ i& o
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
) j. S$ n* j5 i2 t) V
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
! {5 r/ I! F* t/ r. T
mcasp->regs->PFUNC = 0; // All MCASPs
) \' |) s4 r) K' p# X
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
T( P. E! J# T5 S. d& z
7 ~& ~3 l |% {: q- B0 b
mcasp->regs->DITCTL = 0x00000000; // Not used
! r, x0 T' L8 M) W& Z+ [
mcasp->regs->DLBCTL = 0x00000000; // Not used
" c& O4 @8 U* \& J( G1 i. _
mcasp->regs->AMUTE = 0x00000000; // Not used
$ t u# f5 y9 y& G9 ^8 Z, N
/ y) X% {; P! z
/* Starting sections of the McASP*/
! f, T8 E- I' z5 t! x R- H
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
; {: h3 K; i9 `" Q' w
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
5 D+ K2 M+ G2 _& e; h( c
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
3 k3 r8 W( \1 [ k3 L8 I# B! S5 e
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
4 b1 y; {: M0 v" E
a8 w1 {+ O" ?1 ]' L% W6 q
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
5 E2 P( W1 [3 O0 J3 G5 r1 E1 _* N
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
1 N" H1 h4 ?$ V: g" |! _
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
) V: C$ L. Y' l
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
F% `$ K4 Z2 A
: ?# |3 ~7 E5 U! Y1 H$ Q4 ?
mcasp->regs->XSTAT = 0x0000ffff;
3 \ P u7 T3 o. h a" o
mcasp->regs->RSTAT = 0x0000ffff;
* ~* E2 N6 L8 X
7 f2 \8 d$ k- r, ~1 Z/ {# ~1 N5 L
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
; \* w6 j; N2 W& |1 H
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
! Q# Q, `. S2 w
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
# ^6 E1 B( ]! U6 Z3 [ c
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
9 p: b# N3 E# |% } W" d6 A) i
# N0 U b3 Y1 h9 }5 G
/* Write a 0, so that no underrun occurs after releasing the state machine */
I: t5 L9 n4 Y
mcasp->regs->XBUF5 = 0;
; R$ p: r5 f9 }& g: o
mcasp->regs->RBUF0 = 0;
" b% f# p' q: z
8 O! u8 C. m# R8 G6 v
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
/ I( ` L! `# ^
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
6 s2 y2 o9 l# e' y* s; V5 F- ^
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
. v, z* o2 _5 k, ^
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
2 f& p* ?9 _( o( S9 t& d
6 j) {$ j: b4 ]1 L. V
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
v# i7 G# _, ?* I9 n
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
5 C! K0 v1 p* b5 b8 h1 o
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
$ X& `% o- V( e7 e" N6 t0 h% Q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
7 O2 p* T; E- L, u& ]& }+ B. N
6 j' N# U" u9 C! c9 L
CSR = 0x0000;
' t9 Q4 s3 w4 B- l/ p
INTC_INTMUX1 = 0x3d;
, V- ?& V0 [, \; t* }
ISTP = (unsigned int)vectors;
. m1 p- U% s# O9 {7 G% J$ j5 v) {
ICR = 0xFFF0;
+ ^. @( A- l' H1 I
IER |= 0x12;
: ~8 }* H; \# u2 Q2 s5 P
CSR |= 0x01;
# q; o! R) ~) R9 |# D
3 O9 | m, H) Z0 a3 }
8 t. P5 w- l+ c3 ]* j6 ?
4 {: t" O* n: ]7 \
还有就是两个输入输出函数:
' {' U- C: J- [
void output_sample(Int32 out_data)
/ Z9 z# Z5 v, i# v
{
* L8 k7 o( T: v g
AIC31_data.uint = out_data;
, q- z) x- N1 Y! P7 N) l2 C
MCASP1_XBUF5_32BIT = AIC31_data.uint;
" H, _, U, r2 I A7 h+ r: k
}
! N& K0 ?. W1 u( o" T7 h
; R0 Q" Y; e/ P; l8 M& n
Int32 input_sample(void)
1 \: S% T, z5 d* d+ a4 R9 ^
{
4 z7 \8 W0 [+ d) y
AIC31_data.uint = MCASP1_RBUF0_32BIT;
0 ]$ I* Q8 [# s/ [
return (AIC31_data.uint);
" o4 d: {8 V1 Q+ d/ k
}
9 _# K2 O" o- b' z( I
5 G0 k* `, C) B, C+ w* w' F N
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4