嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
: l. o& r# B: o9 U) b. K) a
main文件:
0 v u0 p: [" Y& Z
interrupt void interrupt4(void)
, Y: z, O+ P% T: F! L! |/ O9 ^4 p
{
8 b% v5 \' C3 i- ]
Uint32 sample;
0 C: K. H4 I& D% O+ N3 \+ s
. L6 D6 Y5 W+ Q- @0 N- v3 q
sample = input_sample(); // read L + R samples from ADC
' T: P( Y- v5 H) p _
output_sample(sample); // write L + R samples to DAC
! {$ F5 e# H0 R$ [% p
return;
2 `! U6 H0 j9 r- u
}
+ g0 T- ^3 t7 ~/ \9 D4 M
8 r* V! b9 w. V* Z$ E
int main( void )
2 f% F7 K" }! k
{
& R0 D7 w8 p0 ]. L
) X" @7 V/ u: E0 h
/* Initialize BSL */
9 U- s" S. v% D$ k9 T
EVMC6747_init( );
- f/ [# g4 V* s8 F( d5 s$ O
/* Call evmc6747_intr function */
% |: c. P8 c: A" N
aic3106_init( );
4 j. \) a$ ]5 e! s7 C8 O
while(1);
! ~* @0 B! o3 B& @* P3 C6 v
}
1 v r' C/ L. c+ {, n# L
2 y6 S0 Z9 b! H' q
! F3 u! s: R' y3 e3 T9 ?
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
5 e8 k' c8 }. a& H
/* Initialize MCASP1 */
% t n( N3 Z7 Z1 [* O. C" z
mcasp = &MCASP_MODULE_1;
0 ?5 M+ U! O4 }- |. g U$ Z
mcasp->regs->GBLCTL = 0; // Reset
5 M' Z% c! T: |! w, h6 z X
mcasp->regs->RGBLCTL = 0; // Reset RX
" C. ?2 {: Z. S% m; g! Z
mcasp->regs->XGBLCTL = 0; // Reset TX
" f* W. g) T9 Z H* M+ {. E
mcasp->regs->PWRDEMU = 1; // Free-running
) a" A7 i5 d: ?5 {) u* B: N6 d
// configure McASP0 receive registers
! z7 ]4 M `" y" M! \/ q3 A# @
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
* h8 z8 C) I" }7 v, y
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 u5 m2 Y( l- ?- L( L) m/ d& o
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
n; r: t& E. i! ^
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
. [. @! d4 V5 t2 W
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
N, l* e" {) O5 C3 _% n, [
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
7 ~% p% s8 ~; K) F; \% l
mcasp->regs->RINTCTL = 0x00000000; // Not used
/ B* l( `# E' w, E. f/ P
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
0 U2 Q0 G6 v: M) ^6 D) |# W! W
: E& r. ]: ^" D3 X$ p( |# C b
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
# d2 i: m9 ?9 l' n
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" a$ ~ V2 l% s+ `+ x* \7 P
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
& _8 Q3 S$ @3 n+ Q8 Q4 `
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
1 U0 v# ~6 ^. g! T/ ^( l% s
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
8 k# k W' R9 A8 T+ l6 L1 H
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
' A6 Q3 w# S3 |, V' u
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
3 n1 d' N7 G5 [# b; u0 T
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# a5 O! E- ~3 Q
Y+ a. r+ z8 g' V2 n
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
2 Y/ h" d4 B1 c' s0 E+ W* {
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
0 |1 N5 x+ Y. N/ A
mcasp->regs->PFUNC = 0; // All MCASPs
& h6 q7 X2 | w) o! j
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
: F# X" q1 T; P" o8 M
" |' r' _9 j! y. p! u: ?
mcasp->regs->DITCTL = 0x00000000; // Not used
* l' `; m3 `* H. I8 X1 g
mcasp->regs->DLBCTL = 0x00000000; // Not used
! z7 p0 h& `+ l1 S8 C) N7 X
mcasp->regs->AMUTE = 0x00000000; // Not used
4 i* k9 l" }$ g" w, f0 x/ F
$ T" k, J3 E# H; E: y% [$ e
/* Starting sections of the McASP*/
( c: u( O$ ~$ z( Z1 }1 |
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
/ c- O) P. [1 P, R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
# s0 O! C/ ]" W1 ]: f
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
& ]0 w9 Q6 M. K$ W9 F$ P
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
, l4 T+ M3 h' @8 l( r3 R4 v
, w4 C- |; k$ g2 F$ v2 n% P
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
l& L$ Q! d$ `& Y: P7 b: J4 N
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
+ z# n$ t7 A3 [
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
* ^, H( j6 q1 f. X3 o7 g9 E2 [8 B
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
6 F) u' [: X- A" ~, a+ w8 G5 H
: o. V" L/ {& c1 V
mcasp->regs->XSTAT = 0x0000ffff;
& r2 i; @0 Z: g9 M2 N' e& y Q
mcasp->regs->RSTAT = 0x0000ffff;
, P: {/ ^# q! ?4 I1 }
# \4 }6 e" w' r6 h W
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
f( L/ J U, @3 I0 u
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
; ]! U+ z5 n' ^
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
# c; M% }" ~& X/ [, |9 s
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
; G: N) x3 _7 i1 f$ c" l7 H
/ E+ H V$ `/ k) i5 ^5 T9 m
/* Write a 0, so that no underrun occurs after releasing the state machine */
% L7 `0 J2 O# A, a) n9 f3 ` S
mcasp->regs->XBUF5 = 0;
* l7 K! x8 a% g+ @: R
mcasp->regs->RBUF0 = 0;
' G( F& \) t1 W- G1 a, ?0 u$ i
8 p" d* {( k0 h
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
9 D0 u5 _1 t7 S9 A
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
( ^4 y$ w+ S9 F, p) W- Y2 _
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
D. W2 B$ H! z; |, w0 x1 {9 H2 p- }
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
9 r, b/ x& n2 g! g/ P# Z1 V3 f
* B; j9 W1 F- J
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
8 c8 ^9 Q' e- R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
8 \; |1 y5 M: S' u) R [( O
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
# w S, q& W, m( }: r N
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
! R; s& I7 v$ Q# z
! v- d: g; @6 D6 p [# c. E) k
CSR = 0x0000;
3 V% |( m' h7 W6 E( @& \1 Y4 s
INTC_INTMUX1 = 0x3d;
8 }# \9 d5 j: K% K5 [: \" Z1 R
ISTP = (unsigned int)vectors;
( K( `5 ]7 P! Q6 U9 m& ^/ o
ICR = 0xFFF0;
. C1 f1 n) a7 ~
IER |= 0x12;
# T, J. D2 a, {( U+ A
CSR |= 0x01;
5 `0 t; p1 b, }2 `: c2 o! W0 H
% y U% Y- [0 U* d% O: v* A- {
! l& c) D! K2 [# n7 L1 O4 `
3 r3 K- w9 Z6 F4 C/ t
还有就是两个输入输出函数:
% _4 A! {" ^" S4 s
void output_sample(Int32 out_data)
& z6 D! G9 s2 p& F
{
& f! z6 e+ u6 O' M( g- ]2 |. q- C
AIC31_data.uint = out_data;
! t. @5 y. x! N, ^0 U1 E% |
MCASP1_XBUF5_32BIT = AIC31_data.uint;
5 a: A) t+ a# g* \
}
# }3 q9 K i" F
8 S) y; S( ~1 C
Int32 input_sample(void)
- \; t: W! j: r& N) O
{
: X$ v- d: x5 [- E% w; ]
AIC31_data.uint = MCASP1_RBUF0_32BIT;
r1 g( m( x0 | B; C# K
return (AIC31_data.uint);
" h$ H/ ]7 l m" u2 o
}
: l% F4 o" A9 S+ a
2 ^: p# O- [) ?) ~. W4 X0 h
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4