嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
8 b. ]+ u# E/ O! F" B* i
main文件:
# [- Z+ F% a5 Y- P$ j
interrupt void interrupt4(void)
6 s9 y# G7 I; a: O
{
?0 I' o# L) o8 N: H& |
Uint32 sample;
. z+ N, y3 g& }' \& a9 @1 G) l
0 x# S0 T0 K1 Q- R+ H
sample = input_sample(); // read L + R samples from ADC
( X- }5 W" t5 ]& e2 P
output_sample(sample); // write L + R samples to DAC
9 s/ _$ M' p4 H: X0 F$ ]* i/ _
return;
; f, _2 y& ]: M1 j; s
}
% L) j5 d8 z% Y, j7 g
4 y9 t ^! `; a+ U5 w
int main( void )
1 J4 E- d5 w$ a5 E6 q
{
& N( `3 t/ e; U; w6 f
% ]* t y ~5 D1 D
/* Initialize BSL */
& t& I+ H+ o A% D/ C
EVMC6747_init( );
3 x6 w z; T& p0 P2 f
/* Call evmc6747_intr function */
2 A, r. S, U$ ], a+ X
aic3106_init( );
8 ?2 |$ e0 y5 u
while(1);
+ H; }" a+ Y9 @- ?
}
& B; |: g1 N; W9 w1 s2 t8 L; ~# _
) C. X& j+ Q0 E$ _9 [
* e. r- Y3 t1 k8 y3 k
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
( u( _% _$ P. Y2 H. M5 e
/* Initialize MCASP1 */
, l! v4 g* {3 z7 G: _
mcasp = &MCASP_MODULE_1;
9 W1 U; r7 U/ D: ~
mcasp->regs->GBLCTL = 0; // Reset
& z3 |; q( V! o3 ^
mcasp->regs->RGBLCTL = 0; // Reset RX
9 O6 J; g( a e! x' m; ^
mcasp->regs->XGBLCTL = 0; // Reset TX
0 Z$ H4 V1 l0 l, y# B/ }7 X4 ^
mcasp->regs->PWRDEMU = 1; // Free-running
# T3 M6 S4 ~/ Y; ~/ r/ X3 W
// configure McASP0 receive registers
: x P" x. ~. v: ~" b& P W
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
% y8 I# |, H( l" M3 n* H/ e
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% R- g# m2 f. c8 @( {1 z5 w$ k
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
7 k, [5 j6 U% m; L
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
/ L$ n6 E* y6 d, Q
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
4 t/ y3 `8 X! Y1 F, l% O
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
) ^1 b5 h/ T+ `* ?) w$ o
mcasp->regs->RINTCTL = 0x00000000; // Not used
m( e( G, ?: @6 b6 l8 ?3 Q. }
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 c' J6 q! t( w ~; S
" @* y) [2 n9 ]. G
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
8 R6 {$ i' M$ B1 B1 e1 J
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% M4 w! @# G- f/ k) q+ q2 L; x8 |; P
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
5 X' a4 `& I! u. F X; M
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
$ p. y P& a; a: o& y8 t' H
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
7 R) F3 ~% c# v/ F
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
. p y$ f; s* m, [4 `
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
) O, S; D7 }8 }, M& V8 O g
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# G% D* [7 ^ U/ V# o. Z
_1 W3 L) B @
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
/ s& q( q$ S3 v3 s6 U! _
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
4 O9 c# Y }" `2 v. n
mcasp->regs->PFUNC = 0; // All MCASPs
1 |- S, x( i6 s' V
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
/ N" c$ r! U& `. s8 k- A6 t! g
5 R+ }/ w, `, G$ W
mcasp->regs->DITCTL = 0x00000000; // Not used
' ~4 V' j0 b; @/ N' C+ d- ^9 o( N! ^( n
mcasp->regs->DLBCTL = 0x00000000; // Not used
5 {* k4 ^4 }, x* X, o+ X" v
mcasp->regs->AMUTE = 0x00000000; // Not used
0 J# Y4 O! p, Q
6 J$ F2 x3 v# N5 N7 Y
/* Starting sections of the McASP*/
6 {( N( j \7 `7 z W- ~% q' Z6 l' Y
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
G( M- ?2 j2 }1 k
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
( q+ N& K- Y" t" n7 A4 b% M8 `
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
/ l! X8 ]. g* V
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
7 W2 ?4 N. d6 f1 c% F; Y, A
) `% i6 _ r% u4 M
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
4 |( ~* ~, v- K: W3 B. ]+ V! H
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
2 i% a$ U1 t9 F9 D* a/ a
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
1 `9 v. h5 M, a/ Z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
! u+ D1 g2 p1 T; @
( Q7 s: Q0 a6 q5 i$ b _' w- R
mcasp->regs->XSTAT = 0x0000ffff;
, [+ v9 P. ?% E P3 W5 C! t
mcasp->regs->RSTAT = 0x0000ffff;
. ~1 R& j3 ]% e8 k% U
- w$ l2 t" y% d* {$ W
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
5 g( F0 ~9 X% l3 N) ? l6 O
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
( ?4 Z, F) R& ~; N. ]6 k) k
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
' T4 c% r" i: |) Y/ w+ n9 Z+ e$ `
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
0 Z% Q/ l+ G2 R
) C7 u; M7 H4 A4 ?
/* Write a 0, so that no underrun occurs after releasing the state machine */
* q6 B" n( }- j4 P
mcasp->regs->XBUF5 = 0;
}$ }* a% Z$ }6 i1 n/ ~
mcasp->regs->RBUF0 = 0;
3 H6 C# W2 g8 w$ k, B9 R }2 ~
% S$ o. z/ _# I. f" m
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
- ?7 E7 v+ K5 q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
. m! R0 `$ `) t7 G, h; @
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
, H. D* K |4 o! H! ?% l9 V
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
9 }; N% t2 S! ^( A+ k9 `8 u6 b) q
8 K: n1 }: v. G1 t. e
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
# f# B% B( c) F8 o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
, h e# @" m# D6 d
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
m& |. H3 n" ^, z2 q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
9 X; ~) Z2 p& W$ Y4 c- R
: Z: q# \" k8 p6 v! e# f) N
CSR = 0x0000;
D' J( v& h' q" W
INTC_INTMUX1 = 0x3d;
4 z6 W! ]8 o4 S2 Y) Q/ P' Z
ISTP = (unsigned int)vectors;
b6 F* ?8 ~! ^! q. [' a! L# M
ICR = 0xFFF0;
+ \ J6 K7 y c9 R8 w
IER |= 0x12;
7 Z5 q# \$ A5 a& \. V! b
CSR |= 0x01;
; e; h& J+ f% @; A2 q
9 |/ O( `! G* h$ w' l! F
3 x$ ? B$ s! {7 _- e
+ j0 l6 _. y6 S) w& {1 u$ }) s+ i
还有就是两个输入输出函数:
$ |2 K' }3 A. {9 |! t; P7 A
void output_sample(Int32 out_data)
, A" g" x' j! y M, O
{
( t8 p1 ]5 ~# H+ S1 m
AIC31_data.uint = out_data;
* T+ ]) L1 Q+ t) ]8 Q
MCASP1_XBUF5_32BIT = AIC31_data.uint;
1 o2 V% f8 ^8 g7 \, [/ N3 |
}
) L" i' \- W- w! e5 V' \
! r2 `- o# p( j' \
Int32 input_sample(void)
4 C+ B' F- w2 G y9 T5 O$ L
{
3 a$ C! W" x* ~$ |* \, |/ L6 o
AIC31_data.uint = MCASP1_RBUF0_32BIT;
# T2 y/ o% H/ E ^6 `6 _4 C. g
return (AIC31_data.uint);
, K1 B1 V2 I% q O
}
0 u8 @0 J4 d2 N+ }
7 }! H/ ]+ z9 u8 B# t0 D$ o
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4