嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
1 N& G- R/ |9 f+ M: g
main文件:
% o4 A* P, D) x1 `' }
interrupt void interrupt4(void)
* P( l% F- N' y6 e* k
{
4 o' G* M9 u6 L
Uint32 sample;
2 m) F$ h) n) g5 n) v
$ M0 _& z+ |: z1 b9 ~, v1 n5 F
sample = input_sample(); // read L + R samples from ADC
0 B; Q' D: v; I! x; w
output_sample(sample); // write L + R samples to DAC
- y! y( _( ?0 e& D6 _
return;
* r& C/ g, g' o' @0 F7 @
}
! v3 L: ]+ n7 l0 m2 M7 b2 g
5 V4 t3 t2 n; [7 f# F. _6 C
int main( void )
" Z0 C/ k1 k; y5 y1 ^; T" e( ^
{
6 z# d2 i: B3 e; `1 T0 Y* Y
* D" j9 V( U+ W6 f; d# G
/* Initialize BSL */
, h+ s( q6 \0 J; K& k- e) _
EVMC6747_init( );
( c8 J0 U( T# l9 m2 e* b& R
/* Call evmc6747_intr function */
. A2 D9 N; {' j6 h, g I
aic3106_init( );
1 t7 j. S3 Y( V' }! F3 B
while(1);
4 I8 {: k* ]/ S) m9 | X) o
}
6 a) \% m2 F$ h3 ?: N$ S! Z' n2 d
& H K* H) W$ d, h/ j. {
: n v' @9 ~/ U" J" G
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
) O1 i- s4 ^0 }
/* Initialize MCASP1 */
" s2 R; L: ]. R, ^
mcasp = &MCASP_MODULE_1;
5 G, k) W$ p, u, X+ D
mcasp->regs->GBLCTL = 0; // Reset
9 F* u( P7 r+ Q8 R" {0 M2 Q; L- f. _
mcasp->regs->RGBLCTL = 0; // Reset RX
9 m6 z l& h* h2 N8 Y
mcasp->regs->XGBLCTL = 0; // Reset TX
' k- p' R, x# U; @
mcasp->regs->PWRDEMU = 1; // Free-running
4 g! Y/ j9 o% X, `3 Y6 C
// configure McASP0 receive registers
% U( o6 X' W" r
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
7 v! Q Y( b( N# L
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
! T& U% c- k. L2 h4 g7 x1 {
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
# f* p( j. ^2 k
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
9 N6 I! x7 E* z) r7 s% J
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
; `6 ~- h$ I9 F/ z& T4 ?+ ^
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
6 t% o' `3 r! I* G+ Q
mcasp->regs->RINTCTL = 0x00000000; // Not used
$ i/ \' g, ?$ r) f6 d
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
% o5 D* K$ S& t" S7 z5 \
J$ m+ e' V0 ]7 ?* \1 F
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
& g- t2 _$ p# h }4 |# c" M' P. [
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" ~0 B X" C1 U8 `
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
, P* p1 Z) `! y2 {$ k! p) A
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
; ]4 t- ]- Q7 k1 B* s
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
$ K/ d% A! j! j- a& V$ g
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
8 q7 |; D) g4 G: K; w9 G
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
0 g: Y3 B& b1 U) N/ I5 n+ U
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. }) @1 E2 e) ? ~9 Q# i7 J
/ W! a7 y8 s( N* W
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
+ F# C! @6 U# o& O3 }4 g
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
4 C8 Q1 b E9 ^1 j* j I7 n) B& @
mcasp->regs->PFUNC = 0; // All MCASPs
) @% t$ [; J' e+ ~
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
6 m1 m4 n4 W# o8 C' K6 t7 o& I
$ D3 U; ]+ J" ~2 P, W! F
mcasp->regs->DITCTL = 0x00000000; // Not used
$ j. t( ]2 l& q' |" d
mcasp->regs->DLBCTL = 0x00000000; // Not used
% H& q8 z! p7 `# [7 K& L" u
mcasp->regs->AMUTE = 0x00000000; // Not used
! N4 L! z4 i: n. I5 b( H8 x& d
% t- t. H( R& b! o) S; m9 w' h) n
/* Starting sections of the McASP*/
& X+ j) C$ I! g. g% p
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
' z% T( ~ r+ p- e8 n) P
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
7 i2 L: ]+ r% q7 I% @) b% l
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
+ x( ^5 ~ y x) F. y* O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
$ S& f2 O8 h/ n( }
, n& H8 l( F! Z0 X$ g2 B" o' O
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
6 f7 v# u3 F! ?, _
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
, y% ^: v. I- M5 N4 j. ]
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
7 l- c9 A4 h; ?; a" z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
" e; \* L+ K- d0 A' B. [& b
7 V7 X k9 K! h4 v9 e- X
mcasp->regs->XSTAT = 0x0000ffff;
! V; [3 E7 J! ~$ G# w& V
mcasp->regs->RSTAT = 0x0000ffff;
/ {+ f9 i0 O$ R4 q/ @( e* D
( F8 d) W2 ]% K, n2 f$ Y
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
4 O X& x/ x( X& O( G+ c
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
0 v$ [' v8 g# s" @ r2 u
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
3 `% ^$ J( l7 C5 z5 I" q) u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
6 Q" n1 u7 \; g- ], X
* C8 D7 ^! {8 Z
/* Write a 0, so that no underrun occurs after releasing the state machine */
@( I8 z7 s* c" T
mcasp->regs->XBUF5 = 0;
7 d6 j8 ^/ ?9 a$ C
mcasp->regs->RBUF0 = 0;
" a" l+ n( |* Z5 D+ j
- o. _/ v* q" ~0 s1 G0 V
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
; `4 j1 C6 C! h' z4 [; h
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
' n' ?" S9 I5 n& d; b+ Y
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
`8 f5 ], L0 R2 M$ i
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
! U" ^: t- Q8 ]5 J2 m9 v' x& X
2 V1 W3 ?" `9 c
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
4 F7 r$ P$ c" [7 D/ a7 O
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
" p# \1 H* y- M5 @
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
1 U# Q: F }0 B
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
7 e# s ^! V# C, S, v9 E5 o
4 x% X! v- E1 T2 z! W
CSR = 0x0000;
9 m; B, x r. h/ }# K+ B
INTC_INTMUX1 = 0x3d;
8 F+ g/ F1 l( R4 |! ^) N3 P
ISTP = (unsigned int)vectors;
; w% ?. K& d( Y. I+ i
ICR = 0xFFF0;
9 a3 Y5 {, v" e" M$ n) U
IER |= 0x12;
" I+ g+ e0 r* d/ J4 m* T
CSR |= 0x01;
$ ?$ ^3 O$ `6 e- Y5 a" ?7 _
) \0 N6 J+ m7 x, i8 O& H
6 B3 g1 C5 D% y0 v7 z, I; z U/ P
4 g+ P% {( Q# N6 H. V
还有就是两个输入输出函数:
; m0 j H! a7 f1 J& `3 r. W2 [ }
void output_sample(Int32 out_data)
& D8 v) ^/ g. x
{
& [! X& {* v. I; P& K9 Y
AIC31_data.uint = out_data;
' L! |+ d& R3 e1 M- h0 \. i- O8 f
MCASP1_XBUF5_32BIT = AIC31_data.uint;
* @- w: X9 L" f# D2 _* t
}
0 F9 X3 ^8 Q4 i, a# Y8 v
$ b) D6 j) l6 w& f5 p) x" o3 ^; r
Int32 input_sample(void)
1 H$ X) X7 Y9 M2 t& i# U& Y1 k
{
' P3 w' T, f" z! }
AIC31_data.uint = MCASP1_RBUF0_32BIT;
3 d: h- o) z. x( y5 q
return (AIC31_data.uint);
+ t( K6 f3 J# w" K; r6 W
}
9 F x# z V6 `4 x$ k+ L4 p
. L" n4 Q2 z& O0 @; a& w
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4