嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
: ?, h% \/ Q- Z) m1 g
main文件:
( {1 K4 T q1 o
interrupt void interrupt4(void)
6 w- I. ~- h8 h2 _1 R/ L
{
7 A) d: N9 p) P3 {) l5 o
Uint32 sample;
& M. Y/ c3 C- j% v
4 |/ N4 `3 B( W' ~- k
sample = input_sample(); // read L + R samples from ADC
" B- o& _" G0 E# |& M5 ]( @
output_sample(sample); // write L + R samples to DAC
( L4 a& ~( a/ I% z
return;
' Y, ?# w n2 N7 n
}
$ r9 k& _9 Q; k9 w. O+ T1 [
: h0 I: O4 v" R/ D% M7 u+ h
int main( void )
E9 P( o/ |# j1 m2 ^
{
. ?! C2 }0 X. @% F: ?; [& u
8 E6 c/ T* M* I2 Q' A! `% F/ L
/* Initialize BSL */
k( f5 t6 o1 A) C! \3 Q! n8 _( s& V
EVMC6747_init( );
9 K1 q2 w/ C/ S) E( ^
/* Call evmc6747_intr function */
) H4 H% e0 u$ R, }0 E! J
aic3106_init( );
1 |+ E. `# i3 ?' W
while(1);
/ h8 t2 F& o5 o$ y) y
}
& @7 V7 ^% {( @0 g0 }
& P7 J3 G' d* Q, V/ b8 I9 K
) J6 m) w0 o! k% d! o
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
E( D; i1 E& d8 a( i/ W$ O/ t
/* Initialize MCASP1 */
6 B9 I5 a( x1 c6 Z9 E( C
mcasp = &MCASP_MODULE_1;
; ~% c' m8 k& Y3 b$ u
mcasp->regs->GBLCTL = 0; // Reset
3 H/ m( m4 I+ o1 C$ S' m
mcasp->regs->RGBLCTL = 0; // Reset RX
: V) u! P, A- ~1 @
mcasp->regs->XGBLCTL = 0; // Reset TX
/ ]4 W$ R+ \% c" e5 J' a
mcasp->regs->PWRDEMU = 1; // Free-running
- Z# y- r6 p+ f8 Z" {7 l5 ]
// configure McASP0 receive registers
7 S# J, P! h T6 M! d
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
" Q4 W# F4 L) r D0 Z% @; L
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
- O) `3 f$ A5 _! J' [9 ~
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
, Z: j; l& w1 Z' d/ d( |" v
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
9 r1 x8 r& E/ s5 T
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
7 e2 k: }+ d1 }/ D
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
0 ^) U4 H3 n7 k( y( m6 d* @
mcasp->regs->RINTCTL = 0x00000000; // Not used
+ `0 K' m) p' `
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
) o; |$ o, j4 P2 X$ l2 j: t* r% T
; Y2 y C) u/ C. Y
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
% m, p8 j( B: l
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 _/ Z9 Z1 e2 S- ?+ `( P
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
6 ^+ i2 ^) }( M/ O2 V" ^5 v$ P
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
0 ?. }( m5 u5 D: ^! K
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
- b! J3 e( z6 [% l( h& S
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
1 t2 `: B3 B2 h0 Y4 I
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
5 F$ E1 O( ^& N. r$ R k
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! m. C2 e, z% @2 o1 Q3 S
9 h5 M0 I7 |8 K
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
& h+ v$ E+ B6 Y3 d2 `& K" f
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
& E& n3 p, O0 l! Q, \2 [% l
mcasp->regs->PFUNC = 0; // All MCASPs
8 c. A9 H8 z0 x1 J# g
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
: L6 [* {( w4 l6 Z+ _
9 Q$ R$ x$ ~: x: z
mcasp->regs->DITCTL = 0x00000000; // Not used
% P; u6 W9 y$ S" b! b& ^+ r
mcasp->regs->DLBCTL = 0x00000000; // Not used
6 m) h- \0 z. Y8 t* n' f8 Q
mcasp->regs->AMUTE = 0x00000000; // Not used
' [! h+ s: _$ J3 y! \0 R
) k$ \$ y& s3 {
/* Starting sections of the McASP*/
4 C2 N1 y% W7 B. L- u0 B
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
- h: a! m, x D' `0 F
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
- Q2 z- G e" N* ~7 u9 n
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
; M( M7 l1 b9 y7 P3 m7 P
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
( j! k0 O6 I) D2 b+ _7 c
/ l$ N2 G, E' q: e
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
8 X% a' I- c% }1 w% V
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
+ n5 p5 J% ]7 x
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
% j, Y# I3 }* B
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
) o. a) r& @7 `# k9 ]5 k+ d
8 f) p; ]' T/ i/ V! T
mcasp->regs->XSTAT = 0x0000ffff;
$ y6 U( L/ }/ Z
mcasp->regs->RSTAT = 0x0000ffff;
) E' v+ O7 ^8 F# D
( y5 r! s O$ u3 U
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
0 Y2 T: b( d5 P1 N1 i8 o. l" W
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
$ V; }, x8 e- s- L% y5 G F, J
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
5 H( M9 I/ ? @
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
* ?' }# b" h: l: z" B0 `
( {5 N" U: x, Y" z$ n/ T# f- Y
/* Write a 0, so that no underrun occurs after releasing the state machine */
4 o3 e" E. {( ~! E$ \8 @
mcasp->regs->XBUF5 = 0;
; D! h8 e! B" Q, K! |
mcasp->regs->RBUF0 = 0;
3 v* ?3 L9 Y( L: l
4 J/ n* V' |: x
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
9 t# U: j3 l( y4 c, C# N1 W
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
# H6 i2 t& S& U
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
6 q7 }0 q! A& E7 `, R' i
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
* m; O4 O1 o2 y1 z5 p% a6 p7 |
Y! `! i# O2 d9 ^! ~2 Z
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
9 |7 D2 g$ e0 X+ q& {4 |
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
, B; ]( E) c: C/ b3 [$ |
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
2 e& i+ N3 U: t/ i1 V
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
. v9 y9 } p2 e) w' Q" ]- H
& |( T% u( V0 z, S5 ]- s8 z5 u4 x1 d
CSR = 0x0000;
5 {1 ]0 J* R/ ?
INTC_INTMUX1 = 0x3d;
3 l$ {) m9 [* ^
ISTP = (unsigned int)vectors;
! r. {$ X8 ?: K) R# ~
ICR = 0xFFF0;
; s5 t) e' W" f( Y P
IER |= 0x12;
* J/ N, x7 O; i$ G, N
CSR |= 0x01;
' v4 W% \& L/ n
& c8 l/ c1 W8 ^& p# B; g) |0 V6 v
. a5 X# X) k3 \+ z% s* d% N# _
# w# M9 Q# M; U" T0 {' N
还有就是两个输入输出函数:
: Y0 }: k H5 Y5 \2 h2 j
void output_sample(Int32 out_data)
( f) F' J( j. [+ _% J
{
! j* K0 ^$ r$ m8 E/ q
AIC31_data.uint = out_data;
9 ^1 U& ?% C. s L) Z
MCASP1_XBUF5_32BIT = AIC31_data.uint;
* d: R5 b, Y( X( v, h6 q- r
}
. P- F. e% H2 V" p+ F/ t
) b& Q A w& K
Int32 input_sample(void)
! [+ ]* o5 }! z# x" W
{
5 r$ `9 Z$ a4 v- e ?8 b) E
AIC31_data.uint = MCASP1_RBUF0_32BIT;
$ q5 `1 G: ?2 N" J. v3 g4 F
return (AIC31_data.uint);
/ q& Q+ n; G8 o& T- j
}
/ E) }8 }% I( w' `, h O& N& X# c
7 R3 x( V5 F& x
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4