嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
) q4 |: m. b5 x: U7 c
main文件:
! @. D3 d/ \2 b7 I! I% K
interrupt void interrupt4(void)
3 O9 X. c7 L: l0 H+ l
{
+ P! w5 b- _. `0 W
Uint32 sample;
5 Q, |/ F+ P0 W% Z
& c! S# n. M5 L5 {
sample = input_sample(); // read L + R samples from ADC
! k, P( B$ G5 d' }
output_sample(sample); // write L + R samples to DAC
5 B* e& S5 A! F& s9 B8 q6 C
return;
7 g! `5 O8 f H2 R9 i" N. U$ J
}
3 o# G& O! x7 n8 b
6 g: V$ C. T& C K4 \
int main( void )
n8 I( n4 m7 O) [% @
{
% O0 k* h* w5 e- j2 o
$ D! o: e! k, E% B9 P, j* [# K, q
/* Initialize BSL */
+ I/ C2 G6 \! o9 K' L
EVMC6747_init( );
3 Y; p5 B o% L! p/ q
/* Call evmc6747_intr function */
, n2 e9 n2 E1 [/ X
aic3106_init( );
* A: G! {, {( ^ E3 W( T1 u
while(1);
7 z# X$ Y" Z( F$ i& _8 U
}
0 W6 s6 K2 ]3 [9 @5 w G1 M4 |
& }4 |) h, B( D( K; e; d* q, T/ T
& _3 O6 l* |% h) m! g5 q
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
* L' }- A1 g5 s' p6 O' V: |+ L
/* Initialize MCASP1 */
7 H! ?+ ]! Z m( J& H" t7 Q. Y: n4 t
mcasp = &MCASP_MODULE_1;
4 d0 B# L& S2 E: W
mcasp->regs->GBLCTL = 0; // Reset
2 n& n' l& z6 t/ B- A9 m
mcasp->regs->RGBLCTL = 0; // Reset RX
$ D! K8 a0 [6 N; t
mcasp->regs->XGBLCTL = 0; // Reset TX
, Q& R& ^! q. E+ S: ~$ A: S. g
mcasp->regs->PWRDEMU = 1; // Free-running
' d/ E1 j; f' W; ~0 N6 L
// configure McASP0 receive registers
3 J: B/ L8 H. b* S3 m) T
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
8 ^4 j- g" m6 j8 ]1 p
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: J2 w4 W: Z- p' U
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
* U& p- n7 X" a% [
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
& k# L- y3 m0 ~7 q& [
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
/ F3 C0 B- H% ^# R
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
+ a+ c8 C8 y# _* H. v1 _7 k" ^9 Y
mcasp->regs->RINTCTL = 0x00000000; // Not used
1 Q5 ^# n0 p2 W* ~( @/ n
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
$ B- R6 T8 I$ f0 y% n# A1 H& v$ x$ ]
$ P- j9 ~9 w1 w* t2 t- i8 o h* ~
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
' p) I% l% L/ i" I7 k
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ K7 d1 o6 W' o2 n- w5 ^( m/ m4 X; p
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
0 b( x6 b0 D/ }% J4 a
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
, i8 q( y* c+ p
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
1 |3 h; T4 N* Q* w! m
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
, C* _" l U6 Z0 k
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
: T# X: d9 S& i4 e/ H; B {
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: q+ V. E9 w. N8 _8 m3 p& a
% x5 G: e: r- H/ l8 d
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
5 q2 ?/ Z2 [+ ^- {3 A3 @
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
7 d; I! e! [+ ]0 D
mcasp->regs->PFUNC = 0; // All MCASPs
: F/ ]% t9 `! Q- d' ^: A
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
2 |( N; z& _# H" Y+ C7 b
4 d+ ^& D0 f3 l9 j; Y' P9 O
mcasp->regs->DITCTL = 0x00000000; // Not used
$ \& ~' L. M' B' Z& P" r! C* N+ i6 _
mcasp->regs->DLBCTL = 0x00000000; // Not used
% _* y: w$ i6 O. @* U9 T
mcasp->regs->AMUTE = 0x00000000; // Not used
& z7 K+ r4 j+ f3 E
/ F6 I' x6 [1 x: X# B
/* Starting sections of the McASP*/
/ q* s6 b) y- s. Y
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
+ ^( f/ |# c; N9 @! T6 c& ?6 o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
# n& B, y+ j' b0 q( U7 N- R4 A
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
: C# Z0 W( u# n8 T
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
- Q" M1 C, o. b! K% j
5 S \4 B7 X/ o3 j
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
3 b5 W% R) [! ^0 ?! D! K/ f. ^
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
4 |4 B4 p, f E8 y& ~
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
& H& Y8 n( V! W: ^% F) _; e
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
% [+ v; L; a' t- d9 i
4 d9 A, a" e$ E8 j$ T
mcasp->regs->XSTAT = 0x0000ffff;
( d/ f8 ]' g) k: ^- Y% L! `# Y
mcasp->regs->RSTAT = 0x0000ffff;
- b! Z/ k6 w% ^* }5 W; h0 O
$ W1 X! z+ v" M/ w, a. m
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
( i, m. A+ n/ r1 O: f% @9 S
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
& F& D5 J, X9 k% z
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
& x5 O/ S" f( j
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
. R+ B' C' l& R5 M
& _+ d. h. w" X9 M+ f7 L# Z
/* Write a 0, so that no underrun occurs after releasing the state machine */
+ b/ N/ T' d" M6 a9 x% _6 l
mcasp->regs->XBUF5 = 0;
7 `, V( Z( h) s1 i
mcasp->regs->RBUF0 = 0;
4 W K5 v, q5 x, r, Z
' Y5 f1 _, ~2 D/ ~2 V
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
2 G( `2 v& M; [9 @
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
) _* O- \: M8 T! z
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
% w ?6 {- i: o% p: r
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
8 h, b9 d3 @" P5 R7 L
; y6 r: h7 W' ~# q7 ]
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
+ {6 Q- g0 D+ d* k$ B
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
6 h. U7 O: |- V& P
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
1 E& D! D7 c2 m& I
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
) t7 w; x9 E9 T8 q6 f- x+ l# R+ ]
+ @7 x2 L* O: o' p# e
CSR = 0x0000;
5 ?' B2 q8 n* Z* e1 N# i
INTC_INTMUX1 = 0x3d;
* {6 x7 r! Q7 Z7 b$ {( b+ Y' g, V8 P
ISTP = (unsigned int)vectors;
9 m* B. f$ H5 F
ICR = 0xFFF0;
; g/ d$ d, Z* Z# R& H* v `
IER |= 0x12;
" ]. V, l6 Y7 ~/ s# A0 j3 B3 q
CSR |= 0x01;
" x7 F2 A+ R0 `
* `& L$ |) a/ R3 @
. {9 |2 a- {. U9 g
0 l% s+ z3 M# i: f2 [' n( m2 A
还有就是两个输入输出函数:
6 G/ Q3 y7 o% M/ l P) X
void output_sample(Int32 out_data)
2 `7 i) \) K( j" `/ |& x5 e
{
# K* ?* O" z+ |# c; f
AIC31_data.uint = out_data;
# K8 u/ G0 Y/ \! S
MCASP1_XBUF5_32BIT = AIC31_data.uint;
+ @& r( K7 o. o4 T% w4 n3 q: G
}
/ Z6 A( _+ ?6 h( q% s$ B
5 ]+ v. v: i" P p0 c" g
Int32 input_sample(void)
; ]& J) A9 D- x( d! v1 Z
{
( d* @; Y+ z9 x! |, O4 F
AIC31_data.uint = MCASP1_RBUF0_32BIT;
0 E `/ d- w2 g' o- ~$ |
return (AIC31_data.uint);
) x0 V% W5 w& U/ ]
}
2 V: N; k6 ^+ A' ~4 ^4 M& L9 V3 `
0 ~% g1 l1 v2 e7 O; \. L6 u1 J
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4