嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
8 E; l' G1 Q( S+ X* l: E0 z
main文件:
+ S/ h* w; { u/ E, n1 I: ~( \
interrupt void interrupt4(void)
7 i$ e$ s+ e" ]" B. o" h; N. x
{
! C: B' q& ]) S8 h
Uint32 sample;
; A0 t3 b! _- c5 y3 h5 [
, M7 q2 @* @: m, x
sample = input_sample(); // read L + R samples from ADC
5 t7 L% A3 S2 g
output_sample(sample); // write L + R samples to DAC
" L4 M7 ?4 W! Q2 {. t
return;
. n1 b( B: p; `
}
4 C4 v! _& I. S) M6 ]' J& t
* n3 X) O! _6 K1 ?# q
int main( void )
& k, G: _8 c6 E/ Q# r+ m2 f# l
{
) q6 ?$ l* S! s$ E
: a0 l g$ ~+ ^8 z* y
/* Initialize BSL */
$ K8 k: @* x- p* U
EVMC6747_init( );
% _* {* J/ A4 q$ W
/* Call evmc6747_intr function */
) [9 a; b& n" [$ `" e# T( h' k
aic3106_init( );
N" S* T' M" B2 ~: |& O* U9 |
while(1);
+ b9 [, v5 k2 J. y* k9 R
}
. v, c( d7 X7 n/ D, p A9 m
- H8 R9 r) L9 y1 o, `1 x E9 v
$ Z* g/ B& Q9 o# `- r: W
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
+ n: W! g2 _! y0 C
/* Initialize MCASP1 */
1 e% `9 H6 A8 ~) A
mcasp = &MCASP_MODULE_1;
% n$ u1 [) A1 w" u
mcasp->regs->GBLCTL = 0; // Reset
- R! g' q; Y+ H
mcasp->regs->RGBLCTL = 0; // Reset RX
# S" {6 b4 b* a3 i
mcasp->regs->XGBLCTL = 0; // Reset TX
- p' A: `- }; x# p; O
mcasp->regs->PWRDEMU = 1; // Free-running
, u* l& P! c5 I3 T; s
// configure McASP0 receive registers
) x- [& _* I. e
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
+ @" W# H2 \$ {4 f
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* W% @) X5 B* P" Z h2 f( c
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
# C+ }' G& ]+ Q/ J$ u4 b
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
, z2 z8 u# e) B4 n* n- E k
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
) O; ~+ Y1 N* x& V
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
$ i4 i5 j$ d/ E# O
mcasp->regs->RINTCTL = 0x00000000; // Not used
- f( b+ S" K0 M" p g) w
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
( }# F1 M, R4 I$ o& Y( l5 d# M
9 M. T" _8 A, u) b: i8 V+ ~( f
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
7 i, ?. \2 [7 ?; w9 C
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: L* H% F3 Y) `* e, W
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
7 ]. B" F! @* z( d
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
5 ^% s2 a% o- F- Z) d
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
% K# f- Z+ M1 Y
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
% J- f, N) u2 M# V/ L0 |
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
4 @: N9 |: _) y: `! G
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. Z6 X- T5 k0 G/ A( |% f1 v
& m7 B, k1 F% i1 O$ j
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
1 x4 D C k) P8 C& o1 M. D
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
% ?+ X7 M' b6 z" T' {& a
mcasp->regs->PFUNC = 0; // All MCASPs
9 ^- s- k# P" C8 W3 W0 b e. P
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
" C r8 |9 z3 i0 f: d, x9 O* u
# W) L5 [& e: D
mcasp->regs->DITCTL = 0x00000000; // Not used
8 T$ D$ B( q. \) S5 x" p
mcasp->regs->DLBCTL = 0x00000000; // Not used
4 G$ j* ?9 M% s/ v/ f
mcasp->regs->AMUTE = 0x00000000; // Not used
: {1 U! H% D5 B( _& }( x2 l3 T3 K3 X
6 n8 R/ E: T2 ^$ x9 W% x1 N; G
/* Starting sections of the McASP*/
7 z' f# t2 R, z! U5 ?* D! S
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
& y! j$ f5 v |3 U% m; z* d! a8 B1 v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
9 |- k& }1 T3 |6 Z3 X2 b
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
3 }1 B, p8 i0 C
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
8 ~) B0 c7 G& X `% r$ C* i3 e4 Y
* W+ S. a, `3 Q. B( M! |% \
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
5 g7 Y. O3 d7 X9 f+ L& w- e
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
" T! D5 f+ ] z+ F
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
9 g! Q5 P) X p* V
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
" V2 F$ ^! @5 n8 a3 h
: U7 r2 B; x1 B, C
mcasp->regs->XSTAT = 0x0000ffff;
2 }# i: y& [* Q( C. [5 [
mcasp->regs->RSTAT = 0x0000ffff;
' ]- v0 e" J* [7 g! a3 ~! F% S, D6 J9 Z" {
) Q# j6 {+ y/ w8 H% h
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
4 ~* Y# |& e7 d
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
9 x- A3 Y& Z* ~0 x* i' {- y
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
3 c {1 H h4 e% N0 Y! l& C
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
; x( d& Z2 J' T2 F! @1 z) ^
) I( v4 [9 |' H! ]- @
/* Write a 0, so that no underrun occurs after releasing the state machine */
U) E. ^% [) r4 s& \
mcasp->regs->XBUF5 = 0;
) N' E/ N! K2 `3 W1 g
mcasp->regs->RBUF0 = 0;
1 o0 x& D' Q8 l O5 _: o5 Z4 D
' @$ [) ~# o" O" _ b# M( Y
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
. |( }" J5 U S( E
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
! ?1 s+ B; n+ x/ Y% L
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
% ^9 V9 o! H! d* d, G" ], O5 R
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
. e3 i1 v0 A1 U q% `
3 l5 ~" f5 a7 o3 c A
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
, S1 V: S4 L; B D0 @
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
^1 _, c4 H+ f1 F# C7 X0 c
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
( g6 @! M& f. T y) s
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
, W% {! B7 K' c
9 `: }8 N. {# ?( [$ [& Y; J7 ~
CSR = 0x0000;
8 O1 r4 t2 P7 j
INTC_INTMUX1 = 0x3d;
( a% H$ D% P4 V5 G' F
ISTP = (unsigned int)vectors;
' l: x1 m+ B# F" E5 u
ICR = 0xFFF0;
! H; X( \% G, U3 ^
IER |= 0x12;
% ]4 w/ ~) m& P$ {1 r! _$ t
CSR |= 0x01;
U& Z9 j* w1 p! I
+ X9 T5 e3 u+ G$ R) \/ K/ a# p
: ~' M# v6 e) G" a
F4 P- }& {* l- E0 l; n, P: G
还有就是两个输入输出函数:
' L4 W- k. x3 C5 `8 v) d7 ^
void output_sample(Int32 out_data)
$ M6 g1 _0 {% T/ B5 r" ~: M
{
3 s* g) ], J& e3 v% f
AIC31_data.uint = out_data;
~ E( K2 u9 H4 J c1 y3 }0 `! Q
MCASP1_XBUF5_32BIT = AIC31_data.uint;
: ]5 P: M0 i. a' }- D |
}
& N R+ e! Y4 V
) \3 J8 N+ X7 v2 P# i" y) x7 i/ c& u0 f
Int32 input_sample(void)
$ K2 S5 U$ C7 @$ q, _3 ^4 g3 s5 F
{
- W0 L# c& V2 a+ r! k( W7 d* \
AIC31_data.uint = MCASP1_RBUF0_32BIT;
% o/ C$ c" a, o" Z$ x
return (AIC31_data.uint);
+ j: L ^' @- E/ t- ~3 ]! F
}
7 q+ D! K3 m& o' i4 W; f2 u
x2 D Y* u5 B' C) ?
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4