嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
) I4 z' M. t/ x* [$ F, M
#define PING_PONG_ACNT 1
! d6 m4 ]0 J1 @. Q/ A' y9 u4 ^
#define PING_PONG_BCNT 8*32*40
8 z8 d7 r( \5 K! F( j: T3 {
//#define PING_PONG_BCNT 1
( e1 o: p& U% |/ X
#define PING_PONG_CCNT 1
9 R6 T# U; F4 I f2 a S* @
#define MCASP_BASEADDR 0x01D00000
. l! c2 _6 K1 ?* X% S" ~3 u
#define Mcasp_RXEVENTQUE (0u)
5 `6 {' K: i8 n9 Z! z+ R; S
/ X" p! Q( H$ J' k
/* OPT Field specific defines */
: d5 S$ A- s3 B0 [9 B/ w
#define OPT_SYNCDIM_SHIFT (0x00000002u)
$ N- f. }9 H/ i9 [. u/ R
#define OPT_TCC_MASK (0x0003F000u)
& ^- }: G4 b# V* k& y8 V% c
#define OPT_TCC_SHIFT (0x0000000Cu)
% s. w' t6 R) j& Y' q$ I& v# P7 \
#define OPT_ITCINTEN_SHIFT (0x00000015u)
9 ^( H2 `3 }+ i# I7 s& ?
#define OPT_TCINTEN_SHIFT (0x00000014u)
4 u' Y& A! y0 Z7 e' c
/ J/ R. N# X; }/ r* J+ Z
char ping_buffer[PING_PONG_BCNT];
: T" K+ R _1 Z4 [' M( N: n
char pong_buffer[PING_PONG_BCNT];
4 W; E' J2 v* @- l
" o9 A& j) i% V9 v; V( e1 X/ L
7 i! D z% i2 a8 Q+ ^
5 M: j2 m" ^ e% p a# F
# W5 H7 g( N, X- S! T
static void ys_edma3_init()
; k* v7 C7 k1 ]) K4 Z4 b
{
0 t7 M9 ?& O" c
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
+ B7 Z" X* ?; z- U# R) l4 ~
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
7 R1 z* b/ U" _, V( ^# P
EDMA3_DRV_Handle hEdma;
% {2 Y/ s a& B
uint32_t chId = 0;
; J" X5 f) r# g
uint32_t tcc = 0;
& U- M, P! K5 D/ I2 Q) M. h
6 d) r, q& {. a0 l( U
print2arm("edma3 driver init...",0);
. w/ \3 f! R5 v3 d7 u& L! L# O
t9 Z5 w: L+ H
hEdma = edma3init(0,&result);
4 z- X5 Z9 d# w3 F; W6 U4 u* p
if(hEdma)
6 `5 m( N: y ?% P, O
{
# ]. i3 U: }" V
print2arm("edma3init() Passed.",0);
# y2 g: u" R5 Q, S1 [9 @ o
}
5 O3 N1 u! [7 s# r
else
( E* B$ L y% q2 }* D. b0 V/ i$ {
{
" X- v) A! \7 A/ ` I
print2arm("edma3init() Failed.",0);
/ t+ b0 ]* A6 M0 C2 A6 u0 j5 y
}
3 Q8 P7 u1 \2 }/ [; {. J3 Z+ [# l ~
6 P$ \& b: ~- C" q9 ~1 N
if (result == EDMA3_DRV_SOK)
& `- K# r/ f5 @1 H' Q3 c, l
{
6 L4 M. M! a+ \! R) R% T& T: Q* j
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
6 H$ U9 z% }5 u
(EDMA3_RM_EventQueue)0,
! R; M; p6 Q( D* _, g1 K
&edma3_isr, NULL);
- P& J" H& ^" r. j; ~
}
) r. o8 Y b D0 c# E% G
" r8 E" s m% b( X9 `; [- x! o0 S
if(result == EDMA3_DRV_SOK)
4 E$ V$ m" Y& W+ U/ b, }5 r2 U u
{
8 l1 m; D! S# u! [# C9 p
paramSet.srcBIdx = 0;
6 N5 C& k5 b! t8 t' P
paramSet.destBIdx = 1;
5 B7 ~ y# l7 z+ ]# |
paramSet.srcCIdx = 0;
4 j+ F7 s1 |4 F& k2 _8 H
paramSet.destCIdx = 0;
; _+ A8 ^0 S2 y' u+ i
paramSet.aCnt = PING_PONG_ACNT;
0 n, Q2 H: e5 h2 X
paramSet.bCnt = PING_PONG_BCNT;
6 a7 P# Z4 e' l
paramSet.cCnt = PING_PONG_CCNT;
9 c4 E% {3 A1 X( v( D, \
. x& C+ O1 ^( c) A6 m
/* For AB-synchronized transfers, BCNTRLD is not used. */
3 l4 ?1 I/ O9 F( p* p6 @
paramSet.bCntReload = PING_PONG_BCNT;
0 k! r1 O7 L% A8 h# d" _. e
; \, Y# @ a' z, p& W$ M
/* Src in constant mode Dest in INCR modes */
* f4 H7 U3 b3 N, c5 C0 K8 d
paramSet.opt &= 0xFFFFFFFDu;
3 `/ @: h+ j( m3 }
//paramSet.opt &= 0xFFFFFFFCu;
# T# n* U4 h1 W) Y: n& @
; j! ]1 b, L1 B* c# j8 o8 T/ z
/* Program the TCC */
4 s7 `( ^6 x, I' Q
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
. g. Z) Q5 q: c+ z: A% T. A& J5 H
- F0 w: D4 E4 Q2 Q' n" E
/* Enable Intermediate & Final transfer completion interrupt */
4 T9 T- R% v5 m; [$ H4 q
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
9 G$ |7 }3 `, Y; U5 G$ Z" T( [7 q! @7 |
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
7 f2 z: [8 p& [/ y3 I; s! y
7 T3 t0 Q3 {& Z& }; q+ H% u
/* AB Sync Transfer Mode */
" T5 b! z6 i$ n: ]
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
/ M) I% ?# i T% H/ F2 l4 {
9 L( Q9 a! _3 `- j" S/ E6 B( U
/* Program the source and dest addresses for master DMA channel */
, a; X$ [ a6 z) o% M$ p7 ^
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
; i1 _( w q8 O" K/ d" y0 j$ f
paramSet.destAddr = (uint32_t)(ping_buffer);
- w7 h0 d# q$ u0 m9 F* j$ Q4 p
+ ?# u8 J) N6 c; n3 S9 w
/* Write to the master DMA channel first. */
4 S4 M. |& S+ I+ b8 c1 X g6 h' N
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
2 k$ o. \' r* g+ e5 \1 ~* w4 C1 l
}
) Z" ^, L8 m3 n: {& e' }+ |" q7 V5 n( b
+ B0 _. x. U6 k9 |; m7 J
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
, U5 m% N) {, [+ u+ e+ T- l3 T
: s0 {5 P# {7 f$ Q
if(result == EDMA3_DRV_SOK)
8 x6 F+ i. x0 Q) p
{
) Z! g' A7 k. d4 f8 M
print2arm("edma3 driver init success.",0);
1 e- c6 q$ |) C% }0 E) G
}
# q* q- }! V; E2 a6 K6 ^" x( M
}
3 @2 k: r, t- l0 A/ P
4 K3 k1 |' l4 n* F- Z: K
- @8 V9 I% B. c1 ?7 f! V4 R% V
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
) i6 W6 |+ |0 ^" Q4 v+ ~
$ m7 X, t3 o- G0 J
* _$ Y# t) n4 f- @
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
& j5 z, G9 J, Y* e
每次DMA传输完成后都要再次使能传输
- I# W8 E+ a$ o o$ A+ P& v6 r
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4