嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
* r+ e/ }* H. s m9 |
main文件:
& v" D$ e1 Z% s) g& p
interrupt void interrupt4(void)
# y& }7 _0 @. V
{
( Z% ~& a8 N7 [3 M4 d
Uint32 sample;
, E+ E( v/ }2 i: @( q% u
4 ?& o6 b+ M4 X4 z3 N) L2 T
sample = input_sample(); // read L + R samples from ADC
7 R% H* F! E3 q7 T+ l4 Y1 v6 X$ Y
output_sample(sample); // write L + R samples to DAC
' A% Y ? g6 Z5 k
return;
4 t' [ u1 u5 q. i0 U
}
# h, D: n3 o5 z6 h0 c g
7 G; w- y" {# E) r7 Y/ F- y
int main( void )
1 L3 f0 {" p, k2 g8 m/ h
{
% N, e! o, t( w+ O0 i! b
7 J4 [5 E; L0 ~# M6 R+ S* e, Q8 A
/* Initialize BSL */
1 ~+ h5 j$ x% u, u* q
EVMC6747_init( );
1 o3 W" ]7 C! z
/* Call evmc6747_intr function */
! ^. d' [9 P g- q6 `5 i3 [
aic3106_init( );
k3 r5 b4 I) k
while(1);
9 }+ o, q' I' g) a0 H7 ~$ l7 d
}
" O( k$ l: r" ^& w. Q
, ^ ~! u% p2 P+ _0 {- H# b. ]
) _0 H) G+ O5 B
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
2 {. e6 Q( z0 h8 t
/* Initialize MCASP1 */
4 U6 X: W0 F( D7 _6 m
mcasp = &MCASP_MODULE_1;
, f4 v: m" Y1 g; e8 x/ j1 v' O
mcasp->regs->GBLCTL = 0; // Reset
9 a3 O# D3 l8 F- P: Z8 H
mcasp->regs->RGBLCTL = 0; // Reset RX
; _) |0 C' b. O* `( M# T
mcasp->regs->XGBLCTL = 0; // Reset TX
0 N( |5 m+ ]. b, c9 A. y* G
mcasp->regs->PWRDEMU = 1; // Free-running
/ l( ^' q4 s7 [! b Q
// configure McASP0 receive registers
7 c! S* D' J1 Y6 D% W* h+ s2 t
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
* K: c `! Q7 ~1 j
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
$ |$ Q6 V0 z, W
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
1 D% O- K6 L$ `3 V0 U
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
9 a# s1 l, N9 m9 c5 a1 b
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
( o! _- f* w8 G2 o
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
9 e# y) v- K/ x- [ M9 n* C
mcasp->regs->RINTCTL = 0x00000000; // Not used
$ q, k! _/ e" r' f+ t# ]9 }' J
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: D/ b& |+ Z+ f
9 }5 C! n" U; L
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
! {- Y$ t* M3 F" Y
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
& \$ J( P5 h4 Q _5 |% O- {( E! |
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
" M* H5 l* M% X+ R
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
/ d7 w6 R' m. k& f* Z( i; J( V
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
( H0 F0 H5 \, u4 v' a* d+ W
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
( }+ s6 [$ o& E
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
- S" |# `3 o2 w# Y7 {& u
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ U! T" x' {2 b: R# z
1 J/ f# v4 `4 C2 S) C' A: R9 a
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
" k- v* g4 V3 [; F1 l
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
W0 W1 K2 b( ~
mcasp->regs->PFUNC = 0; // All MCASPs
1 l; u8 r0 W* y7 N) P
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
& s/ }- r7 J7 L& t0 a: R
- u; I; Z: W. C8 C
mcasp->regs->DITCTL = 0x00000000; // Not used
. |$ \, |, N7 N8 s
mcasp->regs->DLBCTL = 0x00000000; // Not used
1 V% {- H# H9 o) m. R
mcasp->regs->AMUTE = 0x00000000; // Not used
% i7 `& ]' Y b$ w
5 @$ d8 S3 }" R: i) Q# @' I! |
/* Starting sections of the McASP*/
4 b/ G8 T1 B0 D: H" z
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
$ X# p. A& U C; @# o1 J/ c. ?
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
1 @1 j1 ]* A) R0 I
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
) O/ P0 @' g4 Y- U, n9 p$ R# |
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
) B2 Q+ U/ R" N
+ f7 q: G1 D: E, M0 `5 E% S5 x
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
( Y8 L9 V0 K0 l/ J, f; j
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
. Q' [ q# q9 G* Z5 b K
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
( G6 f: A: b8 ^5 {" C* G1 x" H
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
; O$ H ]6 h8 r8 N, F4 C
3 @( T# Q. W. W; H" q
mcasp->regs->XSTAT = 0x0000ffff;
2 `* p% A0 ?4 M' O
mcasp->regs->RSTAT = 0x0000ffff;
! S/ J+ p0 B5 \: Z+ f) F
# g& m6 n. _" G8 r- B+ |
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
& G2 K! l4 c0 ]2 t. |* h
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
6 G, y: w% e" L9 `: ]
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
2 |! D/ Y0 b+ T* T
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
# t; p& N7 W( P2 Q2 e1 E
/ E: ?" E$ j/ x9 _5 W1 w; l" a
/* Write a 0, so that no underrun occurs after releasing the state machine */
/ c+ E+ J* q u5 X: x0 n7 J1 c8 M% f
mcasp->regs->XBUF5 = 0;
* E7 m G7 q' N3 x
mcasp->regs->RBUF0 = 0;
" ^1 J& |; o7 J/ |" y; n
+ z4 d( H9 a |+ ~( M
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
, K3 y( D, {3 _- _& j
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
# M' T. H. N6 j# B
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
5 O) P& Z/ L, S% s0 e& c( L4 y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
4 y# O! C' {1 b* a
/ |5 d( U( D& o5 A, Z! S
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
1 J% B0 @4 ~# c* x0 A
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
- N' g" s g4 G5 Y |/ ^3 V' u
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
( W( o1 y+ [8 |3 s1 H$ d
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
. S, c+ A4 i% ~2 ?$ g
2 U% E" O* \6 M8 S' w3 T
CSR = 0x0000;
" l. D* m- u& ~
INTC_INTMUX1 = 0x3d;
6 t9 l/ z# {! A6 v4 V
ISTP = (unsigned int)vectors;
8 Q4 f# X: E$ Z5 y' v, F" y Z6 s( G
ICR = 0xFFF0;
* r- _( i% k+ U; l) s
IER |= 0x12;
1 [2 C/ ~/ i7 `/ ^+ p5 k8 D5 O
CSR |= 0x01;
& t* K& g6 [6 E) z
% m% u4 k/ v2 f+ N0 @1 \
+ H2 f+ z5 T" D! L# C
8 m: m- k. l. o5 E$ f; E
还有就是两个输入输出函数:
" e {6 g* A9 y T# F: K
void output_sample(Int32 out_data)
, f- m4 ~/ f# K- N& l
{
% I% c' [9 y3 [) l* Y3 Y/ [. \
AIC31_data.uint = out_data;
+ f4 f, T9 ]! a0 }3 S
MCASP1_XBUF5_32BIT = AIC31_data.uint;
. _/ M5 z6 s% t. O5 z7 O) ]
}
' h0 E8 }( c1 ?! S
) D3 ~, t. G: Q" _
Int32 input_sample(void)
; W2 Z0 r3 d2 E$ m
{
) R b$ Y5 S4 x' d y8 X
AIC31_data.uint = MCASP1_RBUF0_32BIT;
' P& X! w" R7 C
return (AIC31_data.uint);
6 d8 W6 R; K: ^4 x4 x' L
}
4 S, R7 K, O5 b/ K
6 N& R$ Z. v8 c8 ~9 S5 n
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4