嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
7 J+ ]/ _, W5 U/ x
main文件:
' E! T# O% i2 ?& Y
interrupt void interrupt4(void)
1 y7 ~! U% O' L
{
$ K. u9 q5 G! s* p* _+ ]/ k! O+ U
Uint32 sample;
% u* w9 u6 W3 s+ L
7 C& k2 J/ y0 ^8 b7 g1 n
sample = input_sample(); // read L + R samples from ADC
% c; r: h0 z6 e
output_sample(sample); // write L + R samples to DAC
* E6 E: p; ?' P" P% Q
return;
) M, @! C7 C( Q- O5 [
}
2 x% S4 y+ v0 c2 \
4 d, O- q2 `8 X+ s6 ?4 h
int main( void )
- u% [0 |2 T3 G* k# j1 E- k, W
{
7 y+ D; g0 c7 r$ A$ {
% R, g9 s2 i; K& X& i
/* Initialize BSL */
4 v4 F7 f- \7 O( N
EVMC6747_init( );
" z9 `7 M# \! c8 j9 s) S, D
/* Call evmc6747_intr function */
; w3 @0 K5 ~! n+ y* q
aic3106_init( );
G1 B: h$ S' N/ X; @
while(1);
; }7 Q* F. @! ?- A% T0 p" w
}
# Q: H) a$ I% A7 f. \$ k
2 I( x3 X$ c6 q/ h3 ^: b
! P& p' R' d- B$ ^; j- R$ t
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
! `: M( u- q& F! j- ]" a& f$ b
/* Initialize MCASP1 */
3 p" ^ N$ A3 B* g7 }
mcasp = &MCASP_MODULE_1;
. _. f* s6 B" B+ r8 m$ O8 @
mcasp->regs->GBLCTL = 0; // Reset
4 e/ { u$ P5 e3 n+ P( W
mcasp->regs->RGBLCTL = 0; // Reset RX
6 U/ g1 j6 ?: F6 _7 c7 \
mcasp->regs->XGBLCTL = 0; // Reset TX
3 L, _: V' ~6 p; _
mcasp->regs->PWRDEMU = 1; // Free-running
( n( o J1 {2 f" f. f. E" E
// configure McASP0 receive registers
* y& c6 m1 |, K0 L5 r
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
$ b6 C' U' i, |# ?" R3 I/ r) d
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
$ f- k" y) o! [' g9 A
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
4 N( x9 O* t# Q8 M
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
; U; G$ g, T8 P; u
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
6 z1 K3 h1 R1 @6 F. A6 K" f
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
. y+ B. \' n7 i( c" W& h3 |) J4 B
mcasp->regs->RINTCTL = 0x00000000; // Not used
" E- `. W, b; X/ Y5 D( t
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! m5 @8 K" q% X! ~8 v* `
4 K! F& |/ `5 J" W: L& u S
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
6 h9 [1 w! H; R. q& x1 G& N
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. ]% g; _ O' q7 K+ d2 O& ]6 p
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
/ W/ J0 N3 O' _! U
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
2 y5 j2 ? \( f
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
% B$ K$ ~8 {- W, ^0 |& _$ c: y9 y) X
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
+ Y4 b% b& L& N5 _0 B# N
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
, a1 h- C& H2 \3 k& W* p9 B6 f/ [
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 ~3 j9 |6 h: g2 b6 m: H5 b5 l; C
4 s! n8 [6 g3 O+ Q
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
; g. [2 ^5 \& O* N; K4 p
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
: _. Y- W3 K4 J4 ^3 W3 R# h
mcasp->regs->PFUNC = 0; // All MCASPs
' W3 ^- ?) m; `7 r! F
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
# L3 ^$ o& m' t" m
6 B- e1 o9 J+ W
mcasp->regs->DITCTL = 0x00000000; // Not used
& @! U, E* ]/ _0 l2 D
mcasp->regs->DLBCTL = 0x00000000; // Not used
6 S a: w6 N+ G! @7 |- U
mcasp->regs->AMUTE = 0x00000000; // Not used
@% [3 j) e5 t. _" k: T1 ~
; v! o0 [2 _9 h6 ~' _; U% Z
/* Starting sections of the McASP*/
5 {/ e+ t" c0 k* q6 B. m8 G
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
: c8 |$ L5 x- q# Z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
% j0 m6 ~4 A/ B9 \$ R0 Z
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
3 h8 c$ e/ I, F- \6 V V5 {
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
! M6 F3 t2 T6 f- T- V% v/ p. ?
3 d6 v! g2 F! O' o. \$ o( ~
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
}! m1 S; E M( D: i( d! B" [ W
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
. v. P+ A" `6 [5 }9 S
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
+ p9 w5 D8 @ M# d& W! o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
, b: z. X' D1 n4 _8 ]
- y1 |4 l/ D! b5 v
mcasp->regs->XSTAT = 0x0000ffff;
! o! d) s. E5 P& o) V3 W
mcasp->regs->RSTAT = 0x0000ffff;
! [& K0 k' K1 z
* E" a. E6 u0 o% \6 B
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
- S; a6 K# p/ V. d/ U9 ]% Q: j
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
# ?: @: ^# d! }5 l4 X
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
4 m7 c% E% X' a
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
, C* k0 B, G! [: y. r) h6 o7 w% c
, O. A$ t3 G+ W; R, ^
/* Write a 0, so that no underrun occurs after releasing the state machine */
) A J: \/ N6 N; _" T6 b
mcasp->regs->XBUF5 = 0;
- d+ {& f4 j) ?( N. W/ D, N0 D
mcasp->regs->RBUF0 = 0;
) `1 C( Q0 g. h* D% Q/ z
- D1 G3 F: H; N4 | l" ]
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
3 A8 S" E" ^6 b+ }: o1 d' j; @
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
7 r7 Q5 N; n0 m6 \( Q" m6 `
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
% J) `4 {- X4 m: c! Y S+ i5 V, a
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
3 ^& ]) d4 w6 F: Z
: ?1 r/ l" c" q, ?; E- B
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
' S! @6 S' ~3 ^/ c3 f: ^$ v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
* s' S+ o& e4 _6 R3 t
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
2 d0 M- A- z8 X/ w- r. Y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
# z9 r6 m; \8 T1 }1 ?' u
' c, p! t B+ W M/ I" v9 p6 K
CSR = 0x0000;
2 t% A$ F5 S4 }" J
INTC_INTMUX1 = 0x3d;
; o: C+ l) z8 P( u& @
ISTP = (unsigned int)vectors;
, `2 ]! B( V# E: r" F
ICR = 0xFFF0;
* @8 y! _! I" b$ D$ G0 _
IER |= 0x12;
/ y ~+ A/ ^6 b0 h: Y' o8 b
CSR |= 0x01;
" {. M) N" j2 K! g
' J, j S0 w4 ]- B& i5 i
# n6 \8 X9 j% M+ L# a: o
" i: [4 ~3 `) I0 @$ j" }
还有就是两个输入输出函数:
9 R# F6 B- W) A- j
void output_sample(Int32 out_data)
! I1 [0 I7 b, I
{
: f! q' d9 M" s& y( N u+ u
AIC31_data.uint = out_data;
4 O& q! F/ d. g; @$ n
MCASP1_XBUF5_32BIT = AIC31_data.uint;
5 T( `0 s! l# V
}
/ l* k) l6 z/ j5 e' ~; n
@) I! j b) u Z% f% n8 w
Int32 input_sample(void)
2 }6 j0 f0 ?) g1 b( s. d! {) A7 | P
{
2 r+ {& |! b4 @; u3 F' |; L! y) t
AIC31_data.uint = MCASP1_RBUF0_32BIT;
* Y$ u, i8 k& {/ K+ w# R
return (AIC31_data.uint);
# m0 s1 j1 M' f4 H" m* h
}
% q% U: q8 ^8 ] J+ B( U
6 s/ d9 O/ m6 P6 f) Y. W
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4