嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
0 O+ \& |! S/ G4 g3 o x2 v
main文件:
9 _$ }0 o7 u! E8 {: g9 {, s
interrupt void interrupt4(void)
8 d' V" w/ ` K P8 [1 B2 H
{
( Y% R. h! D5 j6 m, B' g7 N! S2 b
Uint32 sample;
9 m1 K: t. o4 L) t+ H4 y0 [7 |. D5 z+ K
6 V. i" e4 E# o1 m. E
sample = input_sample(); // read L + R samples from ADC
0 K2 {1 ~7 K0 q. D" y8 e5 Z j+ a
output_sample(sample); // write L + R samples to DAC
% t7 h( t7 o( v7 w
return;
: A5 n/ q5 Y0 m. l% {5 L+ u
}
2 m# F% r% s4 {! n# k, |5 ^
/ F9 {% [3 u# `) H: Y
int main( void )
7 ~; [4 ^; W3 H9 ]$ j6 y
{
- H p2 ^/ ]; \1 M2 B
- n. G( j, \2 ~9 R1 K
/* Initialize BSL */
) w" x( v& a* T* ?6 |
EVMC6747_init( );
$ J7 D+ `) t, b4 M0 x
/* Call evmc6747_intr function */
! V/ O3 ?- f! V1 x" i! R
aic3106_init( );
3 n& g6 O' ?% X [ N* }
while(1);
3 q l' \% y% M! m" J6 O! ^- K
}
+ \4 v- ?" v* K# `/ p% b& q
! }' E; ]6 ]9 M/ Y0 D
$ Q$ c9 k" y b# ^, R2 T: S
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
8 \- n+ p# W' o+ e3 P! N8 L
/* Initialize MCASP1 */
0 ?1 S) c6 a/ s4 Z
mcasp = &MCASP_MODULE_1;
" b0 p: b6 E3 k% k' |2 j/ M
mcasp->regs->GBLCTL = 0; // Reset
: N& k. L9 U: v! c& f# c
mcasp->regs->RGBLCTL = 0; // Reset RX
; N" U- J& `& ?8 Z
mcasp->regs->XGBLCTL = 0; // Reset TX
2 P- b$ A" [ j: @
mcasp->regs->PWRDEMU = 1; // Free-running
% k8 I. x2 Y5 T7 o. Z
// configure McASP0 receive registers
4 ~2 F/ {% L/ R. _
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
' C8 z7 N/ }( Z) p3 s0 {
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 H5 X8 O9 H4 F# j5 Z
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
& W, J: I! `5 B; v" L
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
7 s- Q' k9 s" Z5 s; O
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
, ]& |* x) A8 o* Y
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
: I0 y' Z7 ?; L1 o; L
mcasp->regs->RINTCTL = 0x00000000; // Not used
1 M4 e) j* R, C0 d2 K7 L
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
& r! ?, r2 g M8 t1 ]: R7 V5 R
, |0 E" K9 X+ G2 I- G1 o; Y8 H
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
- i% P7 r9 F) I
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
8 v8 u7 N. Q3 W$ O) Q, ?: ?
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
5 s( x2 N, G6 O' i* A
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
: \% u4 Q: D4 u/ e' Z" y, j
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
* h0 i- I S& E. m1 H
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
6 @& N3 N: b( E7 u6 }' f t
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
+ n0 U/ j, _: x: i" m: E$ S4 M
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
' B; [' ~. Y$ C+ H
1 \9 T# V8 E, ?5 C- y/ ~
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
. v L- ]- O9 n$ W3 L0 d: l
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
7 _5 C* T1 H) Y
mcasp->regs->PFUNC = 0; // All MCASPs
) h- G: \1 S; I+ W/ q4 |
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
2 Q( H1 @. T* X; e$ g# z4 X# y
! P8 c7 y* ]) V6 H1 Y5 t F& Q0 R
mcasp->regs->DITCTL = 0x00000000; // Not used
: S9 ?+ Q' F* [, X- M; b* f: m8 }
mcasp->regs->DLBCTL = 0x00000000; // Not used
; k o7 ], T8 s- I! L3 ?
mcasp->regs->AMUTE = 0x00000000; // Not used
4 t3 n% `& w ^- s; Y3 q
2 p* r5 E0 M- c" G" b
/* Starting sections of the McASP*/
; k- T& A! C( G' R( a
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
" N2 F- B: D t. ~: u0 I
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
% d) r! E& ]% m* c6 h0 G" w) c
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
) `4 b; l) n- C- q; U6 J
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
( R1 n1 T6 ]0 `/ i* X7 I
# w+ l$ V! ^; p8 n/ I/ x: g
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
, J& B S$ o) y: ^8 ?( \) j
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
3 B' r; l/ _4 C D: j
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
B% _5 D4 p% o( J' Q1 }
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
# d a' r* ^) ^* w9 u
- w( W6 D+ V8 ~. I L1 _
mcasp->regs->XSTAT = 0x0000ffff;
( e/ g; p3 `' v
mcasp->regs->RSTAT = 0x0000ffff;
T$ ~8 O1 @$ Z
! S' o$ z1 G" h6 q
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
, O: ` `0 U+ ~) |, x c4 _
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
* j1 X, f9 I" C. {7 ~, D* }
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
/ y/ P8 _, C& k1 w7 s
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
7 c" j1 n$ W T" v8 C9 g0 C
% v% p9 [' i, q
/* Write a 0, so that no underrun occurs after releasing the state machine */
, Q, C+ V$ {) h6 F
mcasp->regs->XBUF5 = 0;
9 u$ `1 T9 @& j6 W* b2 e
mcasp->regs->RBUF0 = 0;
% P8 L. g9 k8 l
2 l8 ~! p. j: w4 x
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
8 t& {8 F: d6 c5 p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
2 `5 h8 O7 e( x( i8 r3 N, P
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
) e6 D7 [4 `6 {( c) V
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
9 N. q, x5 k# t" u
& Q7 j% A0 y" e1 {3 z$ m
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
, V8 F: a; D0 |* v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
$ n; k. g4 `1 i8 Z+ [% r& ]
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
' u& J% s$ w8 Z! P
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
4 a: v" g8 ]! ]3 _; |
) r% b( M2 M8 v! N; o
CSR = 0x0000;
. X( K4 N$ Z$ c- ~2 X3 N
INTC_INTMUX1 = 0x3d;
, x# I2 h6 H- M$ \" l( o/ n
ISTP = (unsigned int)vectors;
# U$ t1 n- [& g& X$ R8 h
ICR = 0xFFF0;
: Q. f) Q% T7 |7 k% Q
IER |= 0x12;
& t3 j1 ~& x! e6 l0 E
CSR |= 0x01;
1 z$ w) A" H' v9 ]/ a5 ]( p
3 ?; M0 l. T9 K1 c; I8 @( z
5 |9 l% ^) H6 F! _ z
( x' n1 I/ ~2 I- R T2 b
还有就是两个输入输出函数:
( y3 I; E) @$ {% H
void output_sample(Int32 out_data)
7 W( n7 ^; K, U3 n4 b- d
{
( D; A: f" h# A |
AIC31_data.uint = out_data;
; I( u; o0 e. f! B; w. n/ k
MCASP1_XBUF5_32BIT = AIC31_data.uint;
6 \+ D M2 s6 v8 x4 _7 U/ v- l
}
, J' F; U7 m7 {7 [, ~* K O
; t9 Z; t- x6 B) @5 I. m* A4 n
Int32 input_sample(void)
, d1 c' |0 Y" x; P7 v U& P
{
. {3 ] D9 X8 q z
AIC31_data.uint = MCASP1_RBUF0_32BIT;
9 F1 ~; n4 e( Z& h9 u
return (AIC31_data.uint);
3 K5 }* L: c& Q: u
}
: {! M5 N& M2 [ f( {* \9 W2 [4 L
7 x# k# c( R7 {% |0 ]
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4