嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
1 _8 T4 A8 g' h6 p* q; X
#define PING_PONG_ACNT 1
% w" |; k N5 j1 s( l# Y ~
#define PING_PONG_BCNT 8*32*40
' m7 b8 g2 ] c( p/ e7 n9 _9 |
//#define PING_PONG_BCNT 1
6 Y4 j4 }- c8 u8 g
#define PING_PONG_CCNT 1
. e' T' a+ }# p7 P
#define MCASP_BASEADDR 0x01D00000
$ \8 w2 F* g1 p4 l; h
#define Mcasp_RXEVENTQUE (0u)
7 f, r9 I7 M/ E+ ~5 a# z
# M3 Q d5 z4 l* _; @( I
/* OPT Field specific defines */
! Q8 v, L/ @- K' x% y2 ?
#define OPT_SYNCDIM_SHIFT (0x00000002u)
7 c8 M' R; k) N( _0 B+ W, ~! u+ ^
#define OPT_TCC_MASK (0x0003F000u)
6 }3 z |, m8 @9 Y. q2 n3 e& X
#define OPT_TCC_SHIFT (0x0000000Cu)
# G( P- }3 |4 |! T
#define OPT_ITCINTEN_SHIFT (0x00000015u)
9 Z% d) |& i- e/ r1 K- P5 {0 |
#define OPT_TCINTEN_SHIFT (0x00000014u)
5 S$ P8 ~' `7 t2 ~4 f
' ]6 x# L1 I' ?3 j' T$ h
char ping_buffer[PING_PONG_BCNT];
( c( M9 U$ p( K6 S! `5 h) E
char pong_buffer[PING_PONG_BCNT];
7 k6 D- L/ u6 u( z1 v1 G7 o8 o
) i4 V9 Z* X: @7 s2 m3 K; n
. t( m* D; u6 l4 l0 A
) T. V' {7 I' ^0 n
& N( V o. L+ r8 z
static void ys_edma3_init()
& B% n3 z/ q" g
{
& I% p$ i9 c' Y- V3 k8 M
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
m, {7 [, o0 ?% X3 X6 p
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
! |6 V+ b8 C& G' D; B0 Z( c$ E4 e
EDMA3_DRV_Handle hEdma;
. x; G b& Q5 V6 |% j0 h- ~; V
uint32_t chId = 0;
% f+ m7 ]. _6 g* f: [) _
uint32_t tcc = 0;
0 o" Q7 Q& C/ M7 H) z9 Y! U
$ t1 a' U8 {! W+ s% S: |
print2arm("edma3 driver init...",0);
$ r2 M# I2 E: `5 j" s% Q" Q$ w
4 j! h. w ^( @: c
hEdma = edma3init(0,&result);
4 F$ r7 j4 o* t8 K |4 v! B& e
if(hEdma)
/ X- F, H9 Q6 F [; r' ] @
{
- m% ]/ i, ~2 e5 ~6 Q1 u" D
print2arm("edma3init() Passed.",0);
' ?* r! e2 A/ s
}
- T: P b4 T4 f
else
( W8 Q) i( ^0 M7 B
{
4 f+ b2 y& Z/ l6 P( ?* ]
print2arm("edma3init() Failed.",0);
5 l( Y9 n7 q2 Y0 V' @5 k
}
( X+ n- O0 l- V- a& a5 o
. C% @5 P. C$ }1 e5 Y
if (result == EDMA3_DRV_SOK)
0 }6 D. r: p' U. A& l% X4 s% H; r. C9 }& M
{
; |& a' m. |3 N, j ?
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
( l8 o0 X+ ]+ [( n
(EDMA3_RM_EventQueue)0,
8 ?4 J* p+ K/ W" y& P. q3 G
&edma3_isr, NULL);
! D3 F7 d" a* O4 ]5 X
}
' c' Z; Z7 T/ C: y8 x# ^
9 X) w4 f/ n$ C- q$ |& k7 v
if(result == EDMA3_DRV_SOK)
" z" j! F) n4 a: f' x w
{
4 h/ G# M6 ~0 C' J
paramSet.srcBIdx = 0;
9 y6 p) i% {; T$ L
paramSet.destBIdx = 1;
& G r- `# l( z& `/ b7 M
paramSet.srcCIdx = 0;
0 u1 C6 j, q T0 w: j$ g
paramSet.destCIdx = 0;
/ w$ F) w" K. i8 e
paramSet.aCnt = PING_PONG_ACNT;
% a; S5 p/ X- f- ] ~, P; j
paramSet.bCnt = PING_PONG_BCNT;
( @# ]2 I* r" q0 b% [
paramSet.cCnt = PING_PONG_CCNT;
0 Y2 O, z) @0 z0 K s- C8 l' z
# l8 q9 x( L. |4 a6 }9 A8 U4 e" t. ]
/* For AB-synchronized transfers, BCNTRLD is not used. */
. Y9 B% I; V4 Z8 S1 y
paramSet.bCntReload = PING_PONG_BCNT;
, z& W8 Z$ \0 l! L0 P W8 T
9 s `2 x6 l* ^2 B; W+ Q& T" c7 P
/* Src in constant mode Dest in INCR modes */
* r) N" e+ ]. }& ^# i
paramSet.opt &= 0xFFFFFFFDu;
r# P; }: x9 [
//paramSet.opt &= 0xFFFFFFFCu;
5 B+ b0 G: Q3 K. c
' \9 ~0 }. u4 r4 f
/* Program the TCC */
) @! M0 R; V* _
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
4 N/ {* }) W3 }7 P
$ ]& c4 [8 d9 Y. ~" O
/* Enable Intermediate & Final transfer completion interrupt */
: X! m1 m* a% d: D) s$ `+ Q
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
$ H: _( F' ]; q' t' d7 i6 S# P: R
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
# {7 |* I' C: ^
! o+ z# f: r8 d, y+ a9 I1 m
/* AB Sync Transfer Mode */
6 Q. m/ T0 E1 k' J* i
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
) A- L- g* c- a
: E+ E5 T" H2 W1 R$ v
/* Program the source and dest addresses for master DMA channel */
# G6 o$ U9 O$ z& v$ K6 j
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
& n5 U8 G( R' k; v; E+ C
paramSet.destAddr = (uint32_t)(ping_buffer);
& v' }9 u" V! p) t
. m" Q) y! g- p/ Q
/* Write to the master DMA channel first. */
; g4 x" }8 n2 l9 E0 i
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
: c* A' R5 P7 |0 E6 r
}
0 z* U6 G( @6 b( F
8 X1 W( D# g: X) v1 r+ R
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
4 o2 O" Z- ]8 y% B4 ^+ n
! I$ J; `) O4 | O/ p& z( M8 t
if(result == EDMA3_DRV_SOK)
/ F2 m' x$ m+ o+ y" ]9 [, c
{
% O* ]5 R, B" N2 i( m+ y! m7 L7 V
print2arm("edma3 driver init success.",0);
* G4 G% C- F$ v! T3 s% A' ]
}
9 B0 N( b; S+ U0 r% R
}
- B/ g9 q% x8 K/ e8 S) A* A
" ?$ w& m a9 K# d. R
6 y$ i2 m/ e$ o& c; K8 F$ \6 I3 r* v
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
3 G% ~% Z/ K. R. D8 ^& E4 G1 b
/ M4 r/ _8 [4 d
# f+ R' }) d" z Q# ^ N6 s
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
2 q: x! x- y$ e2 [
每次DMA传输完成后都要再次使能传输
2 V4 R( h4 G7 M( D* d8 C
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4