嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
8 @! v6 }- i3 V
#define PING_PONG_ACNT 1
. ]% {$ B2 i2 n3 a+ m/ y
#define PING_PONG_BCNT 8*32*40
! |: ^) i% }. L/ s6 B# B( P
//#define PING_PONG_BCNT 1
0 c8 P" O+ z/ u* W: m
#define PING_PONG_CCNT 1
- J2 T/ p/ S5 T* b
#define MCASP_BASEADDR 0x01D00000
& H0 f2 S& Y9 b' c
#define Mcasp_RXEVENTQUE (0u)
/ [/ G4 s% j# o& \: `1 ~
$ D& N, U* ?: W Q' ?. R
/* OPT Field specific defines */
V# u* K9 o7 I
#define OPT_SYNCDIM_SHIFT (0x00000002u)
# L. q' V( a0 ^# k* _
#define OPT_TCC_MASK (0x0003F000u)
2 m3 |3 i7 `$ M" g, b" F% i* c6 _
#define OPT_TCC_SHIFT (0x0000000Cu)
$ P$ u4 s9 i6 l N
#define OPT_ITCINTEN_SHIFT (0x00000015u)
9 g S% i2 V& {* I
#define OPT_TCINTEN_SHIFT (0x00000014u)
/ S- G2 H3 _" u' n) h: B
. B+ r: C5 N8 _. `' D7 n
char ping_buffer[PING_PONG_BCNT];
5 I: a+ ^* O8 ^# m5 s) y" u! H
char pong_buffer[PING_PONG_BCNT];
8 N- ^$ N0 d. x4 k
# H+ ?" S) C3 h3 S6 j
1 ^; M/ a8 W% {, q5 Z6 E
9 {) j4 @$ e4 V5 M$ h
7 t: o% G5 j' d5 M3 s
static void ys_edma3_init()
6 F% ^9 m1 U5 f& Q
{
2 t0 A2 S% B/ @3 Q4 f4 I5 A
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
$ Q$ I3 p [6 e5 K2 M" p- P* F9 l
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
9 a% w/ U. t6 x/ K( Y# O" Q
EDMA3_DRV_Handle hEdma;
( F& h: s) m8 z/ v. J: X
uint32_t chId = 0;
7 P- t0 w" R; F
uint32_t tcc = 0;
* h* j! l1 W8 q+ t. G
7 J: l6 s9 i. G3 ~
print2arm("edma3 driver init...",0);
+ h5 v5 Z. L, W3 K8 t3 K
# L5 d: n. X( y
hEdma = edma3init(0,&result);
% C$ n4 J1 ]- u& r, X0 Z
if(hEdma)
, U) w* `; p9 Z
{
, U1 e# W6 f- P$ N4 k
print2arm("edma3init() Passed.",0);
2 S$ D* x ]/ K, o- ~
}
% D+ K j. @! f* C* p. b
else
5 f9 N/ s: Y+ v, K
{
8 E) S7 f+ P& U( F
print2arm("edma3init() Failed.",0);
& ~. X7 j. R0 y0 ], ?
}
; k0 s- S5 I a) I. x2 i
- J( Y; }% E& H7 ?3 E6 V
if (result == EDMA3_DRV_SOK)
. u& C N5 s9 `! E
{
- J0 j' r! N/ p
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
z: s: R" Z4 c- H M; I" @ W
(EDMA3_RM_EventQueue)0,
, e# C* R! c6 K! M
&edma3_isr, NULL);
t' m/ Z9 y# D7 a& ~ @2 t
}
/ X ^9 n9 v. t; x: L% ~: R
& }4 W9 r, O. i$ b2 o
if(result == EDMA3_DRV_SOK)
+ U. ]& n1 m) Q1 f/ C- w
{
( Z1 R$ c* H) z/ W7 h
paramSet.srcBIdx = 0;
) v! X, P/ S' F- Q; z7 l# R
paramSet.destBIdx = 1;
% X( T+ u1 W4 v" e$ n5 O4 T. Q( _
paramSet.srcCIdx = 0;
/ O* k" B: {+ b6 W' |) d
paramSet.destCIdx = 0;
/ N; @8 U- H4 M" u: { @8 c
paramSet.aCnt = PING_PONG_ACNT;
" ~: A% W) _6 t! ~* r
paramSet.bCnt = PING_PONG_BCNT;
$ H3 L, E$ \ W q" I
paramSet.cCnt = PING_PONG_CCNT;
2 q) x* }; g, k) a6 q( K
. o2 F4 Z" t. O" j: ?
/* For AB-synchronized transfers, BCNTRLD is not used. */
1 K# d+ o% o* X Z: e3 G! R3 ~
paramSet.bCntReload = PING_PONG_BCNT;
3 s1 v b( ^0 J& q! G) Q
5 n; [* Q! b) ^) k. L
/* Src in constant mode Dest in INCR modes */
/ Z2 g1 F3 r8 D5 l! U1 b9 t# H9 d, u
paramSet.opt &= 0xFFFFFFFDu;
! M8 j" S- A* v9 e9 p/ y$ F% j
//paramSet.opt &= 0xFFFFFFFCu;
" ~. V& z8 m" N& i" |
! u1 M l8 M6 Y) @! L# ]0 @$ S
/* Program the TCC */
) s: s* l% t1 e/ B
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
$ s0 |: j1 _. r& ^: t; L
- P' P: a) C; J( g# y; |
/* Enable Intermediate & Final transfer completion interrupt */
5 W0 p1 n0 z. G- ?+ B8 h( h8 w
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
, _3 o! L; q: u4 G
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
* Z6 |/ l) A. q" `6 @8 f
9 o( L# p* i; m$ T* o: V7 ?: R- k
/* AB Sync Transfer Mode */
- D3 w$ A" i. v' S& I
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
# |! H; ^7 G# f: n9 Y; V
) e" e2 k: f s" H# h: p; U
/* Program the source and dest addresses for master DMA channel */
( y/ N( `" ` @+ Z
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
7 G% G& `; T) R2 I$ S8 h$ `2 @$ |' Y& T
paramSet.destAddr = (uint32_t)(ping_buffer);
" \9 S- h5 S6 B* H2 G8 r/ v
! W q4 K& E5 i. N
/* Write to the master DMA channel first. */
6 q2 C% A+ Z/ q' q
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
( e0 i4 T# l/ \4 Z9 |& b3 L! U
}
6 d/ [, P" O) t) p5 }: H
+ `# n# G7 L# W, `" f; b
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
7 `4 v7 n9 y2 q
( y& m& U, v6 j$ X% r( I
if(result == EDMA3_DRV_SOK)
& z# Z7 ~) U* E' F' Y
{
' o. C& c6 I# ?$ |9 `
print2arm("edma3 driver init success.",0);
, q0 v1 M3 G4 O! J' j1 c
}
' Q, I6 p/ f9 ~9 { s1 c9 x) e6 a
}
" F: p" Z7 M; X$ P% [; O2 o
2 u& O& J4 d; S0 r3 c. \
. z- L; Q' R9 h- [ w
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
5 I9 }2 O' s( W6 E
' Y) u, p( c$ t3 S
w$ Y8 _& ? @; _
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
( V1 J- l. P/ d
每次DMA传输完成后都要再次使能传输
- G7 D/ N O) ^0 }7 a& J% n
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4