嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
% `; K6 U9 \- P6 d) V6 [% w: w
main文件:
8 f O( d" K; S& n) Y- Q. f. f
interrupt void interrupt4(void)
/ e& e- n2 N! A. `% v9 Q+ o
{
0 ]+ i# w! F; B! m
Uint32 sample;
- k. [) h( q( j% a
9 I; b# l( c( [. O0 t, o7 `# W, m6 ^
sample = input_sample(); // read L + R samples from ADC
7 d8 h* ?; W3 @' U
output_sample(sample); // write L + R samples to DAC
5 }" T! v y8 {0 Z& K* I3 O
return;
3 h$ f: o& Q( \* q2 m
}
8 V9 K8 ^! q! P
/ }+ c- d' d! S, f
int main( void )
6 V$ {' `! @& P) {
{
" m) B8 w. _+ j1 x+ l
* H* k1 e3 F8 n5 c) k( X: p; R6 x
/* Initialize BSL */
( g& k1 V8 F( g0 |' ^9 W- Y
EVMC6747_init( );
4 L7 B) o3 |6 G, B. x' g
/* Call evmc6747_intr function */
. t: B F2 k8 t1 p; L0 o
aic3106_init( );
, N) ~$ ? c5 g! ]. K0 |
while(1);
1 A% f7 q3 _ w0 d# T* O
}
" e; b% z" @; A7 S3 Q1 z9 {
E! h0 |" P k" v, }$ s
1 F; A7 A5 |' ^
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
5 @% i9 z0 H* ]' o
/* Initialize MCASP1 */
4 Y! b: s; i V! g& F% Q- P
mcasp = &MCASP_MODULE_1;
7 A+ [2 c6 z/ I. x. v% A
mcasp->regs->GBLCTL = 0; // Reset
6 }( h3 R/ u. a0 w1 K9 g
mcasp->regs->RGBLCTL = 0; // Reset RX
) b9 u |3 t' _; u5 b# R
mcasp->regs->XGBLCTL = 0; // Reset TX
. G: O7 l; X n3 z7 ?, b: V
mcasp->regs->PWRDEMU = 1; // Free-running
! [6 A6 C4 }' g! H. F
// configure McASP0 receive registers
6 d+ k5 z1 ?7 X7 p3 m9 G, m4 I
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
# N3 I P4 R, }( t6 h u- f0 I/ N
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 i% H- Z# d) y9 j
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
* q% a, O# F; l" K0 }! X; u/ X( J% o
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
' C/ B: D& N. b: F q5 s
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
1 ?& Q, b$ h, L
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
7 ~ s2 L* |9 |# d" R7 C
mcasp->regs->RINTCTL = 0x00000000; // Not used
' @) V- C h0 F* B
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
( I3 x! c. e \4 f
1 s3 z2 r& j1 ?* P+ F P3 a
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
$ l: m5 e- @; ?
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
! b4 s) K* I; o2 m
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
0 D2 _$ C$ F8 e5 }; v7 g
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
% P$ `6 p' g3 \3 S1 h
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
5 p9 U- F' z0 ^6 F. y
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
9 _" G$ ~: q: U7 Y8 H
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
6 z% A2 U! r i
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
" z) p6 \1 R' ^8 |$ l
9 i8 `! A1 A( M# f& `# k
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
6 J3 E# |: M6 N; K/ O
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
. o6 g/ g( j `7 u) [7 u2 m. n
mcasp->regs->PFUNC = 0; // All MCASPs
* w! o$ q6 M; J# ^+ O
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
6 h% t: I7 g7 B8 e- S$ [7 q4 h
: W: ?- B9 f3 P6 W8 Y
mcasp->regs->DITCTL = 0x00000000; // Not used
4 r; d9 W2 T- C0 a. Q; j
mcasp->regs->DLBCTL = 0x00000000; // Not used
! K- u! [, W/ z
mcasp->regs->AMUTE = 0x00000000; // Not used
9 X$ s" |$ H, M4 Q4 t# n; W" W
) ]; U8 y E* _9 e7 o" n
/* Starting sections of the McASP*/
+ Z+ P# s- }0 Q; f' K
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
3 a0 m# Z1 Z; H! F2 h8 i
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
2 @, o. b7 l9 B) e
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
) `* Y6 _2 U: D8 q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
+ t! r, V. c6 e7 @
' V9 N! n% }5 {0 ?& L
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
3 M9 T( e+ B) q4 W& o6 T3 r* Y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
8 ^* O) }( x) t( M3 |8 ~( K
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
: A' u( q% |/ O. t! f5 x; j
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
6 Q$ y1 n3 f$ v, l. O3 U
( W; j8 _6 q: q! l
mcasp->regs->XSTAT = 0x0000ffff;
* N: H! T+ r0 _5 M `% [" J
mcasp->regs->RSTAT = 0x0000ffff;
! P- ?$ A8 r+ P5 i5 M
& o! S: [; P; E
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
' W9 x* [- y) ^6 r/ o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
# A3 W$ l! s4 Z$ k
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
2 c2 z7 I1 Z5 l3 o2 l; Q- n R
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
5 k- f. F8 H: T3 ~" F8 G8 N4 k7 Q
2 J4 o8 h) q' F' O' L( \) n8 @, T- w
/* Write a 0, so that no underrun occurs after releasing the state machine */
: ?9 [$ h1 s0 o' a! A
mcasp->regs->XBUF5 = 0;
0 @+ Z& j' q6 d
mcasp->regs->RBUF0 = 0;
2 R0 D6 ^. H+ Q+ F6 n, t2 Q5 P" s
3 Z, f2 g) b* v+ X+ D' M' j
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
7 P4 h- H# E% { Y& u
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
! o! M, U; ~, m$ k) m7 m8 c( n
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
5 R8 U+ i9 ^1 e& h- a7 k4 |
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
+ {0 }3 t2 u* x! O
& t# ?9 t& C k& }
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
) b/ r6 Z" Z8 t( d9 d
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
( d$ x- N1 c' L0 F; U
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
* w2 q& o( P b$ M
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
- {3 J- g$ ?! T. ]
& B+ ?* d) w! ^1 c" S
CSR = 0x0000;
! U3 D, |) C1 }& |" C
INTC_INTMUX1 = 0x3d;
% T7 A" }: g: F! E; V
ISTP = (unsigned int)vectors;
- ]% w5 W4 B* G7 L5 X; u3 s
ICR = 0xFFF0;
2 o2 O& Y8 c p% t
IER |= 0x12;
* L/ @1 k) q& u
CSR |= 0x01;
$ J, b" `9 _2 e" T
, J L# q8 x' f- i) A( W9 c" x
& T7 ?9 Y; q5 C* _5 [
0 q$ Y6 t( H7 O9 `
还有就是两个输入输出函数:
; l5 x. T b( @" w v$ ~9 u2 X" [7 ^
void output_sample(Int32 out_data)
: o" H8 f v5 C) l* }% c3 D; ~! ^
{
) R2 z) A! ^, [9 P! m$ n" c
AIC31_data.uint = out_data;
" q- V- B3 p# E
MCASP1_XBUF5_32BIT = AIC31_data.uint;
, C4 O2 K6 @# f- s$ s2 R& E% I* E
}
2 O; u. Z0 a" W7 N7 u0 ~2 |: F6 r( Y: {
9 F0 N5 ?/ D, l2 O. @. ?; {
Int32 input_sample(void)
9 W7 G& p D/ T) ?- D" M
{
" } u ]2 V& q C7 M, @( P
AIC31_data.uint = MCASP1_RBUF0_32BIT;
; J( u! N9 j, b
return (AIC31_data.uint);
. }8 \- d% N4 }; p+ v
}
. s$ K5 M. O: K3 p4 k$ Q5 x8 B4 I
1 R- }9 k6 \8 r8 d& z" A
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4