嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
( U3 h& _" Z% x* B a* i! {3 l. Q+ ^
main文件:
" G- P1 _4 D% k/ l
interrupt void interrupt4(void)
% ~6 b2 l6 a6 P8 ~, Y
{
* A5 w: E0 o0 {- l# U% P) I
Uint32 sample;
8 W4 ^6 f' |. }! d3 ^
+ E: L" C& v5 X& X
sample = input_sample(); // read L + R samples from ADC
6 m" v- q6 t5 n: b9 d
output_sample(sample); // write L + R samples to DAC
( C3 v* T/ B5 ^. `/ X
return;
" C; Q" D( s) [9 ^3 I4 q
}
q$ J z q f+ y- {% t ]9 n
1 _- n+ \1 Q l0 o$ _2 t. m
int main( void )
$ T$ h0 ~1 V( k1 @" u( M$ H, B& ~
{
3 u+ m' c7 Y( \, B
" l& O, k! J# Y3 ?; g9 m* n
/* Initialize BSL */
. _1 G% ]6 F, J! ?7 C$ L
EVMC6747_init( );
0 X/ P& Y* f" L p5 O# I+ C0 x
/* Call evmc6747_intr function */
5 o' o8 C( K: j2 J5 L0 }3 x/ V$ @/ s
aic3106_init( );
+ `& F, u7 B9 m/ i C" d& u V
while(1);
- J. V8 @) G( Q: I0 K- d4 Y- Y
}
2 ~1 ?# e- n/ o! y- B* `
, j* [/ p- N/ D; }9 w! x" m
2 y; E5 N" o( f" j, S- k
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
. y3 u1 |) i, y3 P& U
/* Initialize MCASP1 */
% Z6 ?" }9 K0 s8 ]% ?" z
mcasp = &MCASP_MODULE_1;
w0 _' C. W3 E, [
mcasp->regs->GBLCTL = 0; // Reset
1 Z1 p+ h: o. X: ~ Q
mcasp->regs->RGBLCTL = 0; // Reset RX
0 d" d Z/ G O. S
mcasp->regs->XGBLCTL = 0; // Reset TX
% g) @6 l0 ?3 u+ x4 ~; m. y
mcasp->regs->PWRDEMU = 1; // Free-running
' x+ g8 I; d5 v. _
// configure McASP0 receive registers
) B, e) m" @- b: w' ^
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
2 y' c2 }/ F: E r3 Y1 u
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 w+ a: m" P5 {8 p3 d
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
/ F3 P; Z$ o; r* m, J
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
& x% j, C* ]& s! c" V* t& l1 V
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
9 X- u1 ?3 n" d) m% L, b" [
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
3 u9 Q% H) t' S& ?2 S
mcasp->regs->RINTCTL = 0x00000000; // Not used
# x8 F* \) b5 Y8 v3 A
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
x3 U! q8 j1 w0 x, ?$ [% I
1 w; N9 c3 A% h1 m
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
0 j5 `3 ~6 q5 d+ [/ d2 v3 c! h: x
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 v0 {+ o& \! w0 R8 d% D& Q) H
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
, P1 j2 q9 `0 i ^' _
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
: ]8 R& W8 s3 s, K# G
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
8 t# j$ t6 g, E8 a
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
2 R3 i+ H2 v4 @4 E$ N
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
' V' P$ Y4 F/ h5 {5 t$ n
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
- Z9 L3 M9 Y0 U# D1 k2 C
+ v: w6 K: a# Q' S: U
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
* I( B+ z: O' b7 n7 }- y0 ] P0 J0 C
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
2 Z) U% ^0 q0 ]
mcasp->regs->PFUNC = 0; // All MCASPs
, S" J3 B" ]0 ^ t6 W6 x) \2 e* q: G
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
3 X6 U1 e8 C8 X3 S& m+ y5 l
* s# v/ F; J/ h2 }/ a
mcasp->regs->DITCTL = 0x00000000; // Not used
# W! m1 O, a1 Q
mcasp->regs->DLBCTL = 0x00000000; // Not used
0 ], A3 t# G2 `5 T/ ]3 ?2 y
mcasp->regs->AMUTE = 0x00000000; // Not used
% |- i' t" J: ^/ H
$ ~- ~5 n4 }, {; l5 [# w
/* Starting sections of the McASP*/
+ p* c7 \5 w8 L5 }# p
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
6 A; `. a. y1 _# p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
9 d' ?* q# O. W; p4 e% W1 _
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
6 l* `9 f6 t& S& K% x1 o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
2 `4 o0 K- M: g+ \$ b0 W
5 O5 c) f% ^3 a% v
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
8 c9 W2 ~$ g& n3 H
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
/ \$ h' p" `1 U: ?* q" U
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
5 k' V( G6 r% E$ y. C
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
: P4 f/ R/ v: ^: q2 q' O4 R
5 P* \- t0 A* g0 J( S& I. K6 n
mcasp->regs->XSTAT = 0x0000ffff;
) v6 P$ c; [4 q/ X
mcasp->regs->RSTAT = 0x0000ffff;
7 _) q R6 H9 S& C7 {' Z2 m
1 S# z* i1 o8 Q {; v
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
% q# y( U- @# P ]) h" Z" a: t
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
7 M& A& p7 i1 A/ `. G4 }; ?
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
) l- ~- d2 I6 ]; B8 @
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
) _ ~( D& T/ p! r$ _
- C! O _5 L/ f4 k9 N
/* Write a 0, so that no underrun occurs after releasing the state machine */
0 Z! {+ s2 F2 t A" G4 b
mcasp->regs->XBUF5 = 0;
% ~5 z8 p! \% T9 o+ |( `
mcasp->regs->RBUF0 = 0;
' _: y6 g- b7 B- |6 ?5 `
) E. j1 A& p: e. }. I( K4 p0 R& V
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
7 O% k6 s( D0 P0 D7 E7 i
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
5 G/ ^2 b [: ]
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
, ~, J9 H, v0 X
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
1 I! D, l/ [, G# a, ~
+ F0 `8 F; X% a- ]! a. l% p
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
. ]* G/ w1 |$ I$ J" C6 R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
: J7 x* j* x' a8 ^1 y" `
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
' Y9 o- `2 \$ p' |, ^9 p4 S) o* i7 i; B
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
5 d3 W% c( i1 ~, x. v* ^% z
0 _0 T( |3 t0 q
CSR = 0x0000;
- F# W/ r0 E1 K7 _9 K0 C
INTC_INTMUX1 = 0x3d;
2 Q+ c3 z; v% ~2 _1 Z
ISTP = (unsigned int)vectors;
- f8 ^/ W: B6 K! r0 f! U
ICR = 0xFFF0;
* O u+ J( b/ i' h# j
IER |= 0x12;
, _) W, u( _4 q+ S6 X
CSR |= 0x01;
: r* t( h8 a: D8 Y+ m9 a
- ~* l6 s9 s6 R4 l8 Y( i9 X) {) x* N: x
; d# ~! e x; f, u) {' a4 ^" M
) j0 j6 Z. n0 Q, c% j- P
还有就是两个输入输出函数:
7 G* {0 q, ~' R3 L, e4 W# m5 V: m
void output_sample(Int32 out_data)
! l6 j2 k; S. t8 o$ T
{
" n" Q* g4 |& H( ?! ^4 X
AIC31_data.uint = out_data;
1 ^: N- [* _0 x. s
MCASP1_XBUF5_32BIT = AIC31_data.uint;
, w# Z5 k! v: Y6 Q9 S" \9 K1 E& C( b
}
( l4 Q. V! G# v% H" ?/ N
/ g/ ~* N5 f0 s m# K! o
Int32 input_sample(void)
2 \8 c) [4 c! a& j' `( E; [
{
4 M b$ X8 F5 p Q$ {, X. a# S" Z
AIC31_data.uint = MCASP1_RBUF0_32BIT;
' {8 I3 f' v7 h, z, F; c5 D/ X
return (AIC31_data.uint);
- j) D# T. Y0 G4 J. D/ F
}
) d% J; \' O3 D0 O9 v
9 `* @; H4 k& [/ }2 t1 r( C
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4