嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
( ?# a7 F: @* |4 a$ h
main文件:
1 K# v7 k7 Z" O9 q9 B
interrupt void interrupt4(void)
! I% c5 f; s* R* x) O- Q* L, v
{
% f3 h0 W; \9 \' C9 _* g
Uint32 sample;
( G, c5 b: u" i" c1 j* @
h8 m7 K6 T, k: m. H5 z
sample = input_sample(); // read L + R samples from ADC
4 _0 t$ P( M9 L4 |* t, ?
output_sample(sample); // write L + R samples to DAC
2 }7 U7 x! @ c4 p1 r
return;
! _4 D7 u9 |. J7 [* _
}
) C, h7 Y9 R: X o
9 {1 k) p' `5 _3 ~# x# n9 x
int main( void )
7 Y; n6 p. [( U/ N5 a# o
{
4 d+ m+ a& }7 S, U* s' v1 c& ~' I
+ h* ]) m6 O5 u, h3 R9 G' P
/* Initialize BSL */
/ ~3 K' {7 ^5 E F4 ?7 v: u
EVMC6747_init( );
0 o& ~, C: H% l" t
/* Call evmc6747_intr function */
# K6 v) g$ m0 i* {$ t: M
aic3106_init( );
. U0 m, ?5 S3 k; ]' r: k
while(1);
+ i. s% u1 `" X1 S& ]0 E; x
}
: k0 r) b: \' d$ Y
! p3 e+ M$ |3 K9 k
M G4 @& D# [5 R B3 @2 V# l
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
5 a! i- s+ \5 P4 H: p
/* Initialize MCASP1 */
$ g( g: L Y; c( T# c
mcasp = &MCASP_MODULE_1;
# t. Q1 v( {& |. h# X) y: q
mcasp->regs->GBLCTL = 0; // Reset
' ~8 t+ r- ]+ S! v v3 T
mcasp->regs->RGBLCTL = 0; // Reset RX
T7 B( o/ M5 g6 H' ]$ I" b! z
mcasp->regs->XGBLCTL = 0; // Reset TX
' a- S7 q$ J v& j
mcasp->regs->PWRDEMU = 1; // Free-running
( S* ?- ?, d! d
// configure McASP0 receive registers
. T! N F+ {! _( z6 n
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
6 _/ r9 t( w* A# G: p' V2 D
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; t5 J& U0 {, K0 g: e' W$ L% }
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
9 U/ l& P& f- u) i
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
+ s, y1 z5 ~- a$ a' W
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
5 p X2 o$ Y$ W( l5 S+ m
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
3 e" {- h2 i! M+ D3 ~
mcasp->regs->RINTCTL = 0x00000000; // Not used
' v) e9 L, n( s
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# S/ q5 C5 d5 [
* q+ s& x( D& S, {+ k: V$ M
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
/ H6 F. C' g- V i1 T# u* ]
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 c! U1 L$ x4 Y0 q
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
& j* C* s2 |! Y9 \ O, \
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
; c% Z$ m, @ i! z
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
1 R D$ F# @! S7 `0 b% y6 y- P! }
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
! j* j, u8 {! n
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
, e9 I! X& n) E
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. Y: i( ] `1 ]3 s
: C: f( h6 S1 {3 R. v
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
1 l- I3 d' T0 ~
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
5 r" z! ^! X! P: L
mcasp->regs->PFUNC = 0; // All MCASPs
0 X. N3 Q2 g: |1 h; d; V' w+ V" i
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
i6 ^+ }) @( c8 _$ H9 ^( R0 Y/ y* z
% E% T# q3 Q" t( R. D
mcasp->regs->DITCTL = 0x00000000; // Not used
9 F& j- }0 w( R8 p- \/ W
mcasp->regs->DLBCTL = 0x00000000; // Not used
, q q# W& W8 Y6 m
mcasp->regs->AMUTE = 0x00000000; // Not used
5 E9 h. A. C `3 H. r4 Y% h, p
/ H: K6 X- G5 \+ r6 v9 r
/* Starting sections of the McASP*/
% i c/ r, m8 p+ \# Z! `
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
& F, q8 t2 Z+ R3 W, m: c
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
+ u+ o, Z6 l7 i3 f
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
4 {2 ?' `3 _3 {" ~% c
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
6 u S& h5 b' }9 Q, R( y
* v& o- I! y4 @2 E2 m+ c
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
" h% k7 P `* m! z- t/ J, F1 T
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
: t9 ^, P+ N, A
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
9 W! C5 _3 y4 g2 e h. h: w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
$ ~/ o2 ~) Q9 p
3 I: r9 k W. G6 N: d) |! |
mcasp->regs->XSTAT = 0x0000ffff;
' Y# \+ B1 M+ ]( K& d$ y0 u" I
mcasp->regs->RSTAT = 0x0000ffff;
) |1 V# g. ]4 H
) P# p2 W4 ?5 m6 `3 L) N
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
4 J4 c, t9 C/ L3 h6 y/ q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
3 F& j! X! c. V& R- F
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
n; K q/ P1 @" G6 r+ f
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
3 K0 M3 L; D5 {' r# l6 E+ J1 D# O+ @- k
4 {) ?8 ~* h, U1 K1 X9 b% s% O
/* Write a 0, so that no underrun occurs after releasing the state machine */
- ^; ?& g4 z+ S3 q! T9 D' S
mcasp->regs->XBUF5 = 0;
6 x5 E- M: N, S
mcasp->regs->RBUF0 = 0;
3 ~$ Y+ U& ~ C
* I7 }- V: t- a
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
4 o: `; P; q" u- l& c
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
! q4 ]% V: P. n5 i
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
, d9 R9 |; L5 R/ E/ u6 l
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
. W f2 j: `3 I) u. S9 e
9 E$ f: z- Z/ v& T9 Y+ p
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
) z( ?+ `5 N% Y' {+ |
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
4 {$ b, d( h7 N! b
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
1 k, v3 w' J" ~7 N* h V
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
( ^4 ~! H; }/ z2 C7 a0 T" ~
: ^+ r$ T. B7 V) c0 ]; o
CSR = 0x0000;
1 d+ ^' X8 B; `5 z) T
INTC_INTMUX1 = 0x3d;
/ i# F) O1 i* D. c
ISTP = (unsigned int)vectors;
+ o' O0 y' E; W( l \
ICR = 0xFFF0;
5 {) R+ e: w; Q, @/ [# I
IER |= 0x12;
0 ?' q5 ]& y# j4 x/ T( t0 U
CSR |= 0x01;
" @; e1 e( j7 Y3 H
4 N0 T. L$ ^0 t2 y( [5 w
2 T8 S3 L! V& p% P% V
8 z; j0 s% ?8 C
还有就是两个输入输出函数:
X. Z$ P: p- \& M
void output_sample(Int32 out_data)
( A; V% k M3 b: a" A2 p
{
- @5 n6 J4 W. s( Y3 P
AIC31_data.uint = out_data;
. ?% m% {8 S& {" P6 e
MCASP1_XBUF5_32BIT = AIC31_data.uint;
& z& i3 u0 s6 K z! ?2 M
}
4 D7 q: b6 [* p4 Z+ p+ }
' K% ~ Z7 z9 H+ k E; }6 Q, R
Int32 input_sample(void)
5 K) t0 X$ l; w0 a9 N
{
4 M9 G1 d$ o- k% A4 d* I
AIC31_data.uint = MCASP1_RBUF0_32BIT;
2 H. \( U8 {1 o6 i# `
return (AIC31_data.uint);
2 R0 C/ r& Q( X* r5 T
}
7 {& \6 |: \; L+ R/ ~. [+ x
+ U1 f# x3 _% p- a5 ^ M
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4