嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
6 `. Z- `1 {" i, G0 _
#define PING_PONG_ACNT 1
; u% i5 @' t0 a2 L
#define PING_PONG_BCNT 8*32*40
5 {* f; j% q" z' x
//#define PING_PONG_BCNT 1
$ ~5 D7 d+ O" s* [8 E4 p! c
#define PING_PONG_CCNT 1
! D. i: f5 q' U: ~- U0 b) F
#define MCASP_BASEADDR 0x01D00000
4 K! `. ?& L! }7 ^
#define Mcasp_RXEVENTQUE (0u)
. D7 K$ c0 u& z1 \1 y+ \' i
) i% ?$ m( p/ J } |
/* OPT Field specific defines */
9 n6 L) c7 ]9 p0 ~. {
#define OPT_SYNCDIM_SHIFT (0x00000002u)
6 T& N/ `3 _7 n9 T- `6 W
#define OPT_TCC_MASK (0x0003F000u)
2 R! a# ^& M" ^, ~& X9 t
#define OPT_TCC_SHIFT (0x0000000Cu)
4 N. ^. N Z* N: n S2 m
#define OPT_ITCINTEN_SHIFT (0x00000015u)
3 q! O' h' N9 F& o* v& @3 r7 M
#define OPT_TCINTEN_SHIFT (0x00000014u)
& j1 C/ J/ `$ j- {: `/ u
% [% _! l& Y0 }& U
char ping_buffer[PING_PONG_BCNT];
- J0 \3 S3 H1 x9 Z. w& K& e
char pong_buffer[PING_PONG_BCNT];
" Z2 a, |) M9 \( X5 a
8 y( ]4 Y2 P8 L: b$ q' w1 Z
' Q& l! g+ j6 P$ i9 [ b$ [/ ^8 e
6 C' `' N% A( T: r8 s
+ v% A$ @' u0 w" D
static void ys_edma3_init()
3 X, `* v" X" S, `0 @( N9 D
{
. H" B" D" u6 U$ u. r) K% e: {
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
B. [% s5 t# r3 `, M: E+ h
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
W) r4 @" q; {8 F, j6 B0 @
EDMA3_DRV_Handle hEdma;
" F5 z3 s4 O2 v2 v) v9 p
uint32_t chId = 0;
1 }, L& s' n% l. \# [% l. ^
uint32_t tcc = 0;
/ I6 {( k( }- `) b3 D( Z
8 g& L0 s$ H5 k- k$ S
print2arm("edma3 driver init...",0);
* z$ U c! d+ F) Y0 B
, Y2 N! {: M( J7 n
hEdma = edma3init(0,&result);
$ B- t% ?$ P/ X
if(hEdma)
5 q) P! c, O9 R& ~: P
{
) p$ D W5 @( I
print2arm("edma3init() Passed.",0);
6 Q) S! }9 ^9 H- a/ A% K" F
}
- k) z& y. o9 o- a, a5 g* G; [
else
( u+ W, m8 J. q) l, q& L% M
{
7 a- ^# Y, r* y; A. O3 S2 ~" B
print2arm("edma3init() Failed.",0);
* L9 n0 P/ `4 r6 w: o7 v0 z# O$ T
}
0 \4 g" l0 G- z; }
; g5 x6 y w) i8 P9 i# N& D
if (result == EDMA3_DRV_SOK)
6 P+ {- }# a3 y, f/ y/ g" y
{
' j) W9 t! o6 T; c/ q
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
6 {1 s/ i" f0 }3 a+ ]. m6 ^
(EDMA3_RM_EventQueue)0,
0 R3 _7 g6 x6 n5 Q# U% R1 Q) U9 p0 s1 `( Z
&edma3_isr, NULL);
% c3 N* x) P9 r- f/ N. Y# T
}
; d5 |* z& z5 Z5 U- x
3 I9 o# ]$ G! n$ o L: S9 G- z
if(result == EDMA3_DRV_SOK)
i T. I0 ]! v6 e7 \
{
- o9 A a& M7 f5 P' H
paramSet.srcBIdx = 0;
' `8 U& C; V4 @* n; w+ J5 B
paramSet.destBIdx = 1;
4 c0 M! q7 J: n9 z0 S; B. K
paramSet.srcCIdx = 0;
7 b2 C& p. |7 C) d
paramSet.destCIdx = 0;
$ n% z6 Z( y( a/ S6 i" `3 m
paramSet.aCnt = PING_PONG_ACNT;
0 I' b- p9 c* \7 W$ a& @5 N0 L
paramSet.bCnt = PING_PONG_BCNT;
9 @! y2 T/ D! Y
paramSet.cCnt = PING_PONG_CCNT;
Z" P" Z# a1 N" W
$ V/ U5 b2 Q4 {
/* For AB-synchronized transfers, BCNTRLD is not used. */
. V) P" l# U9 g p+ p2 Q
paramSet.bCntReload = PING_PONG_BCNT;
# J7 P/ B/ Y+ R9 K
. }( l( J" A3 H% z P+ u( d
/* Src in constant mode Dest in INCR modes */
5 i4 I+ h" B, h. W
paramSet.opt &= 0xFFFFFFFDu;
r& n4 D" A9 \2 g0 ~5 X
//paramSet.opt &= 0xFFFFFFFCu;
3 q" z( Z- r, l% m
3 f% W" U L5 _3 ^5 N8 `) F1 S+ @
/* Program the TCC */
8 @9 Z6 j- }) j. |' P* A
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
G. L/ y) \# ^# X4 u
8 c* ?$ _" _' N& A+ Z
/* Enable Intermediate & Final transfer completion interrupt */
6 S. P1 v. A8 ^: {7 K& ^
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
7 o, p" K6 m+ q7 n1 I
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
) E$ _1 K4 ` ?% x: E5 J; j- s7 I
* F8 z7 k( i& D9 E6 W" `
/* AB Sync Transfer Mode */
$ ~, X' w' w3 V, x6 x f
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
( `8 v: Z5 A2 V. U* n
: y7 C9 N3 e i
/* Program the source and dest addresses for master DMA channel */
( `2 `" E% g0 X
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
; U/ W& x5 o& a4 l3 o
paramSet.destAddr = (uint32_t)(ping_buffer);
( U* h+ N& v# D+ W+ _
: W3 Z( c* {1 r4 U( N
/* Write to the master DMA channel first. */
( F0 l$ A' J0 _6 L& V% n" ^
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
: U9 g1 {8 c0 J# j0 J
}
6 [5 w2 t) x m8 N% Y
! d+ \/ I9 o/ \* v8 A: W
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
5 \/ G, Z; s& }3 N
$ W2 g( E4 N) e6 a( \* X8 B
if(result == EDMA3_DRV_SOK)
8 g8 O8 r% ?/ g# ~; I. H
{
2 r$ W. `9 V; @8 k9 l! b
print2arm("edma3 driver init success.",0);
! e2 z p! z5 w: [6 s
}
- t0 j: J; v* s( R
}
9 ]* I. ]4 V: N, [" U
/ K, T, C- B* |
4 c ?, c& a- E6 z
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
7 l6 V! p" e0 S- F
, n0 g% z# u# z3 ]$ R4 k8 M
# d0 Y. y0 Z7 f8 _
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
8 F- y. L& i E
每次DMA传输完成后都要再次使能传输
% }& t0 u0 Y8 `' O8 j: d! E0 V
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4