嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
, ^# B' h2 s0 h) m1 C! ~
main文件:
m8 R8 }& p. |, e, ?5 q
interrupt void interrupt4(void)
- @7 Z' ^/ ?2 Z6 R
{
" w3 f- I C* r$ P5 }% O
Uint32 sample;
8 d1 z1 b" G( G$ x K9 N0 v! x8 k* C
7 g" A. Q5 q7 s9 p$ v# C5 l5 g
sample = input_sample(); // read L + R samples from ADC
* D% i* Y3 @5 n" A" H; |% |+ V2 q1 A
output_sample(sample); // write L + R samples to DAC
. }/ e% ?& k. @6 Y
return;
( \$ L- w5 c/ p% |* Z
}
3 g4 [+ s# \! O) F2 a
+ L) J/ n" f2 ]! S" d( R" m
int main( void )
; z2 E8 @- x" R1 S0 p
{
| B, l; |) h6 y
9 m5 c4 d" O% E" {
/* Initialize BSL */
% u/ F0 I! B4 M! V- f8 B7 s" @
EVMC6747_init( );
1 j( }9 v5 z9 B
/* Call evmc6747_intr function */
' b) x: d/ \+ G9 b1 P
aic3106_init( );
i. Q7 R' A7 b& ^( m
while(1);
9 v- Z8 X a/ P5 M$ d1 \
}
; @5 g& Z1 s9 \6 D2 h* C% F
6 L4 C# {# o1 H% ~% y
; v0 |! L; q7 i) [5 Y
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
7 V/ Z; S3 l* |. l! S6 K1 ?: u
/* Initialize MCASP1 */
3 w* V. Y+ F# z- P6 [2 E3 a0 g) y
mcasp = &MCASP_MODULE_1;
+ y) \1 o- K- K) K; j" ]1 ], ]7 ^ [! M
mcasp->regs->GBLCTL = 0; // Reset
# P, w; ~0 o2 d: v
mcasp->regs->RGBLCTL = 0; // Reset RX
4 S0 R# c- z' c3 N. v! j
mcasp->regs->XGBLCTL = 0; // Reset TX
8 u; y* v6 ?) @; X9 H" S
mcasp->regs->PWRDEMU = 1; // Free-running
5 c+ X, w1 K& t/ ]3 g2 ^4 T) ^: }
// configure McASP0 receive registers
2 X! w( j4 u% ?6 N, Z
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
8 @1 `- l/ p8 Y% T% M( p
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 l1 K* j! X6 i' K+ H0 O6 W$ s2 A7 e
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
7 R. \8 ?7 m! l) F4 r$ \$ i# \
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
( ]2 C( ?6 U2 N% ]& {7 [
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
! Q# Q) z9 q! }/ H+ P: o
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
7 b+ D7 S2 d1 _. {6 s
mcasp->regs->RINTCTL = 0x00000000; // Not used
' T/ {0 C7 o; j+ f/ N2 h. Z
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
$ Z, X% f4 V, m3 y, U7 \
/ J) b3 ~5 h$ a! E
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
$ {& Z9 y- j/ N6 N) |
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
d( l* m, e z3 H$ K
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
& [2 S X3 J; k. x |: G% H
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
' F# d( m) V$ Z; z! R; r8 ^# ]
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
- V, _7 P; B8 t1 c1 G% F. ]; L( k
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
7 Q# j9 n, \5 D/ W* \
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
. |, o% _7 F7 e+ z) U' e. V
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* K, i4 S! n7 E! @6 U% O4 s
# [* n! @3 w a
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
" n7 H0 ^/ R7 } @6 p5 ^0 k, t/ m
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
, o. p; h5 ]: P0 X6 J
mcasp->regs->PFUNC = 0; // All MCASPs
; c% \1 n) y2 D6 J+ S7 x
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
! I) V, A2 t7 d- P) d$ Z$ e9 U
7 @- L8 k( y6 W1 s- q7 b
mcasp->regs->DITCTL = 0x00000000; // Not used
7 r: I5 y( B& x. x; J4 |
mcasp->regs->DLBCTL = 0x00000000; // Not used
7 t3 P( `( o1 v0 ?
mcasp->regs->AMUTE = 0x00000000; // Not used
" |: {, v1 n8 L; e( i
& ]: {7 j3 ]# u, ~' G5 l
/* Starting sections of the McASP*/
% X! D. @. f4 s" ^) a
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
; X3 q. ]6 u! i7 x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
+ H) N/ f: T8 v% R7 A9 M& G
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
6 T1 B! I1 j3 @$ g
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
0 r8 o, M' N. f0 Q. a1 C
z! o& b! ^. X$ x
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
8 t2 H) U9 U! T; k) e; l! d
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
8 c+ A1 W2 C5 c# e, N
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
' |/ o' l4 [. _5 C. i6 r
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
W' X6 \6 y" Y# V8 Z
% v! r% b) t& F1 O" r7 K& j
mcasp->regs->XSTAT = 0x0000ffff;
7 b- p2 T1 r" F
mcasp->regs->RSTAT = 0x0000ffff;
, r( `/ C1 g7 p7 l
; E4 i) P7 z- H, _3 L% O( f
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
: l [, u9 C; V8 r3 z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
; K5 r3 J+ H! j$ u
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
3 j4 s1 t* c3 n" n; I
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
/ e w* n7 n' t: [
$ V9 H& K+ f5 m# B6 N1 I
/* Write a 0, so that no underrun occurs after releasing the state machine */
, w' U i: f. i6 v p9 \% X" ?
mcasp->regs->XBUF5 = 0;
* W3 K5 D" j+ v% P( h$ I5 U
mcasp->regs->RBUF0 = 0;
) J2 V' f" J5 N
9 f2 D5 w8 b( h
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
7 q0 x# |5 _4 c/ x3 D
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
3 `2 t& [/ x# d. Y" b: h7 L; z
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
7 Y( d2 }6 ~6 n5 Y2 ~2 }' o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
0 I4 d: F, O6 b4 X
/ Z) Q0 Q! D. L3 {3 ?* m
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
0 S9 {; x; } @2 v$ ?0 [. q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
( Z0 o- F" G- c6 _$ ^
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
- t/ L$ j1 Y1 V' z# M$ J; p
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
+ X5 q" Y2 e! }" d @4 ^3 u
% T* R3 }; |7 h" U6 ^. J6 V
CSR = 0x0000;
' T+ h } f" r. a
INTC_INTMUX1 = 0x3d;
4 P4 E. k8 t N) K& V/ n
ISTP = (unsigned int)vectors;
2 m* e8 p) U0 [
ICR = 0xFFF0;
" Q n" u; z9 ^3 l/ S( p
IER |= 0x12;
# P* ?! z& d' r) x/ m. I
CSR |= 0x01;
: C$ u- A5 Q1 e& D
, s/ X& R9 i7 g* s$ `2 E V
# F! m; ~9 X4 U* b
2 M, D( \4 C! `* m
还有就是两个输入输出函数:
" P( m( R# M! @& ^
void output_sample(Int32 out_data)
+ a' a6 p8 L6 N( ~2 T, A
{
9 n8 L! g4 m. D4 _, ?/ w& f
AIC31_data.uint = out_data;
0 u+ L& D3 L* z3 I9 ]2 k7 B/ i
MCASP1_XBUF5_32BIT = AIC31_data.uint;
% T( C$ y% ^% U$ r
}
8 [2 O+ s& _& Z, y4 B/ `
$ O. z. h) A. y+ V
Int32 input_sample(void)
) W8 d$ |- M3 G6 Q) y* X/ M
{
7 s- u! Q/ J* g% z- B! E
AIC31_data.uint = MCASP1_RBUF0_32BIT;
* ^; a/ W7 w& h1 z3 i
return (AIC31_data.uint);
. r. o6 Q9 M' c: C
}
7 O7 n1 h5 ~; G
( X. c8 @# v; s
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4