嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
* z' e, D0 S/ x
main文件:
$ p- A, D& d. m8 c+ t
interrupt void interrupt4(void)
0 O! P. n/ x" n
{
( u+ _2 |7 x6 f$ H% L
Uint32 sample;
+ b6 v. T# R& h; G; O3 f
: `! W" _9 L- ?4 m3 q
sample = input_sample(); // read L + R samples from ADC
% J: @) Y8 A5 \( }* T% l& ?
output_sample(sample); // write L + R samples to DAC
) k, P' Q$ l/ ^$ C1 ?6 m
return;
/ y' _9 y! m5 m0 m
}
% r: I3 Q' v3 n! n+ U
2 ?$ r8 O3 }1 h3 |0 y
int main( void )
* _( s+ T' @4 L0 r
{
4 A: [5 M# |) r- z4 J8 @& [! T
4 b' q+ T( `: Q# C! p. T
/* Initialize BSL */
/ A, A8 H. A) ]6 B |
EVMC6747_init( );
9 X7 n" v" y* N" Q
/* Call evmc6747_intr function */
- d% W. V/ Y+ h- ^/ X" @/ [
aic3106_init( );
3 [' m$ y( N' s3 j8 c& R l
while(1);
% p: ?. D8 S3 U4 a+ m: ^
}
8 M' `, j7 D- d
5 s( J& ]+ h K4 u0 y( ~
: s @$ B+ s2 p; P" ^: ?& b0 l
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
4 ^$ l8 u; O/ a) F0 C- |
/* Initialize MCASP1 */
0 o; Y% Z8 V( j" N" v5 T, L! ]
mcasp = &MCASP_MODULE_1;
, a+ V" B1 W. \# L) R4 |
mcasp->regs->GBLCTL = 0; // Reset
8 H- N1 u7 q' j
mcasp->regs->RGBLCTL = 0; // Reset RX
& f7 W* S+ M. c
mcasp->regs->XGBLCTL = 0; // Reset TX
% Q) U' e6 L. _. v4 h3 ~3 _
mcasp->regs->PWRDEMU = 1; // Free-running
+ O- W7 ]& Q/ |, J3 y4 R I/ v
// configure McASP0 receive registers
: S( ~4 i3 _; m0 h; I4 w7 N7 ^- G
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
2 B3 P% W! b1 [1 `0 S3 N
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. ]4 s4 I. w. _$ ?. m' R G
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
9 O' H% A* A: G4 V" q
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
- }8 s% y1 m5 z% S
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
/ L9 C2 j5 h4 O" k
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
. E1 n+ X! }& q3 M8 A }3 `
mcasp->regs->RINTCTL = 0x00000000; // Not used
9 R7 g% ?* I! u
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 B* y' D; C" J- X: j0 t; Y* N) Q
0 j% I6 r# |) C+ i% P. q$ p
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
( a, l+ r8 h1 e4 N6 V( W
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
) y; d1 S9 @0 O1 J
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
. I/ ]1 O7 P# d; `' y3 i$ `
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
6 q6 U$ Y$ p- e) d8 n
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
# e" \9 x5 } v, Z& T/ Y3 b0 Z C
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
- f+ }# C8 _9 }9 N
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
: G: q6 h6 h. ^1 o ^4 r
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ [* T" J: T3 m- C7 e/ A
1 ?3 W# _, ~6 o* x+ ~+ b9 L0 B% b G. e
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
. r' {, m% y6 w/ |# _
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
' h# d6 M0 u4 W. C
mcasp->regs->PFUNC = 0; // All MCASPs
8 ~" u6 \) O' R" `! t, F: j
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
8 M3 u* j' \% ~+ |* w
, C9 N" F$ r3 g5 k7 x
mcasp->regs->DITCTL = 0x00000000; // Not used
* }6 Q3 x( q4 S9 {
mcasp->regs->DLBCTL = 0x00000000; // Not used
* J) S, J5 f9 e! j( T) V, L
mcasp->regs->AMUTE = 0x00000000; // Not used
/ d: i/ Y4 c6 F' y+ [, F
4 X4 |4 b; s" j$ G3 F3 y# N' V
/* Starting sections of the McASP*/
: `! m" P: |4 Q4 g
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
) S" D ]1 G' q2 K- K5 W- i
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
7 N- B/ L% p( e) h; w8 O5 t
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
1 H( s) S4 ]$ ?5 y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
0 X5 U2 E1 s9 ^
8 X0 T+ o. c6 l4 S
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
/ H# h3 v! O2 d) T& l
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
: L; X; I8 M' U1 B1 j3 p7 d" l
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
6 u# o, O9 N1 l. {' ^
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
3 I' o% Z0 z. O+ T4 R( V$ M" v- r
" r) C( D. {# }6 S. p) V" V
mcasp->regs->XSTAT = 0x0000ffff;
! n' D" g" k v3 L! O8 \, R, V. r
mcasp->regs->RSTAT = 0x0000ffff;
7 B9 w$ [5 L3 g- L0 ^5 J/ ?2 s
& y8 q% u9 k; Z+ {; |) @9 ]
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
- P+ I$ T& r- ~0 R% m
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
1 ~0 C2 F' T3 X3 [/ s. f5 W
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
, E( p" [2 }- c. v
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
- U% H1 O, m$ v
4 b$ \: b9 @# C, O1 r& _
/* Write a 0, so that no underrun occurs after releasing the state machine */
- ^/ S/ I2 E9 k5 k
mcasp->regs->XBUF5 = 0;
+ ]7 `' M2 H9 Q
mcasp->regs->RBUF0 = 0;
: l: ]0 J- j, e! Z$ \
5 s# | e6 M' h2 u+ V
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
! }4 z e* ~* t# b* ^
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
- {$ [! I9 v0 r: M m
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
* Z. [$ X" {" N! g( x
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
' f5 X+ h+ f- u9 f2 R/ l
' v/ h1 l0 B1 l7 m# @! R, _
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
& M, B2 _& w0 _$ I1 _
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
/ [6 w! _$ u; J; V; T2 s
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
1 P4 O, m- x6 w6 o% K
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
0 E: {) h/ M. ~
- @( r5 K0 L; n
CSR = 0x0000;
^2 I: ]% F0 w" p& k: Q
INTC_INTMUX1 = 0x3d;
1 s O# O' ]! G# c
ISTP = (unsigned int)vectors;
5 H4 Q' R, N9 z/ S3 g c8 E# j, I
ICR = 0xFFF0;
6 K3 z; ~; A& `
IER |= 0x12;
$ R/ W; S* y6 R8 \' z3 |
CSR |= 0x01;
2 k' H4 L& m. G! T7 D' {
/ f8 d8 B ]7 f$ Y8 H; x1 k1 w9 Q
' Z4 V& a" o+ r N
/ b% b8 l8 M7 U" e5 s. |0 ]
还有就是两个输入输出函数:
7 O7 M1 V4 W1 A! L; F. v0 y9 ?" e
void output_sample(Int32 out_data)
4 i8 m. W( r- X% C+ B
{
$ Y" D/ H( x2 n, f2 O. g( H m
AIC31_data.uint = out_data;
0 J7 [! J/ b! }1 B# u* q& m! c
MCASP1_XBUF5_32BIT = AIC31_data.uint;
% h1 \9 y/ v% w1 y0 N1 J/ N
}
+ j# q* N7 F+ F
! |0 H: c9 F9 k) _7 Y$ F
Int32 input_sample(void)
# O2 r& z0 ?3 y/ U) _
{
; n: I4 G' a; h$ J
AIC31_data.uint = MCASP1_RBUF0_32BIT;
1 p0 e+ y- w3 k/ a- ?$ X3 C t
return (AIC31_data.uint);
8 w/ r5 N9 `" @( z
}
/ N2 d" `* |% X; s) u+ e2 S
/ d0 a2 x6 r& X, x5 R4 p) g& t) \8 ?
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4