嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
3 t. A3 {- K5 x8 u
main文件:
# ` K( y+ D, y, n
interrupt void interrupt4(void)
" @1 l( O7 z4 h) b! A2 q
{
9 T X- Y6 Y: R
Uint32 sample;
( p6 e2 V" i& q! W0 [- E& N, S+ Q
0 K- X8 L$ J1 z* C, M
sample = input_sample(); // read L + R samples from ADC
5 B/ |. S" |6 @
output_sample(sample); // write L + R samples to DAC
& L! t5 t' m/ I1 G( L D
return;
+ ~! Z, j+ {3 \
}
8 T. I/ n. M' q5 S
9 \! M0 H2 I$ u: y0 d
int main( void )
, \! i! d/ ?4 `. d7 B
{
; t1 ?; J; {! p2 \' J$ G
' g9 n2 V' f6 A# u/ l8 x
/* Initialize BSL */
3 I# i$ k3 |, s$ {& w2 D
EVMC6747_init( );
2 ]3 r+ H `% U6 Z3 F0 f- L
/* Call evmc6747_intr function */
$ U2 h. {- D( k" i
aic3106_init( );
p7 f4 x# R( z
while(1);
. W c8 O9 g0 c* |; V1 U/ }1 d
}
5 p8 E [" j7 z5 _
9 ]* ^" d- |7 z
! J6 @: ?! X: F
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
3 J# ~8 U$ b& R3 t2 ~
/* Initialize MCASP1 */
. [. z1 N- }) g2 i* Q$ W- t8 Q9 g
mcasp = &MCASP_MODULE_1;
% ^! y2 Z ~9 W( H
mcasp->regs->GBLCTL = 0; // Reset
1 m+ ?7 J; }5 s9 F
mcasp->regs->RGBLCTL = 0; // Reset RX
9 t+ A# t! o9 d2 }6 x% p1 V9 u. f
mcasp->regs->XGBLCTL = 0; // Reset TX
5 f" |; i' n E o7 \$ K( v
mcasp->regs->PWRDEMU = 1; // Free-running
4 S o: G; }4 t3 T. R5 ~5 U
// configure McASP0 receive registers
' L) o+ [4 U4 n) u6 W
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
5 }- j6 m9 d1 m+ _6 u9 y6 h- Q8 `
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
& R( V; r, [0 e, V. @
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
; A, U5 l. r" ~4 e& R1 A& K
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
9 l; y5 \: X& |3 W! t
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
, x# D; D+ f$ t2 N
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
7 k9 c0 Z: r2 R% M
mcasp->regs->RINTCTL = 0x00000000; // Not used
" C, r+ Q. E% K6 d3 Z1 _+ z* C
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. s4 P8 E' T8 ^
3 _! l2 m0 _+ T* L- a: P3 L' K
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
+ o {2 p, g+ @5 H3 ~; h5 k
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 l1 D8 B) J) H: g6 n) L
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
+ q2 _, k$ U# F# f# c
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
Y3 s0 u. L3 |( x
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
# z j5 g1 k0 J V6 m, R
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
6 s! ^5 L4 c; b, F7 Z! h( x2 S
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
0 g# I3 [$ s0 ?0 U8 l
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 a6 {& b1 d& O" J
* m3 U5 u: ^# W6 B9 y" c4 ^- K
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
: g# X4 x+ E& z/ e
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
' f1 O) |4 O6 |1 O! f! \
mcasp->regs->PFUNC = 0; // All MCASPs
1 D; C" c* S* n7 r9 c; n
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
* Z! ?( c! O! }3 a+ v
7 Y$ I/ s+ [9 `+ e8 P
mcasp->regs->DITCTL = 0x00000000; // Not used
9 O( b% Q, V- e! t9 S' A
mcasp->regs->DLBCTL = 0x00000000; // Not used
4 Z8 a( y8 ~/ S
mcasp->regs->AMUTE = 0x00000000; // Not used
0 }9 r+ p) Y: x6 f* [
, a0 k V; {, H& R ^
/* Starting sections of the McASP*/
) n& A! _1 C ]6 l. H
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
6 O& m) M; ?+ M
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
0 t* s8 c9 S/ W4 Y. s5 Y7 L
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
% Z( `5 J; l; ]1 g
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
p7 ?9 n* x' M
7 U; e4 x9 z/ r& \
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
3 D7 i' v1 `/ x7 j; v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
1 c8 c5 I* ?$ _. O7 N/ C! A$ w
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
/ B* ?" ~; c+ P; N; q m
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
1 ^: r. D) ~9 T: v$ t* K
5 B1 ?7 o2 g! R- }+ ~% X
mcasp->regs->XSTAT = 0x0000ffff;
3 p. v' B/ s! Q3 o. l. j1 r l
mcasp->regs->RSTAT = 0x0000ffff;
$ x6 @) G: ]3 ^, l
; }! \% k+ N" a0 ?+ p* \
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
# `8 H6 y/ W$ |$ A, Z9 o0 n+ N$ f
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
- X# d1 Y! s7 [1 |
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
; y6 }. F) ^& p: x4 d/ B$ m1 ?
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
* e7 p) l2 }4 y: \ c* W, W; G
: k1 d3 B& J, a1 w) Y: k
/* Write a 0, so that no underrun occurs after releasing the state machine */
* k. J) Y+ { @- D0 l5 ]
mcasp->regs->XBUF5 = 0;
; ^# P- w! I7 r; ?# N. P l+ E# j
mcasp->regs->RBUF0 = 0;
; L8 q8 |: X1 _0 z5 ~
/ p( P2 L/ X. |$ |1 S( h3 Y, O
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
) q4 k8 O8 f- ]8 D
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
& y, O- D3 ]8 p, Q A: @
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
7 A/ m: |0 F6 \8 X
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
: T# w9 |" h' G' {9 @1 K' Z' K
) E" j: w- s4 N- F% t2 S
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
1 `" E( [0 P) @( l
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
$ n# v& q( n0 b1 Y6 Z
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
4 F# e6 C; r4 K/ \4 u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
+ m. `5 k3 y1 _% k# }
# v& e' E, R1 A/ f2 z' J
CSR = 0x0000;
0 j9 D. k; ~, U! W0 S6 B! o" e
INTC_INTMUX1 = 0x3d;
`1 e' P# S+ A3 @4 [
ISTP = (unsigned int)vectors;
$ Y j7 Q. V4 z2 {7 H. N6 W% ^
ICR = 0xFFF0;
r1 t+ ? }5 e3 ^3 _$ B. I
IER |= 0x12;
6 c. p3 K, O5 Y9 S
CSR |= 0x01;
: z" X8 o$ v% O# o% H+ j' k
' D+ l0 S' ^: |
% r! v1 u) L' k
! w" a9 d. z1 R8 r: E" v; ~
还有就是两个输入输出函数:
- j2 ^1 V- R5 c& ^
void output_sample(Int32 out_data)
, O6 m, b) _% s" L* d. K
{
/ N) J( v' T3 a9 w, E- R
AIC31_data.uint = out_data;
, k& M" u2 `# j3 k3 N
MCASP1_XBUF5_32BIT = AIC31_data.uint;
\& [9 {& ?, K( v f' C9 f% u) t
}
3 W4 U# U8 @ R' o
+ n' i9 W! f" F6 G
Int32 input_sample(void)
- D0 X2 p4 [* }" P- n
{
0 _. l7 g) d+ h) U- i4 E8 }
AIC31_data.uint = MCASP1_RBUF0_32BIT;
% x2 f Z6 }; c
return (AIC31_data.uint);
# f% u6 D) y J% \& u4 M( R
}
2 r. G# b: u0 k' b r% L( \
y' p( D( F) [9 q' C2 m
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4