嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
* z( y/ \+ R, C$ t
main文件:
! h5 E5 j% Q( |6 A
interrupt void interrupt4(void)
+ z+ }; `+ V8 r4 Y8 ~6 b% g
{
4 b' K: N- W8 U1 v% W% Z4 l/ w
Uint32 sample;
2 A7 a7 ?- J3 ^1 h
' Q, W& P2 c. |, ^
sample = input_sample(); // read L + R samples from ADC
8 f; R7 E2 N! v, _% S
output_sample(sample); // write L + R samples to DAC
/ s' @1 y. S) G1 J
return;
4 t# I8 o) ?! g0 j- @
}
: @* o7 C! Z- A$ A9 }. n
( H5 c0 w" n# w# p P
int main( void )
, R9 d3 u2 b* Y0 {9 b" J4 m
{
$ P8 j' `3 R( c. ^& t
6 V3 |; z. i" X: I* _# v% i# p1 L
/* Initialize BSL */
8 H: Z2 ]! Y0 `. D
EVMC6747_init( );
5 a; [& c, V2 i
/* Call evmc6747_intr function */
; {4 r$ l. @3 K
aic3106_init( );
7 i( \) v6 ?. F; p8 F* z
while(1);
- q- q: q$ r$ Z
}
1 D4 q8 L" P- l; k7 W
3 K$ O; D" `+ N) S( j8 j e0 a
0 F1 [- }# S3 \! g
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
. D/ g1 R3 V: ~( W" l4 b) b+ G
/* Initialize MCASP1 */
! `" |1 g4 u. }+ N
mcasp = &MCASP_MODULE_1;
5 K' y2 J" o5 ^. R- M. U
mcasp->regs->GBLCTL = 0; // Reset
1 q9 c: p0 V! _* c, h+ \) O
mcasp->regs->RGBLCTL = 0; // Reset RX
' b' x! b Z# [' U
mcasp->regs->XGBLCTL = 0; // Reset TX
! r. C% g6 e. I5 O
mcasp->regs->PWRDEMU = 1; // Free-running
. @, t. r M- }# ~9 b
// configure McASP0 receive registers
/ z: N$ @6 q2 s) c; M$ F1 |
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
9 U. D) n8 U, T& W) w9 k
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. R$ j" L1 V& j" C
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
8 r; C8 V! `- p! K4 J* M6 R5 t
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
* h- j: O2 }/ L
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
2 O2 D( P- w) |' p
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
8 O4 H; l+ g) J* N' _9 h
mcasp->regs->RINTCTL = 0x00000000; // Not used
4 Z# h; S; M$ E4 w
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ e4 h, F$ U* J1 u& H4 W% w) J
# j2 S1 p, T& q/ r) l
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
- v2 ~- \% l P: L, F5 B! e2 e
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; W5 ^4 u" K |8 y) g
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
5 E4 [, o0 C9 |; W; I
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
: s4 e. \# k) S, K3 ?0 a
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
: R4 R# ^2 }/ |( f% G, A! y8 b
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
8 T* N! c9 V- N" A: |9 J9 |
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
" I4 ]0 [& h/ Z5 n
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 b: l# x! l2 I9 m! w9 ?8 E. F. n3 ~
3 w: h; n! `) i- s- ~" |
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
) h0 N6 ^/ X2 v: L; }4 Z$ x
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
# H) i4 z% W: s+ e+ E8 t8 b
mcasp->regs->PFUNC = 0; // All MCASPs
- v/ H v$ P8 N! {* Q K
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
) K( Q0 V9 _* `+ f
* o; g% Z1 i) C( M) n7 P+ p
mcasp->regs->DITCTL = 0x00000000; // Not used
- R" v! t4 c; [( P: \) `
mcasp->regs->DLBCTL = 0x00000000; // Not used
( o H, h7 u) l9 i
mcasp->regs->AMUTE = 0x00000000; // Not used
) w p$ o9 M' h; D+ q2 e) K: J
6 k4 R5 T4 b0 E; n
/* Starting sections of the McASP*/
9 \' ^, _' F3 g; x" L: N
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
. y' `: h! N+ W' @0 `
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
0 e0 v) n- d5 R3 U: A+ ]
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
" z% W; f7 n9 R+ r9 f4 O" `
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
1 y9 M# c" w( _/ e6 T9 y: f
( R* Q; Z3 Q. G: R2 R
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
( [: e$ ~* d, ~& y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
" C# ]$ p) _7 D: F7 r# Z
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
* A' s$ J" `$ g5 g, r5 e
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
' ]' A# w0 c% ?
' v/ b& [% T0 b- h4 p J2 u/ A" X: L
mcasp->regs->XSTAT = 0x0000ffff;
" v' b9 e# c# ~2 q, @+ }
mcasp->regs->RSTAT = 0x0000ffff;
* x( ?* e; g7 S- u2 d P3 n
* i. w4 @. [9 Y& C
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
# s* H3 H7 C7 ?) Y; l( u
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
1 N9 Z3 T& H( W& m0 n6 ~' M
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
' N) d' a& T5 _+ t% S
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
. ~8 Y2 l( \: I1 X% y S, P" P- L
9 `3 D9 l0 s2 d" I% s
/* Write a 0, so that no underrun occurs after releasing the state machine */
/ ^' M2 J! ~) T2 B
mcasp->regs->XBUF5 = 0;
( B! K' S# Q% D, ^: K- G8 k/ K
mcasp->regs->RBUF0 = 0;
# L1 i @0 i8 W3 C; r# s
5 P$ B5 I4 k( u3 k
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
1 ~9 R U6 I* b
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
3 m8 |7 Q0 a+ m
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
0 K% E# C! k) Y' j8 O; a$ K
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
+ F, @; M7 J7 V8 l) C2 g
6 k/ |6 u& M" j: Q! g
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
$ Y- r# o' d) d/ `$ t# Y0 h
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
. D! J t8 K) \( t
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
6 c0 Z7 p' F3 P8 ]6 k$ x* U
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
3 U+ ] O6 N5 n- d0 h
/ U8 H1 _5 A4 s- L, [
CSR = 0x0000;
/ f6 A9 G" k4 M
INTC_INTMUX1 = 0x3d;
6 ~9 f: ]) L9 n" J+ h$ y( A
ISTP = (unsigned int)vectors;
: q- i6 f( }% N* _: ^, r6 |
ICR = 0xFFF0;
/ A$ J5 j' z4 W/ v8 G
IER |= 0x12;
8 G! B3 P4 A& j- ]3 `, t, q
CSR |= 0x01;
- d8 W# Q# l U. c; ~
) `9 m' A2 i! J( m
; N q7 F/ s0 @# V. q3 K
; M3 k2 @( _4 J/ X, U0 }4 d( f7 C
还有就是两个输入输出函数:
9 F3 q0 K7 J9 {
void output_sample(Int32 out_data)
& b& Y/ o9 j* U h6 q9 c
{
5 f. F- _+ I/ I- M
AIC31_data.uint = out_data;
D: I$ x7 ~' J
MCASP1_XBUF5_32BIT = AIC31_data.uint;
- D. R1 t, l4 D9 f4 w
}
( ?. E$ Z" \/ e/ Y
* u- X: P# W3 d" f& M
Int32 input_sample(void)
! C% N2 j# V Q/ u
{
" r- j1 c6 x9 S* z
AIC31_data.uint = MCASP1_RBUF0_32BIT;
: M( ~7 V& @" H; P1 p
return (AIC31_data.uint);
' h# G; Y5 O, K
}
) }. Q; A- ?0 |; B6 p
" a- Z' ?# N& e! H3 Y
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4