嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
# k- r1 K8 h! D# a9 {
main文件:
8 }# g1 q1 t$ U2 w6 Y
interrupt void interrupt4(void)
) l/ l/ S8 P( j/ K; c6 L6 J% p
{
; I( a" p3 j1 j* U* Y# d2 G8 B
Uint32 sample;
6 b4 C# C* c3 p4 `
6 K( w1 g2 u0 E! |
sample = input_sample(); // read L + R samples from ADC
+ k/ o, _, N" H! ~
output_sample(sample); // write L + R samples to DAC
6 F% X# |" V5 z4 G. l4 c
return;
# \. Z1 H' q0 @' m
}
6 j0 D& w3 b1 t* B" B5 Z+ l
: K6 s2 d' R; x% T, E; ], y6 U3 Z# Z% W
int main( void )
3 W. z- w5 z9 K, Q* U% U) s$ a: J2 i
{
! f* y; Y6 N- h, g, B' z
* I1 o2 ?$ t. B
/* Initialize BSL */
0 I1 x. o$ | {# w+ P
EVMC6747_init( );
4 L2 Y# H1 y) x8 N
/* Call evmc6747_intr function */
$ A; H3 c$ S, x" d2 F4 Z, a& _4 M
aic3106_init( );
" P$ ~& D6 x9 \: |% a
while(1);
1 _0 [9 @) `0 J) z& x
}
, `+ |5 ^3 G3 L6 L+ h# @% ?
9 O1 u9 g9 Z6 t: I# u! J2 V7 }( B
- H6 n; N2 c. |2 Y
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
6 b$ k1 w- D _8 f+ {
/* Initialize MCASP1 */
% C1 S9 k/ J& \8 r4 M P
mcasp = &MCASP_MODULE_1;
" Q9 w! ^4 X2 Y( m" h
mcasp->regs->GBLCTL = 0; // Reset
; M, S3 n2 S, k$ d) M5 h2 q0 N
mcasp->regs->RGBLCTL = 0; // Reset RX
9 U4 \+ ^: {5 b- } Y
mcasp->regs->XGBLCTL = 0; // Reset TX
- Q |/ K2 w0 `, k! N# n- c
mcasp->regs->PWRDEMU = 1; // Free-running
8 }/ \) D" }' `* F, x X; U
// configure McASP0 receive registers
6 N, u( S' l; x' q F+ H7 q
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
# v- e% ?/ j) g m; s- {( y+ w
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 m7 U1 f: l- N- H
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
* [9 M' n8 A9 R) K# m9 \6 d
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
9 k/ q( y" D+ J0 V4 ]- G4 p5 B
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
( I/ |4 X; l9 M+ k e; g! l- k
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
# Q9 i- L2 }2 c6 y8 H1 ^) q6 u
mcasp->regs->RINTCTL = 0x00000000; // Not used
1 s! }+ s6 g3 P# {& Q% l7 v
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
& P, I: F( b3 X4 Q t
/ E6 s- O1 P: h5 b2 p
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
+ ], ~, d! r4 ^- o8 K
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 |! y+ r+ _ S4 K' S
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
6 s+ Z$ _+ \6 b9 n
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
- A. P) ^2 s2 H( H: Y. P' ^
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
# O9 C+ }0 }" J& p( Q* S
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
, B/ E% H4 @: i; p6 ^
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
. j& V5 {' d: k3 L
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 W" {7 {2 l+ L
9 u* n# [; m0 | u" j: N. j
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
' _# e H$ H+ J
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
1 B8 S' V5 j: u' O. M; ?- E
mcasp->regs->PFUNC = 0; // All MCASPs
- w5 v4 x0 n8 h! a. r7 Z, D [
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
8 f. u$ j! a, J/ Q+ M& J9 j
7 S+ F j9 { M# f- i7 {
mcasp->regs->DITCTL = 0x00000000; // Not used
( f4 y1 B" v8 ?3 _
mcasp->regs->DLBCTL = 0x00000000; // Not used
! B0 b5 ~/ d) E
mcasp->regs->AMUTE = 0x00000000; // Not used
4 o+ C3 c/ ^2 [! u" D6 |- w7 a
( T4 ~, v S) a) o% x
/* Starting sections of the McASP*/
, J2 [8 B( A8 U: d
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
8 f0 N) O0 G5 U7 X' w/ S: m
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
6 g4 U3 o( ]" m
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
& X7 x& ], [4 |- g
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
% d& t( m; O4 A
; ]. i# y( r# A, ^$ Q( W5 ~8 P
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
+ q- ]0 Q! @+ F
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
* T1 s4 N8 U5 S- Y$ h5 n
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
7 [, p; F) K- n
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
4 }0 k" `6 I$ n0 [9 G
7 G! V& H M( L
mcasp->regs->XSTAT = 0x0000ffff;
5 O2 _ N$ c! `' `0 v( X& q- Y* ?7 b
mcasp->regs->RSTAT = 0x0000ffff;
^" @. h" m \7 H# h; o: c0 x; G2 R
( M8 |) h& M6 n3 b
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
5 k- [ ^( H! g* v! D, p: V
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
+ g( q* ]0 T J7 B i9 V+ i
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
0 I4 A6 V9 }4 m5 N7 W$ n* `
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
1 E* l8 p! x; F' A- A
$ Z* w& |, i& T
/* Write a 0, so that no underrun occurs after releasing the state machine */
' F | k$ }- G, ]0 B
mcasp->regs->XBUF5 = 0;
* A, P X. c1 T* G }) Q
mcasp->regs->RBUF0 = 0;
& y2 g1 @5 M1 q1 n& D
- F, U% A2 k1 ]9 P$ {7 Q
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
6 J D, s# b+ p+ o ]" t5 L
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
: t3 p8 b( j; N9 P$ a
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
2 Q: \ S, y/ d/ r
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
- _' ]- ?$ l( n1 l
# J1 i& u8 e4 A: k- S( e) ^) O
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
/ f; N+ H- E5 P/ ^# `. w Y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
# W* L1 }6 R1 F8 g4 h+ \; L2 x% c
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
5 G6 X" [0 q" K, ^" \6 M
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
6 c3 [4 d0 {/ M8 a& @" \
y, j+ M" n6 y( a+ J
CSR = 0x0000;
, a# Q( L. b' ^: H) c2 |8 y, V ^0 e
INTC_INTMUX1 = 0x3d;
! @% l1 j1 _% m
ISTP = (unsigned int)vectors;
) p$ J3 e! G9 |, z, e. {2 a5 ~: Z
ICR = 0xFFF0;
" L( Z" i0 z: T. c" x7 R4 ~
IER |= 0x12;
4 ^& b9 u+ \6 |9 J
CSR |= 0x01;
, h. V% d. f& X( I# F
O C0 i+ ^% T H7 m
5 w- l8 _) a3 V* v1 n$ c+ k
% d+ d$ ? s3 l9 _
还有就是两个输入输出函数:
- D5 t y; i; `4 J" i
void output_sample(Int32 out_data)
6 L# e% z' p( a: G0 j1 D
{
' R# B2 z* k" s) Q+ ~2 w
AIC31_data.uint = out_data;
9 z, n3 L" {8 o( ` e+ q8 M
MCASP1_XBUF5_32BIT = AIC31_data.uint;
' z5 [/ z9 r4 N2 Z0 i
}
1 O, _5 }) Z. C N
9 N" X+ q4 K, z! ?! P+ e) {
Int32 input_sample(void)
4 B; G' _ c4 V) E) E' |) F
{
! U7 M' h! C7 e! Q$ c
AIC31_data.uint = MCASP1_RBUF0_32BIT;
1 a5 |/ T7 O" }& U: T$ f2 r
return (AIC31_data.uint);
! ^( R. B3 [6 s* a' j( |" R( }
}
; f4 X2 h9 C6 }# Y/ U$ D
1 E6 N( r6 O' m2 O1 S" R
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4