嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
- b8 K6 T& R' F
main文件:
W% q5 ]& t9 l& W
interrupt void interrupt4(void)
' @2 p3 t0 i+ \# y: \
{
/ B' G) X# O: e& u5 V$ ~
Uint32 sample;
5 T- j. [) X& E# o- g' [
0 X7 l! P( i$ g# n U; v- l
sample = input_sample(); // read L + R samples from ADC
* g0 ?: B, S+ p8 a3 i
output_sample(sample); // write L + R samples to DAC
2 f3 S. |- y/ X3 e- G3 n- V" ]
return;
, c( k+ H3 V I: o: K# a3 r
}
2 M4 k' H2 G, g
& |+ h6 k' F4 A" b/ W0 W2 ~
int main( void )
" R3 i0 q9 Y1 m+ X* O# b7 T* g/ l& i
{
5 l; a8 [- @; q0 Y
" t5 o6 U, M0 m
/* Initialize BSL */
; m: v2 [2 S. y3 X
EVMC6747_init( );
( i9 a/ ^5 A/ g" N* e" y7 B
/* Call evmc6747_intr function */
+ P! o6 c" M$ E8 U2 c3 d, g/ P0 N4 @
aic3106_init( );
+ q' g' E) q9 d' O
while(1);
u! e( r7 q6 W B: @
}
, v K/ k3 ^) W& F& B3 `3 J
5 f# u# L! V7 U/ i; c( ?1 N) w
* z$ L. x# B* o2 t) f! J5 ?
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
/ I0 M4 k7 _$ O* I6 {
/* Initialize MCASP1 */
6 | |) U, O& e; V
mcasp = &MCASP_MODULE_1;
8 n' S. g% M( S/ {/ Q
mcasp->regs->GBLCTL = 0; // Reset
, e4 o5 @; v$ u+ i) M. y* a4 K
mcasp->regs->RGBLCTL = 0; // Reset RX
9 L5 N) y" |6 `4 N7 @
mcasp->regs->XGBLCTL = 0; // Reset TX
- r5 G- H4 o) ?' J2 i, W/ B' U
mcasp->regs->PWRDEMU = 1; // Free-running
7 L8 E' W; C8 ] T D; I
// configure McASP0 receive registers
7 [ T6 ]% i* g" w/ |. I" _
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
, a( v- E$ n0 C' M+ E
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
+ L5 v; f* R) @# e7 M" t
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
4 [' [: b6 Z, d3 X+ r+ \
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
) F3 i( [, K- d) E- z6 c
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
; W: u5 S1 l, u
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
3 [. y. u' a" z6 Y) q8 a) t2 w( J
mcasp->regs->RINTCTL = 0x00000000; // Not used
( z! R7 Y9 C) A
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 b, n& ], K3 B# Z/ o
7 c# a* `: o3 A
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
# Q0 h' H/ p0 M2 \9 b; n5 v/ _
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; X+ p" |" i0 s/ F( I4 f; S
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
6 H: A+ O; x& {0 I2 V
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
' H9 [- j+ b/ l1 f# S
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
/ ~) Q# s# n7 u: n6 q- E
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
) X* I9 X! }, ]
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
+ z" {4 k2 Y4 Z0 R
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
; s; S. l( P) r; t: z2 P6 t
4 d9 P/ z# d2 I- a9 T0 P& x
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
1 }) W, H3 q( U# s3 p' n
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
8 J' {* \9 T z9 P, Z3 Q
mcasp->regs->PFUNC = 0; // All MCASPs
( J- @3 k8 h& U
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
- @. a+ w9 G8 [6 V! ^6 M- r
1 A2 y* U5 }1 @6 o' B( p
mcasp->regs->DITCTL = 0x00000000; // Not used
1 {& ~2 A0 v7 q% y) f/ k* D5 i* y
mcasp->regs->DLBCTL = 0x00000000; // Not used
. H+ \2 M0 |) C* f
mcasp->regs->AMUTE = 0x00000000; // Not used
: L& H+ |# H. S4 \& y7 ~
O: e9 ` w) t& F
/* Starting sections of the McASP*/
+ e3 b5 `6 O# v1 M. A- B
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
q- F4 T( W# L* e3 x3 K! F2 |
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
- _6 X& y( t" o- z
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
3 g: Z% B3 ~) g; E- Q. `- C" |
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
& k& ?: f9 x& p* y! H1 q8 P
' D% ~( F) _( c$ D4 X: S# W
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
. b4 ]! a$ C$ `" o' }4 s0 w
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
" V% }+ a8 @6 e
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
8 J- R G" F, `6 A0 R1 b
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
& z' a0 x) p( M7 ~- p
- d6 V" u7 {! `2 `& x( @" w
mcasp->regs->XSTAT = 0x0000ffff;
# \' Z8 R/ |5 E* P
mcasp->regs->RSTAT = 0x0000ffff;
9 `- r# z- b1 F& P7 x
_0 S" }) p6 n2 C) \
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
. t* w' I- ^$ Y/ x3 J7 i. _
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
2 n9 V* o z+ w2 L9 e
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
) \! I z l/ ]' C# I. b9 P9 R
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
3 p/ Q" a/ H6 y7 E' L
6 i& n, c6 T# C" l1 i
/* Write a 0, so that no underrun occurs after releasing the state machine */
; @+ i! y1 i# q/ F( z' R2 I) S
mcasp->regs->XBUF5 = 0;
4 e) p) `) y& s
mcasp->regs->RBUF0 = 0;
: v' l1 F. r9 ~* F2 C
9 [) `% h& j; r; d
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
! X+ \& ]: c+ s3 h
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
: y ]0 q0 [ l2 \( o! \1 y
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
4 Z/ q; R+ @( g& N8 x7 `
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
# z# H! T, x2 s ? x' `
( P8 j# {2 x L2 x
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
/ W- O4 K' _8 X& n7 ?$ g
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
6 k( o" T% x+ S5 ?
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
' |1 g7 b. Z+ E9 h
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
3 Y8 z* B" [, E2 K; N
?' w5 z& s+ Y1 \; x. P+ k, s. B5 g/ D
CSR = 0x0000;
: h- E; d4 ~% `2 M/ k% J
INTC_INTMUX1 = 0x3d;
' K8 A' m3 c9 q5 y
ISTP = (unsigned int)vectors;
& d7 F3 \& s2 A5 V8 l0 O0 ^
ICR = 0xFFF0;
! z' T, ?: A5 I
IER |= 0x12;
# w+ l3 s8 Z% W5 R# \+ }
CSR |= 0x01;
: H) M( S" A" G9 |( I" f
2 M8 }9 H; d( h' V0 m
* n$ a1 b: l6 z
5 {& P0 d( u# o! R
还有就是两个输入输出函数:
/ d( V7 J$ k: K: _3 i
void output_sample(Int32 out_data)
) ]. q1 I \2 `0 G# b) @% U
{
8 L3 I2 p( T8 n2 e$ p7 R5 O
AIC31_data.uint = out_data;
/ l, |. p; p i. G4 S* \/ f+ a" k
MCASP1_XBUF5_32BIT = AIC31_data.uint;
+ ]# x& d6 S. G2 J6 s# d9 _, ?
}
, @% S3 x" V6 e7 V$ `
% |. c: b8 r ?2 U3 F+ s6 O
Int32 input_sample(void)
0 G5 Z; x, Q8 R; K; M7 q y
{
% N! u+ r' c% J( J9 U* H. V0 d
AIC31_data.uint = MCASP1_RBUF0_32BIT;
# x8 K2 h) L/ q9 m7 I" ^+ j# |4 h: G2 L
return (AIC31_data.uint);
& Q) `. D# ?, E4 z7 O8 M4 Y
}
& x/ s) `% l% i2 U# G4 m
! N% }+ x1 P7 u, U
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4