嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
4 z& G. c+ I; z3 Q
main文件:
7 E# S9 P0 H0 H- u8 z9 p
interrupt void interrupt4(void)
0 V7 A$ F' p, {3 B6 s
{
* J& ~0 b5 R& Q
Uint32 sample;
7 H0 Y! F. ]; v; |) s9 y2 F
+ H, S2 a3 x5 r) U! `) Z
sample = input_sample(); // read L + R samples from ADC
' `2 s0 l& U) x% Q0 g
output_sample(sample); // write L + R samples to DAC
1 m- H6 s8 o3 I) R
return;
, X) F' t; f7 b% k, A; ]
}
7 @5 L" o3 l6 {# S# V E+ Q
8 ?6 F' T% n6 B0 k
int main( void )
$ f; ^ J5 h/ X# e' f" T
{
2 _) {/ |! T. s6 @- G2 X6 V
0 S; V/ A7 t7 ?8 w2 h
/* Initialize BSL */
) N4 Q: w |/ H7 ]5 _0 m
EVMC6747_init( );
! y& R2 M. N9 }1 ]6 g) X" w0 `
/* Call evmc6747_intr function */
2 @- z1 I, r4 O; k5 v" g
aic3106_init( );
7 e& k/ t: g+ x- X4 P8 ?- I
while(1);
& y* a" U/ b- E/ a2 C; ~, Y
}
" b/ T: ^+ g9 W9 U6 q0 q, n: G
+ `( M) L6 b d' z
9 f2 W( k. k ^# B
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
7 U, f( l2 a# ^( |. M5 `
/* Initialize MCASP1 */
* n) L e4 u+ t- Z8 D5 ?( \' b
mcasp = &MCASP_MODULE_1;
/ W% V( _$ b; ?' R$ L& k. ]" a) x1 J
mcasp->regs->GBLCTL = 0; // Reset
: n. d2 \- }; H2 f( d$ p
mcasp->regs->RGBLCTL = 0; // Reset RX
0 R/ O/ }! e) D+ V
mcasp->regs->XGBLCTL = 0; // Reset TX
: B* P- F+ X+ L8 ]
mcasp->regs->PWRDEMU = 1; // Free-running
% z2 U4 P4 N/ r" o2 I
// configure McASP0 receive registers
9 [( q8 Q9 [( _7 b6 C& v( R5 g) P
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
8 `; H0 ]% T" h3 g0 V- u
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 F# ?/ r0 _; A# y
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
9 v7 ]0 X1 l( N, k) z1 ~2 M; p( n
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
( i' L5 D' n* F; ?: A
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
6 i0 x: o0 m' t- F) I" F+ R
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
! k" ~. Z: ?6 {$ A' h- z+ J. r
mcasp->regs->RINTCTL = 0x00000000; // Not used
; t5 i8 y$ K0 g
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# f2 R. ?; I4 @" ], \1 g
6 `7 J9 j& U8 S: f
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
# @# Y0 a: v8 R$ n
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; F$ B1 Z9 }9 F
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
3 T% ]* n5 g3 [2 s# A1 ?
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
' K- ?" X! F! {+ @
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
5 h2 s+ g+ O& Y( \9 _* s+ z( I, ~
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
z7 [& h7 w7 Q# k: h) G* |
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
2 k0 z" K, H5 v) [. w+ A2 n* x
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! A- z+ ~! M' }" D; d
1 ?% v( P2 ?% N: | _" G4 j) h4 w( S
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
. e& _6 O" P/ q$ w9 X! V" c0 Y* y
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
0 K7 x* l% R5 r% j0 Z! @$ h
mcasp->regs->PFUNC = 0; // All MCASPs
- p, i$ D2 ]' @$ p4 S
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
8 v' m) m! q" z/ K( T" h2 \
# i9 w' n: ~/ _1 R8 P
mcasp->regs->DITCTL = 0x00000000; // Not used
$ K% _( r% u D$ y% W. f
mcasp->regs->DLBCTL = 0x00000000; // Not used
b! B5 W) M$ |; z5 T1 B
mcasp->regs->AMUTE = 0x00000000; // Not used
, y4 `: x: P) r' Z4 G% R
- V3 Y# F! b+ q( P0 x$ D7 |* B9 j
/* Starting sections of the McASP*/
+ y$ p+ R$ x2 c# ~# E
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
0 ~" G9 D( J" }1 K; w
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
, O; C( ] w. i# ]' y! x+ v
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
5 `2 e# t7 X+ Z& V1 O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
! `2 j* g* {5 U0 b3 D% |# l
' V& v2 I- Y9 A2 ~8 l
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
@" _/ @# M P
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
* f( f! T1 y9 M/ D5 c
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
; f6 Y8 ]1 X* {/ t; p
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
1 p' h+ Q2 e0 D/ m. {2 ^
( |# H. \. o; {' k; {
mcasp->regs->XSTAT = 0x0000ffff;
& X# e/ q; a6 c$ Q& Q
mcasp->regs->RSTAT = 0x0000ffff;
) _, C ?. z9 j: ]' v2 i- Y* M" Z
' E/ i' ^. h0 f' V7 G
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
+ F' r7 {( @* t) i& ?( N
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
% O* U2 ?9 L* B' Z! j
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
; ~+ F9 _2 v5 \9 J
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
/ E. [5 E7 @ s |
+ a+ L* _7 \! O
/* Write a 0, so that no underrun occurs after releasing the state machine */
$ M8 Z# H) H% K7 A
mcasp->regs->XBUF5 = 0;
9 S3 P# M/ O' R* q
mcasp->regs->RBUF0 = 0;
3 Z! ^% y0 `/ @$ B. c% }
- y1 A$ Q* A; J/ e& @
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
. w" @6 Y D; v6 a; c
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
& ? V8 g# B* H3 F% t' d5 F) n
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
+ r& @3 [, L# z# ^3 u) `7 P
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
& X% y8 |! t, @3 n, G o- C
9 ^* ^7 s& V) F6 e' E8 V
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
* D) j$ S p6 Z. t4 C
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
6 J! G# {& }+ F
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
& Y- d/ {2 C Q1 x7 a' m- o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
& K) r, \7 N `) L: h9 x# g
9 ?# t3 W1 ^! h8 ?2 y h
CSR = 0x0000;
9 y+ d( ?9 J, I, B! p" l
INTC_INTMUX1 = 0x3d;
6 D% ?+ ]) a6 K: a1 [2 }3 o ~" ~2 S
ISTP = (unsigned int)vectors;
4 \# o# K* ^- `, {8 V! P% o
ICR = 0xFFF0;
# s4 ]" r0 ^( p- ~& m0 }- x
IER |= 0x12;
0 i# ?8 M2 ?) S, ^& m( i
CSR |= 0x01;
& o- c P3 h; J! ]7 g' H _
; E. f* w" V, d$ ]0 N
" T* q- E& s9 P" g) }
0 `1 O1 j# g& P5 d% h
还有就是两个输入输出函数:
2 k t- m% E( w, _& d/ J1 I
void output_sample(Int32 out_data)
2 P- @6 D" e1 k5 v! ?) Y. @, o$ P
{
7 ]' Q% R# d; E) W1 s! X; {/ s0 h
AIC31_data.uint = out_data;
/ q% }8 o- C! B# P7 M
MCASP1_XBUF5_32BIT = AIC31_data.uint;
4 k8 O5 [7 t- N. c' m, x- q& h
}
' @, k( O9 N ?9 X$ T& D: H
5 V( v) q% G9 L9 x% w4 L8 M
Int32 input_sample(void)
; e8 F8 C2 v6 Q3 `
{
% Z$ t/ e, g$ U; y
AIC31_data.uint = MCASP1_RBUF0_32BIT;
7 ^8 o& Y9 y$ v1 @: t
return (AIC31_data.uint);
. k$ A6 V5 H0 j( M0 [
}
* G8 h, n1 E. x9 u8 r: S: [
1 R3 A: Y, d" m$ \$ j; X" w; v) B+ V
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4