嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
, ^- w$ Z* S3 {* F
main文件:
# h( |! ?) l2 G
interrupt void interrupt4(void)
' D$ ~% P# k1 W6 t
{
x' X$ }0 f' b P6 Y+ z6 {
Uint32 sample;
/ A% S. E/ ~! q/ ?3 u7 e9 p2 R
- B: Y; \$ S& B* o5 ]
sample = input_sample(); // read L + R samples from ADC
5 x C2 { W: A3 @1 G( ^
output_sample(sample); // write L + R samples to DAC
2 z! K: O0 m* }5 t y* j7 \
return;
: G' Z9 A @/ Y" y7 C& J# a- m
}
7 T1 Q+ Q0 C- d1 Q( J! g8 K5 x
- T) y( p- R {* f" f# L8 U, d6 l
int main( void )
' ^( t7 a3 f( S
{
; X- E# N( F" O
1 ?) G$ F, Z% ^; s9 R
/* Initialize BSL */
( @+ K5 y7 h$ y+ d, e5 @
EVMC6747_init( );
3 ~8 ]8 b* u1 h. f3 } Z
/* Call evmc6747_intr function */
& c7 B- a9 `# F0 r' N# z, J' e
aic3106_init( );
( F8 j# O. R; F5 j& S. @+ I: L( H
while(1);
( o" I2 h5 R$ F6 {8 V
}
8 d: N0 r# G$ I% l% [( {
8 x: m1 ~0 g9 ?3 e
: s. e5 p. h. h; L" W
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
0 `- P! Y/ `" q% r
/* Initialize MCASP1 */
` u% R# W+ _1 _4 t# r
mcasp = &MCASP_MODULE_1;
3 Q5 T' Q4 b9 g) I
mcasp->regs->GBLCTL = 0; // Reset
) R K4 x. p! }! n
mcasp->regs->RGBLCTL = 0; // Reset RX
. Q$ n4 B( _* E9 R$ B8 q" }& a1 }
mcasp->regs->XGBLCTL = 0; // Reset TX
3 \4 B9 Q7 c7 r3 h/ X$ {
mcasp->regs->PWRDEMU = 1; // Free-running
; z- R: V. f$ c8 Z5 Q
// configure McASP0 receive registers
7 } |9 K0 R$ w
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
3 E2 p. F+ L/ a* p) M
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 e1 m6 b. j% {$ L
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
3 z t& P! b+ f! v2 x6 G3 H
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
( A, M! A! o" t4 S+ j+ g$ f- l; o
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
- |3 h; L7 U, R& ~; o
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
L9 C- W) g$ o' A2 Z. t
mcasp->regs->RINTCTL = 0x00000000; // Not used
. R' o0 q0 n X$ R. E* }
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
; \! m/ C* g: n9 {% X" p) v9 |) A
1 T- M- Z( O, s, }# u
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
5 i+ j3 r0 D n/ |% c* ?# `
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" C9 `% e$ s% d7 \* a3 x0 h
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
9 o! h' K; t T8 i" K2 Q' r, c
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
7 i% a' y! V1 l( p" W
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
& }) C- A! |( j9 ^3 a
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
R2 j; x& o+ {3 `
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
" V8 t0 a: g$ U, N' j% z* Z6 S$ Q* i" [: k
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
$ a: u7 K3 P7 L
- C3 u3 h: E6 f$ Q7 n4 D
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
) H" N' t4 w3 v4 b" R+ r3 C+ y% \
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
# l; @( m9 v2 X9 \; ]) h
mcasp->regs->PFUNC = 0; // All MCASPs
7 S; U2 ]' [, c2 _* w
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
8 b0 I8 Y, Q9 M5 ^# k
; x3 i% M* d9 y% M$ S" y$ o
mcasp->regs->DITCTL = 0x00000000; // Not used
, J, h9 q: E; k+ k, }
mcasp->regs->DLBCTL = 0x00000000; // Not used
. d) u, S+ N+ B J/ `
mcasp->regs->AMUTE = 0x00000000; // Not used
0 Y4 I& n( ?9 V0 f5 s. e
/ {$ i& Y. M& w: K
/* Starting sections of the McASP*/
8 O" y5 c0 R& j1 \% A
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
7 D. F! T- a: N# @$ ]: N T' W) _
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
, E' \$ F; ^: B2 k, w
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
3 @0 J- q7 r6 X9 r- ^
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
) i/ N4 d! ]- ~- W
' k- _% d- ]0 e1 q6 m- U/ L
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
( D: x% p; X% m( j! X/ `4 _
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
8 j( ^9 E7 g# u0 M
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
* z2 H6 X$ C5 X9 X. x2 Y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
5 B: o" E4 N# a
/ C7 V" E1 ^; ^; M5 _
mcasp->regs->XSTAT = 0x0000ffff;
6 b: |; L, x) m) b0 r8 k$ v
mcasp->regs->RSTAT = 0x0000ffff;
$ f: S5 o5 U2 y8 C# K9 x7 a# N1 A
0 _. x( @9 X P3 X' ]
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
% f( W* |$ K0 T
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
l! S) z0 e; c2 i) o- Y# Y
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
9 v8 @3 k E, U# U- o% W
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
+ e! O2 V. w* Q2 |5 a8 g
# U1 G) S R3 c2 R
/* Write a 0, so that no underrun occurs after releasing the state machine */
& W+ J3 ? M" F3 x
mcasp->regs->XBUF5 = 0;
2 q" }* W" c! t) d D
mcasp->regs->RBUF0 = 0;
* {: _$ W% d U
& T/ n7 ]2 G8 i+ |
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
, ^9 E& Q A5 S* n, U: \8 m9 z6 v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
8 ^. v+ }+ ]/ E6 W- D' Q
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
; d8 \; k8 W: x/ l4 k
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
9 [* U4 ?* T2 m/ ^* S; I
8 J/ A) `; P. ?9 x' Y) D$ r/ H( e* J
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
; K' A$ B/ ]: R/ ~0 V# {
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
# g' _( N' I' \3 ~' G5 }1 M. c' u
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
2 m3 A) p6 o% Z/ ?5 i5 P
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
6 A9 h! r4 r. x+ Z4 u
4 @, g! d+ b4 w5 [; b6 b# F, l
CSR = 0x0000;
6 N" p, n6 E9 I% z4 w( Y/ D
INTC_INTMUX1 = 0x3d;
$ y$ N6 Y1 |! J9 Q7 V
ISTP = (unsigned int)vectors;
6 ?5 X4 P9 \. q" @1 x
ICR = 0xFFF0;
5 {# H E# n9 `8 J) o
IER |= 0x12;
8 O" ?9 R! d' ~" [ L
CSR |= 0x01;
- J3 {0 R" \& l. y
$ w5 L( \' U; Z! T0 q
4 V6 N: [5 @& a7 D% `% \
! W" n3 w9 F7 B8 q+ i3 c& Z# U
还有就是两个输入输出函数:
p1 T" a. C. y) q; q
void output_sample(Int32 out_data)
% X. j8 @* U9 H
{
' @9 H A$ J0 I
AIC31_data.uint = out_data;
8 S0 R5 o" C( c
MCASP1_XBUF5_32BIT = AIC31_data.uint;
9 X9 y) \* a# }4 e
}
5 {" N) [; ]$ S: v; b( k
. e: [! C: y; Q0 X
Int32 input_sample(void)
. D i, L# K- ]" {" x( f
{
4 O6 Z/ s$ e8 e
AIC31_data.uint = MCASP1_RBUF0_32BIT;
) Q( r/ y& g2 K8 z# @9 C
return (AIC31_data.uint);
" y( B9 Q6 k7 s" B1 v, ?. t5 o
}
: v# y9 W$ Q3 B# }; P# b7 D4 X
% _' F9 z* F* M
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4