嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
, A2 ]& h$ {, O+ C# [3 c% I
#define PING_PONG_ACNT 1
4 ?# O6 f* p& m2 k; B4 Y+ b: G
#define PING_PONG_BCNT 8*32*40
% o- I) F. v+ \2 G+ i+ W
//#define PING_PONG_BCNT 1
% g( `4 B, H5 p1 \9 _
#define PING_PONG_CCNT 1
" G: Q+ z' A+ {7 I; y# ^% l
#define MCASP_BASEADDR 0x01D00000
6 E8 L; t6 C$ L; S8 [/ I3 U
#define Mcasp_RXEVENTQUE (0u)
; z; g0 U; o1 d' `1 c. C& G
( }& [' h, T5 G) @& O
/* OPT Field specific defines */
2 a9 S- ]/ u. [# K
#define OPT_SYNCDIM_SHIFT (0x00000002u)
/ c# c: i& p; I1 p! m% j' }
#define OPT_TCC_MASK (0x0003F000u)
1 T7 V7 x3 {( _7 R$ c+ W& b+ H
#define OPT_TCC_SHIFT (0x0000000Cu)
9 U& v1 R" [0 E
#define OPT_ITCINTEN_SHIFT (0x00000015u)
8 P7 x2 `/ j- X8 a$ x
#define OPT_TCINTEN_SHIFT (0x00000014u)
/ K- a3 A& ^0 t5 K
0 c. j) D9 E7 b1 d7 S9 M$ W. p3 i; l
char ping_buffer[PING_PONG_BCNT];
0 C3 S- z- i" G, p' E# x
char pong_buffer[PING_PONG_BCNT];
, ~: |* Y3 a f& b
% b0 C% U! i* m- G S P2 m7 M
. g! w$ `& c' \6 x2 f+ b
9 ? |- k1 {5 x& g5 [ J; \$ G
' l: f; v' l2 F3 I) |4 C& W% @. p
static void ys_edma3_init()
; j* |/ `' _0 r( d/ v8 Q4 K
{
* O# ], Y, d7 X& H2 E) \
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
" F3 i+ K4 t2 Q9 u' U
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
9 w4 ^( o ?' n2 t7 c( Q
EDMA3_DRV_Handle hEdma;
; Q& J+ ^ A! W; n- s2 ?* q3 s
uint32_t chId = 0;
1 [3 f: _; n/ _8 p
uint32_t tcc = 0;
1 S2 v; \ T4 C
! g5 z+ o9 ~' L6 D3 I% m5 _; z: o
print2arm("edma3 driver init...",0);
6 o+ t! \( u2 [0 {
# E% r2 |: e+ G' Z) K8 Q6 E7 l
hEdma = edma3init(0,&result);
1 {, x8 a& r3 M' j
if(hEdma)
* V+ V3 w$ X6 f' R3 Q/ ?6 k
{
9 @- R- R/ p* G9 b5 ~8 b
print2arm("edma3init() Passed.",0);
8 b" h/ `2 x) P7 ?, z* b) I
}
/ n+ l+ o% ?: }, k
else
, s) Q3 ~, ^4 C; J; i( e& O0 X
{
5 E9 H1 P7 c9 {: l
print2arm("edma3init() Failed.",0);
9 i$ A' D, [: X( ^
}
4 k, E1 C3 Q: N) O3 x! R! a. u
- x) B- J- k4 \2 y& a
if (result == EDMA3_DRV_SOK)
# M+ v2 G" B4 V5 k" M1 ]( V- ^
{
) g7 r4 `- s6 [' Z' |0 i' s8 W- M
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
/ n4 a* w: z3 f1 C3 F0 I% `
(EDMA3_RM_EventQueue)0,
) `) C" x/ U* Y1 U
&edma3_isr, NULL);
5 f! R' A& _; V% r4 S6 W
}
) ]$ ?- k- D" N1 _( T
4 ~8 J8 H/ W6 Z- }. N
if(result == EDMA3_DRV_SOK)
# A, J& u7 X6 _3 a! Q" Q7 I5 w
{
# A9 ]2 T5 |) L( H8 ^0 i
paramSet.srcBIdx = 0;
5 ^6 x6 o; D4 S; W" j
paramSet.destBIdx = 1;
8 a$ r3 @3 N9 x- p% |' i$ E6 [
paramSet.srcCIdx = 0;
0 W, D+ ]. N7 B# N
paramSet.destCIdx = 0;
: y& @+ I5 y, W. s0 I
paramSet.aCnt = PING_PONG_ACNT;
/ e2 ~& h$ G* I5 c( O* E' M G' b
paramSet.bCnt = PING_PONG_BCNT;
2 s& q# ?$ P7 [
paramSet.cCnt = PING_PONG_CCNT;
: I% b2 a, T" U) ?& u9 ]/ a
, P. G& ^* ]+ b( k/ S& ]
/* For AB-synchronized transfers, BCNTRLD is not used. */
# m- G& T) i' _
paramSet.bCntReload = PING_PONG_BCNT;
5 j/ [* R; i. T7 j& Z
; B" O5 r2 Z# z: Y: s5 Q
/* Src in constant mode Dest in INCR modes */
2 {9 i O- Q9 X1 n8 [& C
paramSet.opt &= 0xFFFFFFFDu;
, S. K6 i1 B K Y+ J3 y& b. z
//paramSet.opt &= 0xFFFFFFFCu;
% v6 ?. I8 H& s
& a' S% ?4 F- v5 S* `! o
/* Program the TCC */
0 I9 c3 `$ u- e2 o$ ^
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
3 o: Z9 h* r F* _: r* j; z
1 T% |+ h/ R8 O+ Y7 |
/* Enable Intermediate & Final transfer completion interrupt */
; n* @- C* H# s& w9 A+ x
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
' ~" L- ~% e- h- Y3 P E5 U& ]1 z* P
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
4 x: Z: x* D4 g: {! w
1 R% N% z7 F! [8 s) E3 c* x& a7 T
/* AB Sync Transfer Mode */
L n% V$ C6 \; P* f
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
; k- I2 C! a$ V- }
" H+ E6 o4 U1 f) w; { r
/* Program the source and dest addresses for master DMA channel */
m2 H6 ? w( A1 W% K/ ^+ L
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
8 ] C, R3 }0 j
paramSet.destAddr = (uint32_t)(ping_buffer);
1 H: N$ e' o1 M; x3 i8 f% _2 e
I) b# F. `+ ]2 A B' G0 u
/* Write to the master DMA channel first. */
& d/ R& Q+ ~. A+ E1 T
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
! G. [ |# C k3 K" K
}
3 Q+ l4 k4 t6 E+ B$ B8 k
' H) k* F4 r) K. i
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
4 G, m- F! Z8 w5 Q8 h' }
( v$ ~0 y5 u7 K
if(result == EDMA3_DRV_SOK)
: t. o/ F" h- d' K1 v
{
! _9 E! \' x8 F9 H
print2arm("edma3 driver init success.",0);
5 v$ B: u" L- f
}
) s) S7 I$ {2 R& W/ ~
}
/ j, t- I0 ^: l, v: G% w2 [* {# `
3 X1 e! l- N3 R( l
5 Y" N+ h& x$ d9 r
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
* Z- g9 n# F& d
; A' w6 T. d2 s( u) _4 m
, @6 p2 ~! Z2 K Y2 C4 ~( l* ^
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
/ m- h2 L8 |8 H. a/ ~$ }
每次DMA传输完成后都要再次使能传输
) G' D, U; t/ {8 q! e
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4