嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
]2 j% |1 n( i& l, A! R: r
#define PING_PONG_ACNT 1
* y0 M$ @8 K7 f/ A( j; d
#define PING_PONG_BCNT 8*32*40
; G, y0 k+ M3 l/ ?
//#define PING_PONG_BCNT 1
' ~ @6 q* k& n9 c# l4 L
#define PING_PONG_CCNT 1
9 Q5 B2 ^5 {$ x! y2 h0 ]
#define MCASP_BASEADDR 0x01D00000
" O. U6 x! h, @3 [# P
#define Mcasp_RXEVENTQUE (0u)
* P1 A8 e) w: k: o; Q: N
) H6 x5 J% D2 H1 Z" j- u
/* OPT Field specific defines */
U' K5 ]' x' ?
#define OPT_SYNCDIM_SHIFT (0x00000002u)
# ?) h) a' b; \
#define OPT_TCC_MASK (0x0003F000u)
# g$ h: ]6 K8 E) e' O7 C3 ^
#define OPT_TCC_SHIFT (0x0000000Cu)
4 F; O4 q6 ]+ H4 W) g% z: w2 g
#define OPT_ITCINTEN_SHIFT (0x00000015u)
) ~* o2 Q, d1 s$ D2 F6 l' |) p
#define OPT_TCINTEN_SHIFT (0x00000014u)
( z7 ~3 r5 |3 k9 o" G) W/ v2 n
0 n4 h# f# f- H1 w F" D6 \* W
char ping_buffer[PING_PONG_BCNT];
6 ~; Y# E. K; Q
char pong_buffer[PING_PONG_BCNT];
" S9 O6 |/ i* \0 x* X
+ }: B: _& o" B6 s7 ~
4 j8 v) B L9 c O5 i" F5 w
3 y% c: K" Q) V* g, j0 u3 i
& G ~# r. c% T) ^3 L
static void ys_edma3_init()
$ |0 P2 ]9 q i& Q' \- B
{
3 I+ f5 e' m9 |4 a9 b) D/ Y& d
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
1 r$ R5 P y$ \8 _5 S9 A- ]
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
4 H/ U; ~" ]) j" y
EDMA3_DRV_Handle hEdma;
% o1 v5 I T& @4 f& J
uint32_t chId = 0;
0 u$ `/ `: m+ {6 W8 u
uint32_t tcc = 0;
2 h9 t" j( Z: |
, ] d1 w- L7 L1 O: o
print2arm("edma3 driver init...",0);
1 h7 I, i: n, y
2 x( q1 x: ]0 L
hEdma = edma3init(0,&result);
9 q' n# C( |/ ~+ t! E% [9 T3 v
if(hEdma)
$ U0 s/ t' Y6 t$ A$ }' ]( g8 N
{
/ J) T1 B! a1 b
print2arm("edma3init() Passed.",0);
& ^9 ~1 T+ {4 a4 V& x5 M
}
3 l/ o ^) l4 Y- d% J' A
else
: E- _. ^9 a- G" J# N
{
2 I0 g' e: ~; p
print2arm("edma3init() Failed.",0);
3 Z2 j% D- `; I+ ?# V
}
" H6 T* u$ |0 `- S7 }7 V
5 B6 z S+ S+ j# c; o, I
if (result == EDMA3_DRV_SOK)
* Q# @+ d D2 M7 t3 T8 }0 s" b
{
`- ~" x! t8 l
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
5 j4 x1 D, B: r8 \& B/ ~. H' N
(EDMA3_RM_EventQueue)0,
$ |% E T# [8 G1 t
&edma3_isr, NULL);
+ P% i7 ^) X5 w& |; U
}
7 ~- p. }4 {8 {3 \
4 K4 }. F% v% b4 m( L
if(result == EDMA3_DRV_SOK)
/ z8 N! n9 f1 }7 l* D" F
{
5 U; u+ m. w$ k+ p
paramSet.srcBIdx = 0;
9 {: Q/ [. Z s0 t' N" c) t
paramSet.destBIdx = 1;
. u' z, {! ]& |5 A; g, E; k- Q
paramSet.srcCIdx = 0;
- C3 T* Z; H2 d* C' n- o" b) M; `! T
paramSet.destCIdx = 0;
, B4 \; b4 {5 U9 S
paramSet.aCnt = PING_PONG_ACNT;
3 o! r7 f# Y* q: @2 D' s9 a
paramSet.bCnt = PING_PONG_BCNT;
6 `% F1 |9 [& O+ H% q" F$ F
paramSet.cCnt = PING_PONG_CCNT;
0 a7 L, ], |6 k' I# _3 n( i2 l
) z7 s. ?* @& ]! K
/* For AB-synchronized transfers, BCNTRLD is not used. */
. u8 z& d# Q/ e4 h- a) Q
paramSet.bCntReload = PING_PONG_BCNT;
& N- A6 O8 w+ V# X9 b7 U3 |+ v
2 [. R* J5 t5 k6 ?8 e2 b8 t
/* Src in constant mode Dest in INCR modes */
" u8 R, }, V: o7 I' ~
paramSet.opt &= 0xFFFFFFFDu;
) B. V' H. G+ i6 p6 N1 t
//paramSet.opt &= 0xFFFFFFFCu;
- U7 w; {" {* y" C" k8 {5 @
3 _3 J3 j; D/ b8 W4 e
/* Program the TCC */
9 [9 g; r/ e* N8 \- |6 L
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
3 T6 Q* T1 Q8 N/ W& `
$ G" y( n8 }' @/ p* t q
/* Enable Intermediate & Final transfer completion interrupt */
( t5 l: |7 Z5 ^" l: L) [6 z9 S
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
. Z/ L& d* W/ v' C; {
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
+ {: z$ w! Q7 l. S
; g% H5 V% D+ {4 e# a" e
/* AB Sync Transfer Mode */
" X: i0 P+ o, g% V2 }2 q2 @. A
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
3 [8 N# {4 P( |
( T2 R4 Z9 l/ P& _! D. o. `
/* Program the source and dest addresses for master DMA channel */
. A2 _; m6 t) E3 Z4 [* x! T: G
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
$ @; b# _5 P7 W+ a) _2 x
paramSet.destAddr = (uint32_t)(ping_buffer);
9 u( j* y, s3 [! x: ]: M& r
+ ^% W, J# @& ]
/* Write to the master DMA channel first. */
& |8 D; n5 P4 \4 s0 i
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
1 R8 v1 P# N, @, V0 U
}
! o+ S6 i( [# N7 S2 q1 f
. a0 C, {) W( J7 \7 P
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
; _( {9 g1 k0 {; g4 V% [
8 l& m& y; I7 ~' P) ~5 r% w# D8 a
if(result == EDMA3_DRV_SOK)
g5 o6 p4 h! N+ ]$ i) ?
{
% {7 j; \# ?' Z6 a k
print2arm("edma3 driver init success.",0);
8 `# u) G3 r" F6 M) N
}
8 ]3 Z# s! f+ @2 Y0 h( n7 C- D
}
9 r2 X4 A; K1 u1 {" ~
2 A9 X% R+ j- \5 ?1 o3 D
; C: f) n0 T3 m9 [' K
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
. R# C9 E3 q1 D0 g7 L# ~. T4 B* j
4 p! o) @7 `# Y+ ?, e/ F
3 ?& I( W* Q. n8 H
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
7 ~/ z# ^8 ^' Q
每次DMA传输完成后都要再次使能传输
( F& ^' ]. v8 K5 [! O# O9 H E
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4