嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
7 D# o. E4 G2 L$ T6 d P& o5 u
main文件:
2 _9 B$ ^" ]; Q
interrupt void interrupt4(void)
' W, }! ^. K6 t' {
{
/ d6 {. _; X2 N' u
Uint32 sample;
- P( I2 M7 d' S! L7 r
3 ^6 g* ?1 P# P# U/ z
sample = input_sample(); // read L + R samples from ADC
# \- k( a/ n t' \1 L
output_sample(sample); // write L + R samples to DAC
$ O- d2 K/ s0 X
return;
& ]. T5 J7 z* K0 o _
}
7 e9 i+ S2 D1 m; P0 B
9 h, O- q0 y6 g6 @% x2 Y# W
int main( void )
4 t8 e' Y# g7 |% Y' T
{
9 N" z2 o3 ?1 `2 H! Z
# h! V0 [7 g) A! l
/* Initialize BSL */
) C4 M7 t7 A- |$ W( e: Q
EVMC6747_init( );
, l' i; {# S5 \3 d- y. L( A3 \
/* Call evmc6747_intr function */
% g: {! e: d! F; M
aic3106_init( );
8 `9 ~+ D7 V: Y K' u) n5 Z
while(1);
: Y4 H. ^& W* L9 X
}
) h) P/ [4 R% J6 x8 Z: a
# k2 m3 W! g/ T0 v3 t
% X' A- l+ j1 j7 o' ~
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
8 i; {+ C# A8 H2 ]3 @
/* Initialize MCASP1 */
" @5 S5 U9 v$ {. q4 a$ ?) H
mcasp = &MCASP_MODULE_1;
" V1 p( g, H* d
mcasp->regs->GBLCTL = 0; // Reset
' `! F c! d/ _' ~/ {
mcasp->regs->RGBLCTL = 0; // Reset RX
7 O5 ?8 Y; O# q1 n/ a) @
mcasp->regs->XGBLCTL = 0; // Reset TX
# v/ |: B0 w4 e5 {, b8 c
mcasp->regs->PWRDEMU = 1; // Free-running
0 N$ L& E% U" Y/ k' n
// configure McASP0 receive registers
" k/ W k0 H: ~% U7 S6 E4 J
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
: O+ V6 F* l1 N
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
+ g; o& i4 M# L. O
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
9 n: ?; T K1 `5 J, s
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
! j9 W/ [% N% o
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
4 p1 R, w" t8 \
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
5 {6 m& { B! K/ t
mcasp->regs->RINTCTL = 0x00000000; // Not used
" F( R, E4 ^8 w4 m( U$ S
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
" z, @2 a' u- r9 I+ C
$ V: f9 z1 O2 E. M O9 ]
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
& u6 A' C, k: J6 B' S3 g
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ `. a& M7 o# E( D0 e
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
5 P0 i' @, B O. ^& y7 o
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
3 O6 x! G" s3 r. O1 q! J* U( T3 H
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
0 n5 n7 G! p& f/ X$ R @5 U% U
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
1 p: T1 U4 [3 }2 C' {# \
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
8 e1 ]4 S% ^2 s
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: ` M3 ]' T0 J
- J, ~. S8 k2 ] ~0 l' ?9 b
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
8 n( T1 c( }$ N. z
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
" i9 ]! c# ?! V+ Y3 h6 O
mcasp->regs->PFUNC = 0; // All MCASPs
- S4 ]$ I, R( |' |* O3 I( }1 f
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
! u! Y# ~6 ?( B
) u* X/ L, u U3 ]* _# b
mcasp->regs->DITCTL = 0x00000000; // Not used
, k3 H1 U: B8 F' D1 ]7 D3 F
mcasp->regs->DLBCTL = 0x00000000; // Not used
; k# y7 `* O. M. D |% S
mcasp->regs->AMUTE = 0x00000000; // Not used
6 [- S+ K& U* k5 l+ v
. V0 _& Y9 D( S5 @8 _, J
/* Starting sections of the McASP*/
. P; q4 Q# ?0 H3 G& O# n# ~
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
) F e# \; M$ Y+ ~1 m ?
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
( h2 q* W2 h9 l8 ?$ f+ \
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
! ]$ @; \: P( O4 F! S
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
* F, D7 z0 q' l0 H, G# c
2 D8 u# J: l- j0 T
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
5 h7 U, J7 _2 U& d- g! Q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
l! |& S8 i$ ~
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
+ N% A: a$ x) R9 R
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
) Z$ k& H: N+ |( x6 I
# }) x8 K! `4 q( [' }) q5 u4 e7 ]
mcasp->regs->XSTAT = 0x0000ffff;
* f$ ]( k! V: Y' x# Z1 ~( N. g
mcasp->regs->RSTAT = 0x0000ffff;
4 M. p3 P3 `1 W) I- [9 r1 [/ e
9 R& c4 k" l+ k; q9 s k
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
* m& `5 U) I' O
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
/ B. [) A3 f* h+ G: N- O; M
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
" V2 t. L% j" h; r. V' _
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
. o" U! M; p) m( _
- H! I8 U0 B. F# B0 j
/* Write a 0, so that no underrun occurs after releasing the state machine */
' @& P. a0 e7 V1 Q. d: h8 Y5 f) j
mcasp->regs->XBUF5 = 0;
! \6 t; s! L; w6 G8 G- [+ t
mcasp->regs->RBUF0 = 0;
: f1 f5 \5 B; M7 a5 l' R! h0 H
; W1 }7 C. N0 j- _: d# w$ f, b7 [0 {
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
8 _" |4 |7 B8 m
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
# R* ?# s/ ^) o4 b
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
3 K. \* x. P% @
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
- q/ }9 z$ Q0 U1 X4 @
" j8 _* ^* @( Q2 v
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
* I, [2 u+ H x% a
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
% ]. M) e% {0 V* s6 s6 K
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
! h7 j" j* L* k9 Q1 ]4 d
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
# z; _+ x. k9 l8 k
7 g! c3 x- z5 z; W
CSR = 0x0000;
4 E+ T6 R/ q# N. _, f
INTC_INTMUX1 = 0x3d;
1 c9 p4 \+ i! [7 k% J, S
ISTP = (unsigned int)vectors;
0 d8 \' ?) z+ {/ ^. R$ P# }
ICR = 0xFFF0;
) y3 I6 W4 H; R+ O j
IER |= 0x12;
. a4 G ^1 J# S {7 X, r
CSR |= 0x01;
. ?( I( H, l; Q
. \2 b6 l8 j0 a9 o) B
B4 a. q( H. m* {
- H7 D3 z0 q( O
还有就是两个输入输出函数:
/ o" f0 y- j$ F7 K' A! n. R
void output_sample(Int32 out_data)
% c% A0 K: n8 X& b8 S
{
" Q' a" c5 x% L% W M( w( d
AIC31_data.uint = out_data;
! N) w" m. G- t4 ~ `# N) p
MCASP1_XBUF5_32BIT = AIC31_data.uint;
7 J8 R' F. e# r& o& b6 p
}
9 |! d$ U5 ~. x6 O' O k9 p/ c. m, q
; K0 f2 d2 X$ S# I( y
Int32 input_sample(void)
+ L% z: `# O( ~6 V) g
{
, u. _$ |' w8 d/ V p
AIC31_data.uint = MCASP1_RBUF0_32BIT;
: `, f* {! L7 h1 \; L
return (AIC31_data.uint);
" @' ]4 N% Z& b, p' A0 Q
}
! W% @$ L1 j% T$ `, [! B# h2 a0 x
9 j7 ]5 U" W' a$ o$ _
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4