嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
: h$ l1 V' v: m7 O: H
main文件:
9 o' R: Y! f% v: t, u
interrupt void interrupt4(void)
1 t4 z# C% V3 ` P6 Q; U8 n
{
|& {% [3 ~" ~4 ?% {
Uint32 sample;
+ \8 i4 K' T: C! F) B
8 x& U3 ^) Q4 ^8 E( z, q
sample = input_sample(); // read L + R samples from ADC
% |! e4 A- o, {1 w$ o
output_sample(sample); // write L + R samples to DAC
3 O0 r$ O" p6 j2 H
return;
5 b. ~- x4 w. C% w- x$ `
}
- c4 m" O1 H0 y5 N/ _
# |4 ~1 t- L$ w- I% S
int main( void )
' o0 ?* P/ \( c
{
5 N" a( M# a" ]) F' y9 e
: R( b) s K( q6 J
/* Initialize BSL */
& U9 d& N8 |0 s/ W' X- p% U
EVMC6747_init( );
% w; p2 I) K4 o& U% d6 j& J6 c
/* Call evmc6747_intr function */
. x2 y0 @0 k' q' K8 @: n
aic3106_init( );
7 f( V3 R: ~2 J$ w- c5 r0 v6 Z$ P
while(1);
- }& K o. _' l4 P4 d7 M
}
. G) K* h+ ~) X" ~; V
H3 |& f! |8 @4 j) ~; U
; T4 ]' ~; \' b- G- C5 Y
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
2 p" f. T$ L4 l
/* Initialize MCASP1 */
1 }: u) n1 H1 O) a/ ~
mcasp = &MCASP_MODULE_1;
/ \$ u q5 `5 j- \- R
mcasp->regs->GBLCTL = 0; // Reset
( g9 H: A5 ~' Z) L5 q# X/ g
mcasp->regs->RGBLCTL = 0; // Reset RX
2 u9 U, b; d8 \' f( o
mcasp->regs->XGBLCTL = 0; // Reset TX
" N2 m; G# U: z% @! S- b
mcasp->regs->PWRDEMU = 1; // Free-running
$ K3 R( I! U! y0 C$ v1 N) A5 K
// configure McASP0 receive registers
! F9 f+ b5 a! E; B% y3 x8 S" l
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
0 I: Z& K1 x {; S
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" `( ^5 H# @: E
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
% U8 N- E; Z: h$ ?7 ^
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
$ _1 H8 Q2 l$ g. c! b2 Q1 C
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
% }, i. O) K4 T3 O: O: X
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
: ^6 m* C0 u/ ~# L* R O
mcasp->regs->RINTCTL = 0x00000000; // Not used
7 ?, H0 ?6 K9 [4 w: m
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. N% n6 x7 X) Y; W, X: v( K
" p% H5 P! K$ T& N' l1 l8 X$ I
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
# R2 S l" e8 {- M6 C
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 y) A8 v1 b3 R& S) ^9 {5 u+ E% ~
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
1 ?1 X3 o: {4 }) B I: I8 E3 G
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
, N) F. S; g% @( R+ ^
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
- }# p9 Q0 [! `, _
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
: n5 w! K7 l `; ~ }: Q
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
& P& O" D4 s: {( y7 a' e1 e0 |
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 E$ \0 x7 a( ~/ }0 \
0 G, N9 I9 D9 y; q, |
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
; u k; o+ n2 {2 T& u$ Y
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
: W% i6 B, z" e- K9 \( {( M7 H
mcasp->regs->PFUNC = 0; // All MCASPs
' l5 F& E& H4 b6 R$ H7 Y
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
' C5 z0 m: ?; m6 w ~, q* i
* v- g( l g5 `" C6 Q
mcasp->regs->DITCTL = 0x00000000; // Not used
6 d w. U8 C" X& Y! n
mcasp->regs->DLBCTL = 0x00000000; // Not used
% V; h2 e' o9 `* t
mcasp->regs->AMUTE = 0x00000000; // Not used
& k/ U( k ]1 ?- x
" K, `+ w3 z* o5 C; ?9 w
/* Starting sections of the McASP*/
, w- P2 D, {- m2 r" Z$ ]+ t/ |
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
* O) J7 S2 s. X& Y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
4 t Y- W. \8 f( S* w: Z- l
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
" E0 J: c; S& n* u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
2 G0 f. _& H5 j
: J# e" h- F6 Z- H
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
( _# D. M/ b3 j( h
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
( {- W) S7 e; c6 A' R* S: l
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
) }3 x4 `# q4 Q1 K S
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
! h( D( H* f. P8 ?9 F: M
+ Y6 c% U8 G7 X$ g4 K/ ^
mcasp->regs->XSTAT = 0x0000ffff;
! } J5 J6 H3 f0 [" e
mcasp->regs->RSTAT = 0x0000ffff;
1 V) M( Q7 W3 L& X# Q0 L* i
" Q. @3 q6 d& ?& `% A; k1 E2 N
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
+ E& K: v% g# L* u8 X9 Y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
9 }& z, Q7 M& R& w& ?
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
, ]( h8 {+ h3 J" z! u+ Z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
2 v. f. o3 _, }# V5 J
" ?$ [2 [" W5 {& n* A8 c
/* Write a 0, so that no underrun occurs after releasing the state machine */
" l' j$ @- X0 {
mcasp->regs->XBUF5 = 0;
7 v$ _3 p6 k% k9 E9 ]$ U
mcasp->regs->RBUF0 = 0;
$ c+ H. J$ c7 \+ |" y
1 h8 {9 u9 q: ]/ |1 j) z
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
& I# ^6 b5 g1 }/ {/ D0 i- X R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
1 ~ u) j- l& z. m! [: f9 d
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
% ]) w* E4 c7 e' m& O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
3 C( D% {, [8 M. |6 y$ {
' d9 p* ]) W9 ^6 e1 m
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
# X3 D+ i) O5 p( W' n& X
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
# m8 N. m* p6 i l. `8 P5 b. }6 \6 n
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
- \% R( O& G. [1 ~3 W/ _* l, l
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
}; o: |5 X% x2 `& i5 E) t
! H# U' l8 e( N; a7 \4 V! e0 M
CSR = 0x0000;
: f s9 _- w$ A% T9 r
INTC_INTMUX1 = 0x3d;
" j' W, T0 O8 w- l8 G; O
ISTP = (unsigned int)vectors;
F" C. [& k" g0 F
ICR = 0xFFF0;
M* S' o$ Y* V+ G7 `
IER |= 0x12;
# G- \. \3 y6 G6 S) a) p7 H9 q
CSR |= 0x01;
3 r$ c/ Z7 ]0 O! q" D( Y
) k9 M& c9 t" Q4 L/ f8 B* B/ \
' F+ R; U; S5 y% Z R% F
7 ^- \% O! J" H, Z- x9 `
还有就是两个输入输出函数:
5 D: [ u5 L+ b
void output_sample(Int32 out_data)
* h8 D' G# \. i6 W0 `9 p, {' J
{
1 Z. E3 }. q3 k
AIC31_data.uint = out_data;
% d: t! R2 ~9 W3 O. F. z
MCASP1_XBUF5_32BIT = AIC31_data.uint;
) y' J/ `3 G1 r. c V$ y6 @+ X
}
/ }# z+ r# J; R' i j& T# v1 L( D
8 ]5 W0 F6 i0 ?* X7 |& j* H
Int32 input_sample(void)
9 \$ o+ _5 f u
{
" P' V) U" v. c
AIC31_data.uint = MCASP1_RBUF0_32BIT;
; a0 I) q) Z: d5 Z
return (AIC31_data.uint);
/ I5 w1 y$ e* {. d. @7 Y$ ~" f% {/ Q
}
- |) ^- L+ d: o H( ?
7 k$ G9 U% Q" ^* b
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4