嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
: U# G3 G# [. n) Z
main文件:
% u+ X! r" C6 F, r
interrupt void interrupt4(void)
, S8 A- W. U! |4 M
{
?& T# H7 R" N7 p% K
Uint32 sample;
9 D0 m5 X3 x% S: B. k# L
& U( O, _/ M, j* b+ g
sample = input_sample(); // read L + R samples from ADC
) p8 m' a, g" O6 t9 W; Y- f
output_sample(sample); // write L + R samples to DAC
+ @% i V+ i+ m7 K" t% v1 F) K& \
return;
1 J# X8 y3 F9 f e# n3 q( g
}
/ U0 ?& U4 a+ z; k
1 o( ]- ?6 `' {6 s
int main( void )
. A, d$ l+ O: _ x. R6 k
{
/ `. V8 K$ O) l$ s* H8 q( r8 j
/ I5 i a2 m3 A: d" \- \' k) y+ T) {
/* Initialize BSL */
' i7 f5 h& B% x1 V4 L
EVMC6747_init( );
# I+ `* o) R5 c$ k) W
/* Call evmc6747_intr function */
, j# R# \; K* h3 f
aic3106_init( );
* d% K* G) Y0 f$ @( T
while(1);
* r: i/ C+ S; j
}
' A2 k. c; ~* t, [4 i
7 N {- l. m& ?1 [$ c
7 W( y' y, E. E+ b- B) y7 T
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
" d, i% _0 N6 {+ [" U L
/* Initialize MCASP1 */
! k/ {2 c1 ?& w+ f, j3 p# X
mcasp = &MCASP_MODULE_1;
, ~' S1 p4 Q1 [5 q3 B A( ~( h
mcasp->regs->GBLCTL = 0; // Reset
. n: B2 _; w0 }! u8 T y# f
mcasp->regs->RGBLCTL = 0; // Reset RX
3 b7 K" [. ~6 _( ^0 [1 H) X
mcasp->regs->XGBLCTL = 0; // Reset TX
& t6 L8 D0 K) c' g1 s3 }6 q
mcasp->regs->PWRDEMU = 1; // Free-running
) R, `& ~5 \) Z/ s$ }& f
// configure McASP0 receive registers
" [) \* d6 E8 y7 ?9 n# I
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
& X, c2 X* q' h0 Z" t; c8 j# ~
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
' D. }5 O) C/ f' U/ \& k4 l: z
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
+ ~) z9 {% u, N+ z) r# x
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
. }, Y% m$ v# a0 ]0 P& t& o
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
* P$ C# N7 \$ U- W
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
1 t' O6 E0 C- p! j3 o3 F
mcasp->regs->RINTCTL = 0x00000000; // Not used
. t5 H1 }3 V9 n7 v8 ?0 A: y# z" C
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
3 a# k2 J8 Z* R+ J, O9 d
6 B. P: z1 ~( W5 L5 e4 Y
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
7 s! E! I4 H2 N$ G9 {2 i
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
8 P0 _6 `) w2 q, i
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
3 \9 i/ o: K: x7 ?, |) f J' p2 ^
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
9 y4 H+ y" H, n: P. T3 ?
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
7 A. I& B3 d$ X
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
3 w5 z# K1 K% |: F }+ u
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
) f e+ Z, j1 d# I7 s% `
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
; u0 r8 x) G3 C% z8 O
- q F) w9 _, R4 N4 ^
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
5 ] P* S& i- r4 q9 u/ u1 g
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
1 o3 ~7 c$ h& B3 X
mcasp->regs->PFUNC = 0; // All MCASPs
|# [; f. ~0 A5 c) _
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
9 g% W- _: l7 T) z
6 Q6 ?% K. f# ?7 q4 G9 \
mcasp->regs->DITCTL = 0x00000000; // Not used
4 b' q8 H: Q9 x+ K, _
mcasp->regs->DLBCTL = 0x00000000; // Not used
- f6 b# r3 s- V! i
mcasp->regs->AMUTE = 0x00000000; // Not used
: K4 U5 p8 J$ `0 K/ C
) Q+ u/ }0 v$ Q1 X, M$ `
/* Starting sections of the McASP*/
0 h) `' T) V# H3 {6 V( x% \
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
- K, [; l) c9 ]) p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
" c0 [. A# K2 }. f" j
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
|6 m6 W: E& \& T$ U) a3 b
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
) o% c( o: f c8 r) U, e, }( z! D
; O: c# ^7 R% Y; w, z
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
3 Z" J- z9 ?4 v9 L( {, z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
4 {. q3 \; K% y* P ?. f
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
- |$ X6 d9 \7 s9 I$ x* S/ T+ q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
8 V, ?- Z' K( j$ Q3 w4 |
1 o, s8 @# }# s8 J- G' V- n
mcasp->regs->XSTAT = 0x0000ffff;
, t. f/ e+ k, F! m
mcasp->regs->RSTAT = 0x0000ffff;
! a c- s, a8 |6 F2 p6 \
! }$ B. Z' m! O7 |- p6 H8 W
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
! K# Y1 S- o( j% M- [5 ^( I
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
/ B M4 c- K# p0 O) D6 B+ _
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
# A- v3 h, `* j' W
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
+ r5 C h/ _8 [" E: y' j
6 S9 f$ b( V J, a+ t# t- T
/* Write a 0, so that no underrun occurs after releasing the state machine */
0 e, E- W3 ]+ z& H# ^' I# M
mcasp->regs->XBUF5 = 0;
, |& @" }' D( ~/ c
mcasp->regs->RBUF0 = 0;
/ Y. _0 D2 ]9 R+ J
. u9 y: J! i0 Y7 L
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
; M/ K3 @' B" I, ^# J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
/ }9 V1 d; d; x7 q& h& \. U+ M
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
, c5 Q# w' i, b" x( O- J' w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
; ~4 J3 Z7 n& R
/ R8 F# x! W7 L p
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
# s. Y! p' S# P2 d( ^6 S& q0 }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
8 G3 u. T6 c$ `7 ?1 v
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
[ C1 G7 E# j
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
* z. G# |, q% ?$ K
- G& A9 h _' }( c m5 {
CSR = 0x0000;
& r2 r5 v: H7 U# E
INTC_INTMUX1 = 0x3d;
2 {. H. P! I. K3 U6 z: _ |4 o
ISTP = (unsigned int)vectors;
$ x& ^$ o( i) v2 k; c$ W5 [5 G
ICR = 0xFFF0;
% V/ ?. Z' k' N& ?+ _) R1 p
IER |= 0x12;
# a9 ^3 U4 Y2 U! d- R0 f
CSR |= 0x01;
' n, p5 v4 W5 q: U5 g
4 {0 v- L) y# H; E' d
2 `. L; K+ ]% ?9 ?$ D$ a
8 T. M% N0 i0 p% W
还有就是两个输入输出函数:
+ z4 C! A* A. n7 V; m
void output_sample(Int32 out_data)
) f: G: ~& h5 c/ Q. y) [
{
) n* k9 u( R+ n. v9 W- M
AIC31_data.uint = out_data;
( a D1 e0 e7 F- o
MCASP1_XBUF5_32BIT = AIC31_data.uint;
* o" g! h" o. I+ p) v- z' t
}
1 R% Z3 q) R- S, Z) N* T
p/ M" S$ N- \8 h+ z- x
Int32 input_sample(void)
/ C+ L0 \' q; p0 p( e$ E
{
3 j# ^- P4 S* }/ {( r3 ~
AIC31_data.uint = MCASP1_RBUF0_32BIT;
1 D& B& s8 ~( y, o4 o0 s/ ^) ]
return (AIC31_data.uint);
" s/ j# g3 m# K2 g
}
- ?; Q; P+ b- {2 I/ {
2 ]- g( p2 H6 _+ N/ j
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4