嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
5 W) D4 G4 s7 l# k. g2 i" i& U
#define PING_PONG_ACNT 1
3 L/ c+ [+ s w
#define PING_PONG_BCNT 8*32*40
5 h, G8 I! M( s$ S. r7 n
//#define PING_PONG_BCNT 1
( _8 w1 `* d& E' `" b* M/ @
#define PING_PONG_CCNT 1
# l4 B4 r" I/ l0 G6 |7 d$ [$ \. C, t6 g
#define MCASP_BASEADDR 0x01D00000
: A2 j# X) a. o% a* z
#define Mcasp_RXEVENTQUE (0u)
8 z2 [3 L2 h& X
0 O- y+ \! C! u- r s
/* OPT Field specific defines */
! @ u" v# b9 D/ S$ z
#define OPT_SYNCDIM_SHIFT (0x00000002u)
) w3 p) f7 u5 U5 U/ k
#define OPT_TCC_MASK (0x0003F000u)
+ w) B B: E* x
#define OPT_TCC_SHIFT (0x0000000Cu)
, ?+ l/ d+ i2 Z h9 y. u
#define OPT_ITCINTEN_SHIFT (0x00000015u)
$ L1 ?2 I8 K9 B, t( j
#define OPT_TCINTEN_SHIFT (0x00000014u)
) ~1 F' y% W) e# T
' V7 o" l/ C. p! o0 M! H
char ping_buffer[PING_PONG_BCNT];
# \; V6 Y0 U O9 m
char pong_buffer[PING_PONG_BCNT];
, `, \0 z8 Y) c' h( Z6 b! A' M
# ~" N" U' u; A
g# z: @/ N# `9 `% s6 }+ z
- ~ {6 \) I6 _
" N9 Q; V' w) R; r& p- d' x# J
static void ys_edma3_init()
5 C; ?/ _9 \) j7 ]
{
2 ~; ^1 j0 S5 W7 ^* X# ~3 y) C& x: |
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
1 W8 `% F5 |5 C
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
4 d$ d1 |' C2 D4 l* s% I$ X) V2 G
EDMA3_DRV_Handle hEdma;
& |% @2 J9 N- r( Y' M- P7 K
uint32_t chId = 0;
! L9 W5 R$ K: O- p/ g+ v8 z
uint32_t tcc = 0;
0 B z) u7 O3 L# u" ]7 L- c
( b# s3 ^* x, I
print2arm("edma3 driver init...",0);
, d- | T! ~6 m/ B z
3 u1 a; i0 x( A2 @1 w" {
hEdma = edma3init(0,&result);
2 g$ ?; @0 q* S: d% h. _+ r
if(hEdma)
) W3 E o# b) G$ z; [4 I; G- `
{
9 G- y* C3 r Z
print2arm("edma3init() Passed.",0);
4 _ h' D/ ~/ Z* C
}
X7 |: U$ D$ q' p# w
else
5 n+ i& X+ V3 j2 E! q& R3 m( ~
{
* [3 ]2 |* e+ Y6 @1 X0 h
print2arm("edma3init() Failed.",0);
1 I% M M9 f( ~- k1 N& h9 L+ P
}
1 x- u8 r: b( g5 k
% o; Y) O: Z# O. s
if (result == EDMA3_DRV_SOK)
6 n1 }, s& ~5 ]+ x' ]1 A8 H% V4 m# _
{
" w0 [# J* j9 [' a; ]) B- o
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
( K2 H: C- `/ r! k! B l. y7 M9 M5 R
(EDMA3_RM_EventQueue)0,
! {) W3 M& c; U5 ^
&edma3_isr, NULL);
6 o/ m/ _& Z) M' N$ t' d2 Y E
}
& o4 Q+ p, b! P8 m( W! s
& ]' g+ x$ y( X2 _: Z e
if(result == EDMA3_DRV_SOK)
" h/ E! w* t4 e q5 X6 Q, N9 r# H
{
) s- s' K& D' t; t2 H
paramSet.srcBIdx = 0;
: O' ^$ Z% F; ` t, U+ v5 [. U- e
paramSet.destBIdx = 1;
L5 f6 g& U4 G7 f* i2 d
paramSet.srcCIdx = 0;
# F/ U7 Z1 ^+ ?* v8 Y; f. W4 f
paramSet.destCIdx = 0;
& Q H# W/ Q; F) C$ i
paramSet.aCnt = PING_PONG_ACNT;
* y8 \6 K$ t& H m |8 z! P
paramSet.bCnt = PING_PONG_BCNT;
8 U" _( Q5 s X( H- l
paramSet.cCnt = PING_PONG_CCNT;
/ n2 Y; \+ @1 j$ l0 N
" D2 \( G% c$ u9 r, y" C# x
/* For AB-synchronized transfers, BCNTRLD is not used. */
9 H/ v: S& F3 F) E- z
paramSet.bCntReload = PING_PONG_BCNT;
3 y) e/ ?' B% x% G- Q7 b, C
# P/ K1 ?8 V/ R& b, m6 v+ v
/* Src in constant mode Dest in INCR modes */
5 O3 `; i9 j" w3 j
paramSet.opt &= 0xFFFFFFFDu;
( P. n. B/ M+ {% E) [
//paramSet.opt &= 0xFFFFFFFCu;
1 u0 _) R2 r0 J9 t1 ^) Z1 `- H* d
) C, d0 I# C1 Y( M
/* Program the TCC */
# A4 b. ]$ n) |# e F' M" Q$ h1 K
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
/ \$ z4 F" h% z# w# a* b3 y0 j5 T% {
. }0 {; o" }9 Q% l! o$ Y
/* Enable Intermediate & Final transfer completion interrupt */
( d6 v# R; K' K; ^$ o
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
0 o' K' U4 F! _9 g
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
9 \! L/ ^1 ^; {; Q
* S* N- O" P2 P. W
/* AB Sync Transfer Mode */
1 b) `; y! W# W" Y4 d
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
1 ^& I7 Q9 O: I( h! b
: X* O6 C5 L- O8 \. L2 r
/* Program the source and dest addresses for master DMA channel */
5 k5 f1 g/ |' c5 e+ f4 w
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
; }6 [: v1 {: \
paramSet.destAddr = (uint32_t)(ping_buffer);
- N {3 @! H" U6 t4 j* }
, B. K( U" u# y
/* Write to the master DMA channel first. */
$ Q, o [+ A4 v+ U$ @" @9 k, K
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
l! B9 J, c: h8 J, b4 r6 R8 {
}
; r) ]$ ]8 t& i6 |* C6 D
, }! o- G/ {! {4 p) z0 z
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
T. Q8 { v: W: }: C8 b. x; c
S* k9 `% O# g5 @( l
if(result == EDMA3_DRV_SOK)
( u+ c/ n2 i+ r7 Z: J. ]
{
4 W1 A. u5 }* D$ B$ q6 V
print2arm("edma3 driver init success.",0);
s* @* c% ^1 C% Q( C
}
8 X2 ~! B0 T% n
}
- e' T, s) b* r3 ]/ \' b
6 q+ x9 u2 w* w
- @% Z6 m5 p, K: @ Q3 Z
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
% \1 F2 C0 z% ~" J9 ^
9 `: C8 X2 J' T! ?3 F/ ^
' m( b' ` R( s$ x+ }$ M
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
. X8 U, ]" ]0 Q) D
每次DMA传输完成后都要再次使能传输
0 k) A/ q$ Y+ a a6 I, b3 |5 W
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4