嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
. k& H8 g, L( R0 [( J
main文件:
; z* [ X: ~8 ?$ L$ m
interrupt void interrupt4(void)
- t$ K9 n' [% ~9 j- W
{
% b. M, ~! a0 |
Uint32 sample;
0 d4 {4 O. q* `. \1 t1 Z. V
" V$ F m, @) D ^
sample = input_sample(); // read L + R samples from ADC
/ Z* q$ i- J6 Z' I
output_sample(sample); // write L + R samples to DAC
, d2 X q. n& E4 v1 d. ?7 b
return;
+ X% {: G) x( Y" a4 f% S3 I( j
}
|9 m, J v2 _
2 x1 V5 r& m6 L" y7 [7 y; Q
int main( void )
; S( y7 x# q$ l) g3 F
{
" B( i. T3 n K$ y* A: B- [
9 H! q4 f8 \( _. \
/* Initialize BSL */
4 H+ t% M: _' c) T
EVMC6747_init( );
' Y) A! K5 Q. W, c* k/ W
/* Call evmc6747_intr function */
' a* ^# m, }* D9 j
aic3106_init( );
6 s6 y0 a( B& z
while(1);
2 q9 L5 X1 M- d) F9 ]: s- _0 V9 _( g
}
2 o3 b5 ?. Z0 a& S( _; l) ~* Z
$ e; }* x% Y u5 L, Q+ s! k
2 w- H* x, m) y# i5 |& M+ G7 b
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
% T8 K- V' y b& h( H2 U, L
/* Initialize MCASP1 */
. y5 i" ^- w9 @& `3 d
mcasp = &MCASP_MODULE_1;
P) Y& ?. B* H5 \: o- E b
mcasp->regs->GBLCTL = 0; // Reset
9 `8 J2 T$ G5 L4 L! J
mcasp->regs->RGBLCTL = 0; // Reset RX
: ?+ I- ^# ]5 S% \, ]5 C" c
mcasp->regs->XGBLCTL = 0; // Reset TX
, B. o, r) m. m4 @) b- F1 K- z. T
mcasp->regs->PWRDEMU = 1; // Free-running
, ^& Z- S# G; H4 F8 F
// configure McASP0 receive registers
! [5 W* h: B" N) j/ q+ d0 }% S3 T
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
( S0 x' T {* r/ s
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ B( ~7 J. |/ v9 Q( J% ^1 i: p
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
' L H+ C) c+ j9 y
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
: C M/ z- M" q& c W" j9 E' J
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
+ ?8 |9 }2 S; b/ X6 m
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
8 b7 S) `" @* V8 `
mcasp->regs->RINTCTL = 0x00000000; // Not used
. K& N' s' H% P
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# T3 N. n. P6 b
+ D5 u% a% Q4 {" B* e! C$ h; c
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
! v+ k4 e$ g# A$ {, b
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
! F- P8 }( r0 J. C1 P
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
/ {1 F* X J+ O0 x
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
7 m9 P K, v+ {1 [6 t
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
* N! z- m i! K2 k' t( Z
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
9 n) V% d* p* g% f, B# [8 G. j
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
* D) s: ]) m% T
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
" K2 @+ ?) G0 M4 |/ E: k' P
6 `! V& S' A: p1 c% V
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
( Y. W. a" C3 W2 O5 R4 k
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
`& ^1 ?6 g/ ?2 _# ]
mcasp->regs->PFUNC = 0; // All MCASPs
+ {0 z- U) Y8 ]5 f9 ~ g2 Q- q* u
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
, A1 W( `' M+ v# I; S( \
& y9 Q1 X3 q2 r3 y0 m
mcasp->regs->DITCTL = 0x00000000; // Not used
7 H+ X/ @5 D" ?" y
mcasp->regs->DLBCTL = 0x00000000; // Not used
+ N2 Z L X, M; T) P
mcasp->regs->AMUTE = 0x00000000; // Not used
7 l7 {% g( \# j" u4 ]
! O) G( E' U7 ]9 y. T" ?6 i+ p- h7 B
/* Starting sections of the McASP*/
5 D2 r. U7 p. R! `, o7 O* | @
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
* r/ o1 u: O! v8 ^) {% A: F
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
, O7 f/ e+ t$ R: p B L7 [
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
l$ n. t: q; W: Q4 z B
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
b. X. j1 `9 k3 U7 _- Q) q" a
" v8 p3 Q$ m( Z. p9 S
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
8 s) \' j: m1 W# Z G
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
& m L4 O* j: O+ Q
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
& O w8 a. j/ Z8 W0 x" B
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
! V6 X: ]$ d7 q5 r9 r
- _$ r3 M# U1 k8 ?" o/ n' [* r" c9 B
mcasp->regs->XSTAT = 0x0000ffff;
. k/ v1 U2 t9 e! e; r0 h# C
mcasp->regs->RSTAT = 0x0000ffff;
. j* p- z' C, B$ ], E M# ~
% a" U: F9 ]- T a! X# b
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
. A& u) a9 G+ g6 t8 M! _+ Z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
$ H) l: y$ M Z# Q, r' ~" ]! y
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
3 n3 |6 I# g& R
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
) u3 J3 E4 c& D* V5 e: ?
2 l. i! ]1 Z: s/ z) L
/* Write a 0, so that no underrun occurs after releasing the state machine */
" a9 Y% n6 G3 w2 F3 x2 L
mcasp->regs->XBUF5 = 0;
8 p& F4 I4 ], m1 ~/ U; q' q: y
mcasp->regs->RBUF0 = 0;
# V- U9 x2 f9 k
; |7 a1 ^+ \2 ]/ T
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
4 q" W6 N! @( ~' a0 N9 h. O4 f
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
/ U3 B a. q: e+ t2 B
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
, g" e) J( ]( v! j7 n/ _' y" v+ M
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
( w! g Q- R6 i$ |( y
- P) T6 M9 r2 T) Y9 |( g+ n- \$ I
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
8 K/ ^8 G( m& M6 h
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
- @( E$ b' D3 h1 f& T' U1 X
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
7 d2 {2 k# j2 d0 m4 `' ^# I( n
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
, N- Y- m7 U9 [; m
6 C* M& d# m+ l0 \8 [+ x& V9 q
CSR = 0x0000;
# u+ j4 s% v; @1 y) ?# E; v$ _
INTC_INTMUX1 = 0x3d;
0 w* f4 @- k- a$ |& J& a
ISTP = (unsigned int)vectors;
7 o& V( I, A0 J% L$ N* |% M+ j$ A% A, ?
ICR = 0xFFF0;
( S( ]0 G# R% V3 @. r
IER |= 0x12;
7 k3 d' r. g: i6 w& e
CSR |= 0x01;
2 K) s2 U% i1 M2 H8 y
' E5 ^3 v, \3 u4 [
- ]5 Q' r" C$ `
. z! W/ B1 H+ z2 {
还有就是两个输入输出函数:
+ ?5 `# B' X: P+ y6 t' d g+ o
void output_sample(Int32 out_data)
/ q6 L0 x0 {6 }4 j
{
y( Y: t* @: t& b9 C2 D6 w
AIC31_data.uint = out_data;
5 ^; o0 z- _0 U$ S' Z3 L4 G0 a
MCASP1_XBUF5_32BIT = AIC31_data.uint;
8 `1 r. w* B5 Y6 k! }9 z
}
) A' G" X+ b1 [7 m. m
6 x* F" L& r# D
Int32 input_sample(void)
; d3 m! |; W1 F/ G
{
( b$ ^# y. v# v9 P; e) F
AIC31_data.uint = MCASP1_RBUF0_32BIT;
! G/ D4 w- M* b2 X) r
return (AIC31_data.uint);
+ F( v4 ~& [0 k }& \
}
, N8 q- h1 `' h5 E7 m
, v* e* l" V q) w1 q! V3 v# F7 Q
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4