嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
$ V: p+ J% \' ~( V f
main文件:
O; F* E# U$ n$ z4 u( f% l' K
interrupt void interrupt4(void)
" A) U4 m' y0 [6 ? ]5 W
{
" K1 \3 P5 X5 k4 z7 n8 ]* g! J
Uint32 sample;
! B; Y+ T+ @2 ^* Z8 s; l
! T# F$ X: `- M9 o3 O! @: x
sample = input_sample(); // read L + R samples from ADC
9 }4 Y- X; M1 ?. K$ p. c
output_sample(sample); // write L + R samples to DAC
' a& H- W! u2 D5 ]
return;
0 S7 Y: ^+ k( ~* n2 b
}
l/ q3 A/ d- M. p8 A+ o! m
6 I6 i( J" }* O' ^7 N- t
int main( void )
: s8 A, c4 A9 o
{
: l4 s9 N B7 o, Z: j" V, D% E; W
* |! l7 X* K- ~- r- q7 N
/* Initialize BSL */
8 v2 X, d3 S6 k, ]: v( N# }
EVMC6747_init( );
5 S' ~! a6 m; D6 B3 g
/* Call evmc6747_intr function */
% H3 E( J. h6 ?' T
aic3106_init( );
% z! A6 l: s+ u+ g2 v9 l
while(1);
+ r: _8 b `. r v& w3 ]* A
}
* X& k* e+ [& W+ s# G
0 G; @5 T' Q* t- j9 ^2 W$ U3 k* A
! n2 i9 B7 {/ e% n/ t' z
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
/ `; G; _7 ]3 B& w, T, G
/* Initialize MCASP1 */
3 q+ E3 m* d( z7 h/ \4 u0 [# U
mcasp = &MCASP_MODULE_1;
" J1 R; |" x- x3 v, F
mcasp->regs->GBLCTL = 0; // Reset
7 u+ ?+ {" o0 O9 l2 \
mcasp->regs->RGBLCTL = 0; // Reset RX
3 ^5 g8 d- w& }/ h
mcasp->regs->XGBLCTL = 0; // Reset TX
; ^& t$ `0 u5 a" g5 d0 ^
mcasp->regs->PWRDEMU = 1; // Free-running
& f; ?( d B: r: K
// configure McASP0 receive registers
5 o; y( w% o/ X1 n6 R3 ~# D
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
0 R! u @6 ]9 B; d; Y) D0 M: J
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ o: Q/ k& ` ^+ i. x
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
2 N* J2 z. ? f" g; z$ `
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
; _9 N% _, b9 m
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
3 a7 ]" V* H) h' d2 q/ C
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
7 N% d$ Q/ ^) d3 ?$ t& ]
mcasp->regs->RINTCTL = 0x00000000; // Not used
- e4 ~- n/ _: E2 t, S
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 C% J+ y( v& v& Z) F7 `; B" t& d
+ T; V7 Z% u* _! N' g3 Y1 ^
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
. I- J; L2 Z- |9 p- G2 M+ B" S6 G( N
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
( M6 U9 ~- l$ `. k
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
# Q9 Q3 Z. A! W0 N: K" ?
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
2 K* @+ e% e/ b1 \2 d
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
3 U2 v' f3 B- y; V
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
; Y1 I$ p$ m( A; @
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
6 d* Y0 {8 u0 g6 {( N
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
$ ^' I6 A( P$ o/ Y/ d
5 v) R! x* Z4 e6 A( I3 ^3 ]
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
: P/ _6 @) ^* P& z2 R2 j
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
( m& H! G C! b5 I
mcasp->regs->PFUNC = 0; // All MCASPs
& }) A) m+ i& _0 y) A b
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
" ?/ a$ n4 z/ `* O) ]
; t) K+ a. g* B( r h, p! ~ \ J0 \
mcasp->regs->DITCTL = 0x00000000; // Not used
4 f. p/ |% F1 z; ~5 b0 {
mcasp->regs->DLBCTL = 0x00000000; // Not used
, L( \ [ ~ A# Z% Y* P- q) G8 }
mcasp->regs->AMUTE = 0x00000000; // Not used
+ x. _, f$ _6 C0 D: j% W0 f
& n- i' p( L/ a
/* Starting sections of the McASP*/
) _1 z7 U& B, B8 P6 x4 n' F
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
" q% y" l& s$ F! R( {* X9 v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
- C S4 `4 o. Q9 N; d/ t
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
* A: V+ Y5 @4 i
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
* z3 \. v, q6 E8 L
) R6 Q* _' B! S5 C/ j9 p$ l
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
% d. @9 t w! V
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
8 ?9 F, @( ]* _1 [% g8 L
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
/ D5 S; }# H0 v+ j9 X5 d
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
; ^& ~; w3 i1 W
8 a0 m7 ~+ y, M: A/ J! ~# c- ]! I$ D
mcasp->regs->XSTAT = 0x0000ffff;
% l4 M4 }5 T+ o' X
mcasp->regs->RSTAT = 0x0000ffff;
# P! Y7 N2 n a+ }5 F0 c
7 J8 W4 p1 r# {* Y& q% P
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
$ B5 C M7 A+ i8 r( K
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
0 V4 J, o4 w0 O
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
' C; b. B' v4 u f! w. D# C
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
5 f/ r* D/ V8 ?6 Z6 `
; }4 e, l8 z' r& F% P2 F' R+ t2 m
/* Write a 0, so that no underrun occurs after releasing the state machine */
1 D: T- f& W- n% \8 e0 y
mcasp->regs->XBUF5 = 0;
+ U8 X1 \, t* s1 G
mcasp->regs->RBUF0 = 0;
' g, V( J! P% k* E1 Y- U
- S b7 M K E. i F; v5 G# A
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
- ^- \. [4 l) j H6 [8 F
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
5 R/ Y; B( v3 a7 y' E
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
: k/ f. t) s( @+ F7 F
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
( ?* l! ~1 Q B* `! w5 r
) L8 q, @" l6 w* q0 i; Z& b1 B1 \; k- n
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
0 W; p. L9 f& x* \; O4 N0 H _+ j
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
8 q" X7 D& }" P W1 i
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
* M, j4 f" ?) K7 R
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
9 L4 h4 A/ E. q8 i/ z
9 Z$ T+ P: K: d, u
CSR = 0x0000;
1 K# k4 b" R" @0 W: k4 Z
INTC_INTMUX1 = 0x3d;
- i( K( g* T# c. h' X
ISTP = (unsigned int)vectors;
, `6 Z" k! l. ~
ICR = 0xFFF0;
3 P# p9 z: y) X7 N" j# t% J* a
IER |= 0x12;
' ?1 x+ R& j3 Y" Y; d
CSR |= 0x01;
% m2 R& \8 W- b. B; g. L
$ v! x/ V5 B: w: g
4 n& k7 A$ Z; P2 y% m) _4 a' Z
/ H5 ^' U( M/ W" ?1 m4 e
还有就是两个输入输出函数:
8 U% \* g9 X' R
void output_sample(Int32 out_data)
9 v/ Y; l+ }4 |: |5 c" R$ w4 Z! X
{
- a5 e7 q! L2 W3 _; [, r7 i- w! ^/ k
AIC31_data.uint = out_data;
# P& n% \; T: b4 }% \
MCASP1_XBUF5_32BIT = AIC31_data.uint;
( f1 |6 M5 _* \, c E0 t( k
}
; c g( j2 m2 v2 ~
- L2 ~/ h% B+ w+ v" d$ R
Int32 input_sample(void)
, f6 V1 E/ X4 _) z6 C* b4 y4 T6 G
{
% ?: T& o8 d% j$ D$ m
AIC31_data.uint = MCASP1_RBUF0_32BIT;
( J2 R$ K% v4 L6 S, C2 M+ v' a
return (AIC31_data.uint);
+ B( K8 u2 e* K1 H& {, o0 z
}
6 p E X) d0 d
& L. m$ w# q7 C# o0 }
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4