嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
) }5 o1 a* H* A. U( c. b3 H
main文件:
+ V- M& I1 u# x" S$ v3 A0 R
interrupt void interrupt4(void)
& [6 v& q. ~& n4 {# f: v: U
{
- b8 i) B5 z9 l) `8 Q b& x
Uint32 sample;
( E. I( }7 s1 P% J- Q
( ^1 j" g" ]6 K( a5 X7 c
sample = input_sample(); // read L + R samples from ADC
% y4 r, R. g; J/ }0 A. r* J1 P
output_sample(sample); // write L + R samples to DAC
$ D( L7 |/ I1 S! f* j F K+ r. Q
return;
4 R% _% g* w# F0 Q- O
}
6 |3 ]9 W) Q# _8 a
! H1 O6 U6 J0 j$ p) V2 q
int main( void )
. b0 o: l j4 Q* B |' k
{
" K% k$ I' E5 T
( ^5 T' n/ J& v- d5 L
/* Initialize BSL */
- R/ x: Q) U4 q" Q5 z8 D7 l4 X
EVMC6747_init( );
# B' }8 w! z5 |0 T6 i1 ]7 H+ }
/* Call evmc6747_intr function */
# ?' ~4 l8 B! B& r/ d! g, d% g
aic3106_init( );
! y1 l2 j' D1 a, C" X4 W( Q
while(1);
3 N" g# [4 V: D/ V+ W/ `$ [1 _
}
* W3 p* y n c0 r+ r. P) B
5 K) p# n" g2 S) \. h2 |, R
3 X" G! O4 m5 f4 I2 y
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
2 L4 V- G$ E( N# Y" b: X- X2 h
/* Initialize MCASP1 */
4 {3 q% c7 d) ~9 p' @
mcasp = &MCASP_MODULE_1;
8 C# A j! g: \- {7 U. e6 Q
mcasp->regs->GBLCTL = 0; // Reset
" _# s. {7 p1 B3 O1 n3 x3 e8 U1 |
mcasp->regs->RGBLCTL = 0; // Reset RX
' X4 t! P. @% H4 h
mcasp->regs->XGBLCTL = 0; // Reset TX
' a+ E; E" ~7 n/ I* J
mcasp->regs->PWRDEMU = 1; // Free-running
1 b: Z y1 O1 S
// configure McASP0 receive registers
& a* U6 v) r/ c5 n3 ~
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
! t& t2 e9 N# s6 }, h; H5 @
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 ?$ h6 n8 J& m/ d _- c
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
# i$ q( o ]/ R. @6 |0 W- s% J l8 F
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
5 N1 X! w; o1 S2 t( a+ X
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
% T5 z4 c: a8 i, K- p6 I4 c3 [* [' N$ B
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
+ p) O4 x$ t7 k; D7 r, `+ i/ e
mcasp->regs->RINTCTL = 0x00000000; // Not used
/ l+ k3 O1 p/ p. r1 y6 k) z6 Z
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 C0 S7 y- M& c) t' D
& K5 Q9 J" L" b. B" I2 Q7 h
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
' D" {' P9 Y8 i3 D
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
) O [, p3 B! p% E# H1 F
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
$ Z6 M+ n0 \, Y) d
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
4 I9 x6 a! _; b7 f$ u8 `
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
& Z! [( O$ q! [! O5 v* B0 z
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
, _0 ~4 T3 H# Z- D7 H, {6 `3 a, {6 z
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
6 d& Y# [* d7 W3 e+ L
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
- H ]4 d; l' ?4 S: {: J2 u
$ _( q$ Q' A6 l! w; s* ]2 v" a
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
7 w9 v p5 J4 p/ _! e( ^
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
1 G6 b/ Q& L7 }2 i$ X' e' K
mcasp->regs->PFUNC = 0; // All MCASPs
8 F( z; K3 c! G6 S4 C
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
+ U B0 @) B# h; X9 h$ f
4 A) f5 [7 J. H7 W( t% g; s
mcasp->regs->DITCTL = 0x00000000; // Not used
6 D/ c: h: A, O8 r- c4 G
mcasp->regs->DLBCTL = 0x00000000; // Not used
+ w3 k8 R' K% }
mcasp->regs->AMUTE = 0x00000000; // Not used
$ T1 @, ^+ G. K% h# \) y
9 e y. p6 p- B6 T
/* Starting sections of the McASP*/
0 ^6 V8 d, s _6 e8 E% \3 R
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
1 Z& u: l6 ]' ^( p5 J+ P
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
; C2 q& \3 Y! @' j% Q! s7 \
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
2 N. y% h+ x2 Z3 M/ U+ T
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
3 P8 P2 E7 b: @$ J8 u* c2 G
; f) Z. ^8 ~3 Z# I
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
) K& G( z3 D* d$ H7 n) O" ^
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
1 C b6 Q# e2 U% S7 w
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
% T! i" j4 U4 f8 d
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
5 z9 \3 M3 F+ S% [; I, f; W i7 m
j c/ Z3 M8 D- O0 [
mcasp->regs->XSTAT = 0x0000ffff;
- ~7 w. y5 x6 U
mcasp->regs->RSTAT = 0x0000ffff;
% M0 b, i) e* [5 W9 m U* H
6 k' f$ ^$ | O' b7 t% O8 m; _6 H
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
# `7 ^) s3 o+ ]0 e9 ?. Q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
, k8 }& @* ?' F9 j( q- E
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
' M2 }7 H q+ n6 u2 Z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
( `6 n1 U. E1 |3 d
* ~8 t3 `9 `+ o4 c: L, ?
/* Write a 0, so that no underrun occurs after releasing the state machine */
b- N- {! c/ [9 W2 ~3 g
mcasp->regs->XBUF5 = 0;
, b; @5 @8 T' e" U( w' \8 |' O# L* J
mcasp->regs->RBUF0 = 0;
: h/ Z8 J0 ^- d: f1 n$ r4 a4 ~
% j y$ p% |' `5 c5 F+ A; L
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
) ]1 d* G& u8 l6 r# m5 }8 y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
7 b/ k" C0 p+ D: L
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
9 g" U& Y6 `$ s" N/ C
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
8 p( u8 D; e# Q: m' U% l3 ^5 S
2 r/ Z4 t+ G0 l0 O7 s. Z& E v7 c
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
% J/ H; ~% p% e
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
) ? l1 w& F, }. O4 v
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
1 B" _3 n) _* I. N# j0 A
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
# y* M# X, h: i2 @ U
( N+ ]5 h' C5 h$ Z9 k8 S5 S0 V
CSR = 0x0000;
6 p- W( K) p8 P& |9 W3 Y! t) D) n
INTC_INTMUX1 = 0x3d;
/ H; A8 p) v# u+ g6 i0 ?+ O3 A8 n* V
ISTP = (unsigned int)vectors;
0 R. N b* `5 }! r3 o B
ICR = 0xFFF0;
, x# [( D" |$ S& M% u: D, ~4 K% [
IER |= 0x12;
5 g8 W1 p) V- s' C; |6 [' b; }& G; p8 A
CSR |= 0x01;
2 v+ y2 l& A* ^( p3 k" w0 l
+ K4 W( s6 W$ I; `5 w
& W% r Y6 n% x) m$ y
! h7 Z! x/ B- z
还有就是两个输入输出函数:
8 U5 }8 Z7 n% X) e
void output_sample(Int32 out_data)
# C4 U( c, s) `. S1 r; A+ Z( K( w, Y
{
$ H/ m/ T" G' j! V0 u; F7 o
AIC31_data.uint = out_data;
( C2 g4 n0 ~8 X4 B2 N
MCASP1_XBUF5_32BIT = AIC31_data.uint;
# K" }# ~- j! ` [
}
' o# J3 N& O6 h5 E- o
8 J2 K0 ]( X; O6 B
Int32 input_sample(void)
+ E0 v& p9 c. |7 p% }3 S8 \
{
9 R& h2 M# M1 s% a# {/ V' W
AIC31_data.uint = MCASP1_RBUF0_32BIT;
& b- {4 Y5 m: n; x
return (AIC31_data.uint);
' A' T3 K2 m$ G+ g. c' W2 y
}
7 k' W" B! O; M4 [9 E1 A
7 @0 Y1 b2 e" [. Y$ e2 i* b' |
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4