嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
2 d" P/ ]8 [* i3 _3 h( `/ w9 P2 d
main文件:
. Q# L% S& w M5 H2 k
interrupt void interrupt4(void)
, X; R; R8 c4 M
{
3 X# Z2 A$ M+ U% D, |
Uint32 sample;
4 o& o6 J9 D6 X
0 f T: m) M" C
sample = input_sample(); // read L + R samples from ADC
3 z5 A- x+ Z& |6 V+ o2 A
output_sample(sample); // write L + R samples to DAC
2 u/ q; o; V$ I# y% ?0 {# }
return;
, X/ j5 {) }( R3 n' V5 b6 [
}
8 r5 I& V2 Z3 X- ?! J
8 Q1 Q1 l! s( M d3 y
int main( void )
' E- V# r) ~% }8 j
{
) w, H6 J. Z4 w8 T) m$ ~, o7 T
4 t1 ]) ?. q3 Y5 V4 L# V3 l
/* Initialize BSL */
, \" l+ y- x! N6 L% x0 r* N9 @
EVMC6747_init( );
) w# M) Z% b6 U9 m
/* Call evmc6747_intr function */
' d" l% i3 y0 A* h! q) a& {6 Q
aic3106_init( );
) O4 d. f* L' c; w: c" K: ]
while(1);
5 q6 g1 L& Q/ K
}
. K p I" r% X! }# m0 D0 b6 Q
5 P3 F7 R$ { ^/ Q' v x
% L$ S$ e' c0 B/ j$ P+ Y
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
+ q+ l N* R9 }# x/ N
/* Initialize MCASP1 */
: ]" v% n Z4 O) v5 s
mcasp = &MCASP_MODULE_1;
' m$ U. [* [- m, Y, C0 l6 M
mcasp->regs->GBLCTL = 0; // Reset
" \# Q( V D _
mcasp->regs->RGBLCTL = 0; // Reset RX
! L+ q, A9 B% d0 D) P, `
mcasp->regs->XGBLCTL = 0; // Reset TX
! J, W! Y! E: T% p! p% l# t. v) @* c
mcasp->regs->PWRDEMU = 1; // Free-running
5 @! t( {; D" @" _( Y% q2 ?8 ^
// configure McASP0 receive registers
9 }- z0 g3 J( I6 d* J5 ^
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
k3 u* _; c8 G, R& }+ W
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 w `% D8 U! t& ~! s9 ]
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
+ X% _4 o( U3 L8 a( N! O0 q, K
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
2 I3 l# L2 x* {
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
i# U/ q# f4 O6 w" q+ G6 x
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
' }' s, X( h2 }( L7 w* e
mcasp->regs->RINTCTL = 0x00000000; // Not used
1 a5 g2 W7 r+ X3 M; i" j
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
' P' \$ m: Q* _
5 T0 ^& l8 `( v, I
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
5 T$ F& }3 l5 |) O! B* m" H
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
( I8 `: ^+ a7 j
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
$ W+ [- ~9 [) C
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
9 I: w7 p& \* I; v) {7 d
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
: H# \7 D8 T) I6 i2 N% M
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
9 p6 s; u2 a! v( }
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
! F F- P! }8 w! ]) ], ]
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 s6 Q0 i- |3 e8 y2 {% T
3 p3 w2 [: X& f1 d* Q
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
e% t0 _* @& ~0 b
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
* W2 m0 b" K; n) P9 m
mcasp->regs->PFUNC = 0; // All MCASPs
% Z& M7 c% `8 q; S2 ]- T
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
7 T. c8 ?2 W) i6 ?% W3 k
' g1 B' T* V( |" ` ]8 d" {
mcasp->regs->DITCTL = 0x00000000; // Not used
! c0 o8 x7 j) l3 D! D! H
mcasp->regs->DLBCTL = 0x00000000; // Not used
9 t; ]5 D: R; y# x. v- a+ l
mcasp->regs->AMUTE = 0x00000000; // Not used
- Z, F% W: Q1 H% O, H8 l
+ l: ]! }! y& `2 b* C
/* Starting sections of the McASP*/
" i" M4 H% i- r% ^- |
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
$ F0 W' j( C7 I$ p6 r4 Y/ Q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
6 v+ D: P& ]$ Z3 i7 {8 ]
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
- P1 B, E* k! {3 I% l" @
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
& j# {5 \ `# ^
/ Y# h8 M) e+ j
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
# E1 M n) Q! ]
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
0 R7 P" z6 H$ ?: l( p3 K/ }+ `
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
# u8 i- `7 G1 L0 {
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
* |- p" `& H; Y, ?1 h8 o8 ?
, o, k/ b9 k- e: v4 i1 M) v- L
mcasp->regs->XSTAT = 0x0000ffff;
1 A* G! `, W9 d* T
mcasp->regs->RSTAT = 0x0000ffff;
8 P( d- q D- F# E' C( F; Z
+ N8 B* }4 U* \3 o& o+ P4 Z" x: }
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
/ x$ C, n f o9 X7 G: w4 M# @0 K
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
9 b. d6 }( L$ p9 }- |
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
3 p% ]2 x, |1 M( p0 V, \: a
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
8 ^) |7 ~+ ^' K5 |1 _" l
4 D6 [" K* [% z9 Y
/* Write a 0, so that no underrun occurs after releasing the state machine */
N: `8 c3 R; O+ R2 Y4 g9 I' \. m
mcasp->regs->XBUF5 = 0;
. h) M: T2 |7 \) D
mcasp->regs->RBUF0 = 0;
- A% D9 a: Y8 l |/ H$ J
* x2 x$ A( g4 x4 _* u( ~1 ?
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
?5 y4 w/ ^) I
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
' |) _, U0 A: b9 P" L
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
2 _5 `0 Q9 i$ ?4 f- y( f! `
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
# d/ c+ J) e* G9 W2 W% V
1 |( u) o, s1 I @. O+ w2 k
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
- Z, `% d C$ s; y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
- l2 d9 _0 a% z) h, E% E" u5 A
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
6 s' n. i9 W5 l
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
7 C. o0 r! Q( a, c3 v. A6 o z8 N
3 W* \) P: A% S3 W2 q6 K" v' n9 k
CSR = 0x0000;
$ N) l; s: E* j4 r( ?" F
INTC_INTMUX1 = 0x3d;
% E1 y+ I _* b: Z3 G8 ~" r4 g
ISTP = (unsigned int)vectors;
7 E$ S: `; Y Q! [ Z4 c" O
ICR = 0xFFF0;
+ o! q1 P- `9 u
IER |= 0x12;
4 A S0 J" d3 N0 R. e1 `
CSR |= 0x01;
: `2 x( t1 x/ _
7 T! p- ^; u4 `0 _) `( R
$ @; {/ S1 W5 a, e/ j3 a; |9 Y
8 s. x, z* ], G3 k
还有就是两个输入输出函数:
9 Y# [8 v2 O. Q" j2 e2 V
void output_sample(Int32 out_data)
0 W0 l5 Z! j. @" a/ @$ O
{
* s; U# b1 i1 ^ I7 N5 g
AIC31_data.uint = out_data;
6 N$ ^. d' h% o
MCASP1_XBUF5_32BIT = AIC31_data.uint;
. S& ^. h' @. Q0 V
}
" Y2 B$ }5 ?3 G
' Y' T6 t9 L$ E- V E+ E' |
Int32 input_sample(void)
' J8 V. Z3 R7 E2 P
{
X5 \ q4 G6 `/ N+ H
AIC31_data.uint = MCASP1_RBUF0_32BIT;
) G% G- i. c0 V% [2 d# `0 N
return (AIC31_data.uint);
5 s. f) d9 d. H
}
0 v3 a* `' o- r- u% D9 i y; H A
" u7 U+ \: q; P3 ^+ P. t% L
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4