嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
& q( l/ N. g' ]' [4 W
main文件:
- L! i9 V( j. ?& e
interrupt void interrupt4(void)
) R7 }0 R3 y: H, ]: I: b8 ]
{
: w3 L$ e# z! s( }- g; a* h
Uint32 sample;
z7 T4 o5 V. l4 H1 [4 z/ e4 n
- r- n" O% U* a
sample = input_sample(); // read L + R samples from ADC
/ h+ Q; @! m1 M X% k" W
output_sample(sample); // write L + R samples to DAC
6 ] W, W' K2 Q# F7 r
return;
! y& p0 v5 ^% {8 S( l7 `
}
# {5 q9 Y6 s+ r; q
' r0 \' T, ^7 C( F
int main( void )
& L0 g; c$ G7 }' @$ P6 H
{
: D" e; c) ~: }5 `+ Q, X& V+ h0 Z
0 y% o5 f2 F( q* G: V( X: D
/* Initialize BSL */
9 S) {$ C, A1 m1 C* X2 ~" K
EVMC6747_init( );
, {" m/ d; F3 q5 V0 K8 \! W' c& e. p
/* Call evmc6747_intr function */
0 t9 i. c8 M9 K9 H! q/ j! Y2 \
aic3106_init( );
5 ~# K- E5 w* q2 M" h
while(1);
. U' R# g. y: o( {
}
8 q$ R: I3 k3 `' f2 J) L
; C7 x6 K7 v) e1 B9 i
- E$ i, W' [4 J6 V/ N. n$ F) r; a
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
( D' ^& d0 ]' q( W# v" v
/* Initialize MCASP1 */
& G& a8 D. Q( F- j! ` R
mcasp = &MCASP_MODULE_1;
- d9 Q" ^: F" U2 t
mcasp->regs->GBLCTL = 0; // Reset
2 B4 F Y) L6 Y5 k; Z+ K/ {
mcasp->regs->RGBLCTL = 0; // Reset RX
8 L( u) z0 X6 s. B, H
mcasp->regs->XGBLCTL = 0; // Reset TX
& {. g3 j2 g- w/ z8 a
mcasp->regs->PWRDEMU = 1; // Free-running
. `( _, d/ _5 l. @3 D
// configure McASP0 receive registers
0 k0 d& ?$ F3 r+ m5 I
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
" [# ~' A% N4 X& s* C3 G8 q
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
+ l; K* F, O8 o( @7 s4 a. O
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
8 Y, z6 O: |0 W, [. I
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
1 H" v! ?5 R1 G. y( `4 g
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
1 b) ~. F5 Q' _/ X
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
/ U, Y X4 E# c
mcasp->regs->RINTCTL = 0x00000000; // Not used
" V2 R& v" L+ H5 O: Z1 O* K; r5 }
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: v8 m8 L3 t( M' s. K
7 {3 N2 p4 ~- H# D# X$ d" y& j
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
! e) U- F; M' ^
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 g8 V( @) f+ n4 f- \
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
: J4 E. F, j; U; ~, q8 }9 V
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
; _; A+ W9 F2 @+ k
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
" m/ z3 M, h7 o# G0 u
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
1 I1 F/ Q7 e: T, V D$ A# r
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
$ W. j( H' `5 f3 r5 N
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ @* Y( V' }) u5 {5 d6 J2 i1 T4 h
% a# m) p9 x- _9 j1 N w3 ?
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
, \; t% k$ h1 |% ?
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
9 S( `) Q; D$ |9 Z7 w
mcasp->regs->PFUNC = 0; // All MCASPs
7 Y: Y( T% W2 }- h8 L
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
' \) i9 Y% S( b" M
2 k9 X. v+ ^7 |1 `& z0 W8 D+ t
mcasp->regs->DITCTL = 0x00000000; // Not used
$ w" y/ l" R6 d" X9 M" i* U
mcasp->regs->DLBCTL = 0x00000000; // Not used
) p# j2 y0 f" n$ I5 m" C0 x+ q3 O
mcasp->regs->AMUTE = 0x00000000; // Not used
: M0 |; ?% f. M0 m5 Y* `8 K: P
j2 F2 ?6 n, }
/* Starting sections of the McASP*/
7 m$ v$ O% T. m- f" y4 {3 ?2 P
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
[+ c: d& m; H. ]2 b; _2 Y$ _* u4 H: K
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
& P; Q% T' c1 c: h: ^( M2 G7 H
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
/ B. K$ \1 ~8 T( I+ E) ?" ~
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
4 o Y4 b* P: s8 G$ i' H% @7 I0 |0 f
( _2 `0 v/ L' z q0 F" [" H: t4 i! K1 ]
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
9 B5 D6 y4 ~/ i6 Y- t6 v' E( G
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
( K8 O$ _9 K% G& t
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
3 x9 N% W2 c7 R9 q; k$ ]4 O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
% D' g& L# C# i0 X
) t, y x0 U: x+ ~$ [
mcasp->regs->XSTAT = 0x0000ffff;
* C( V5 k1 B+ c0 L+ c
mcasp->regs->RSTAT = 0x0000ffff;
. K* o0 Q; V5 q
7 S1 z% L# _# Y+ u7 I' o$ W
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
7 a* l% f( r$ H' m5 S" n' i0 U1 a
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
7 Y- r3 R5 q6 I1 }
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
/ z, h. ] t0 F
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
1 V* L/ R' h: L7 I& @' `) G3 D
" L; \* I: X0 x% ~0 z) D3 O
/* Write a 0, so that no underrun occurs after releasing the state machine */
$ m2 H" F: X0 y
mcasp->regs->XBUF5 = 0;
/ z' D1 k* G/ `/ o) V! N
mcasp->regs->RBUF0 = 0;
; p7 A9 B. n ~% O/ M6 t
# N' X0 W/ G/ q+ h' e2 M
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
2 G' L% {1 F' D% ~9 k
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
$ s: e! J2 I3 Y2 o
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
. M6 N1 w9 b" [, p0 m2 k0 H9 \
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
% p7 A2 @1 \- U8 A' O2 }
; R+ z; V" s$ R) m( _
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
0 Q: Q+ `' Z7 S' {6 g
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
9 b; W) m, M* Z. C/ t
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
% e( ]% u+ y9 C/ _' t
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
- X4 i- g! K. W- x) |; ~4 a
5 d: V9 [8 S2 W$ T1 q: n
CSR = 0x0000;
x/ g8 c. p5 d5 {* ^5 X/ k+ c
INTC_INTMUX1 = 0x3d;
/ ] l* `& K; v# O5 r
ISTP = (unsigned int)vectors;
' C, Z7 P. Q6 I. m5 ?; `6 N; s: Y
ICR = 0xFFF0;
8 q; @- ^) w f9 t- n# V! K
IER |= 0x12;
8 t+ [2 a, r" N5 C
CSR |= 0x01;
& v# x& @9 P' l5 T$ p: Q
$ k' ^3 Z7 R3 z5 W) t" Z( S- T$ h
$ }) T( k/ [: m" C
7 Y' E' j' j+ \+ |4 t
还有就是两个输入输出函数:
& }! [3 y! r6 @# S/ L
void output_sample(Int32 out_data)
( }0 u6 y6 U8 c$ m7 g
{
! `# a2 @* `: U* {6 v
AIC31_data.uint = out_data;
/ b r* w5 j3 P( }+ T
MCASP1_XBUF5_32BIT = AIC31_data.uint;
6 |9 k% j; Y! W6 n$ p" n
}
- t' @5 c( w6 i
$ P/ w$ d) b/ q" w$ m1 `) k7 l
Int32 input_sample(void)
; |4 r# U+ @, y7 ] x C# v
{
4 D6 z# Y0 ]- z# [3 j
AIC31_data.uint = MCASP1_RBUF0_32BIT;
+ H5 G4 T* N- R+ B \1 X( I. r
return (AIC31_data.uint);
- J C0 ?2 r$ B L
}
' A5 S7 M8 C; `- q$ ]
, F& _! c6 ]5 m$ a1 u; v3 O% T8 \4 F
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4