嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
: J. `! D0 I$ J6 r4 R
#define PING_PONG_ACNT 1
3 j( K! u* f9 C3 A6 y/ D2 S
#define PING_PONG_BCNT 8*32*40
# g# o% S. U) D5 i: M- Q
//#define PING_PONG_BCNT 1
% \. h* L$ X* \8 k, j, k
#define PING_PONG_CCNT 1
1 f y) o4 J- @' T5 _
#define MCASP_BASEADDR 0x01D00000
( ~2 Y, x& ?7 E" b' N6 Q- F
#define Mcasp_RXEVENTQUE (0u)
@" Q9 v" o6 Q* k6 I( Z
7 w, D* ], O2 n1 W
/* OPT Field specific defines */
% ?' [. ^" Z0 M: v; i# N t
#define OPT_SYNCDIM_SHIFT (0x00000002u)
- W; \8 ?* [) Z$ u
#define OPT_TCC_MASK (0x0003F000u)
' L5 x7 p' y& p" n8 U4 `$ S
#define OPT_TCC_SHIFT (0x0000000Cu)
2 V6 U3 a+ [- J$ `* r9 v% ~
#define OPT_ITCINTEN_SHIFT (0x00000015u)
; [; q8 f# z7 K7 \
#define OPT_TCINTEN_SHIFT (0x00000014u)
" z8 L! g2 u- ]1 D
7 J" ~" V+ A2 U
char ping_buffer[PING_PONG_BCNT];
; B; d+ ~. [* d/ ` i7 E$ }
char pong_buffer[PING_PONG_BCNT];
( m) @: T3 b1 V
& V2 B6 W( R$ s
; M+ a! k* q) u$ ~; C# M
! Q3 k) A/ X" `
& U9 r$ |3 _- Y3 N
static void ys_edma3_init()
( T& i/ f# u/ Q6 L7 \9 f
{
. l6 S, w/ i4 H; E& k9 P Y: l; n
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
C# S ~$ B9 ^7 W/ c9 d* C& Z
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
( R6 n4 B, j9 |9 {
EDMA3_DRV_Handle hEdma;
1 C, P$ G+ j) y' z% g& h, e+ t9 o1 B
uint32_t chId = 0;
" ~+ s. J7 i" u- b' J! e
uint32_t tcc = 0;
' Q: c1 H; l- S; \4 K. i+ g; g
) y. g: k' K B$ N, O& e# P
print2arm("edma3 driver init...",0);
9 c& {- ] e! b+ `
' k k+ ^1 ]7 K8 P4 W" L$ Z
hEdma = edma3init(0,&result);
0 X. B V4 K) y" g+ E0 U
if(hEdma)
8 i$ z# Y- _. v. V
{
! Q* E2 T: @9 {8 d+ _: O( z
print2arm("edma3init() Passed.",0);
6 z' s+ U: B1 T( g% i- l- {
}
) u# I7 D6 B0 S
else
' h! D- F% [1 q4 s8 D0 y# o- S
{
* M+ o3 c7 e& \
print2arm("edma3init() Failed.",0);
- @6 l4 I5 f& H7 I$ d# ?; G
}
1 R8 g0 C' o2 y3 p. L
' N9 n/ y2 R, y6 _; o8 j; B6 O
if (result == EDMA3_DRV_SOK)
& w6 o. v5 d2 z
{
& l6 b* C) I4 a2 f
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
& T. L+ A: y0 `2 f5 t
(EDMA3_RM_EventQueue)0,
4 O3 @7 F. J: x! ?8 G! F5 w
&edma3_isr, NULL);
1 q' K5 @0 I1 c1 G, q
}
/ @6 U" P+ a/ e: ^5 k
$ A& f0 m/ E7 \# L% Z+ v
if(result == EDMA3_DRV_SOK)
V+ @4 {9 w- e6 { [9 { G' d
{
7 q( V2 W' o: k/ S" S2 C
paramSet.srcBIdx = 0;
' f! G9 Y. h" h# T1 m
paramSet.destBIdx = 1;
' [+ ?" Y, M! Q
paramSet.srcCIdx = 0;
, X* o" o! [8 l C
paramSet.destCIdx = 0;
1 C7 i" u) r% c# i. \6 L( S
paramSet.aCnt = PING_PONG_ACNT;
# {3 h7 Z! I1 R/ ` L e5 K
paramSet.bCnt = PING_PONG_BCNT;
$ N2 c" K3 r" e! n* n% J
paramSet.cCnt = PING_PONG_CCNT;
8 J! Q" U9 n9 z: k5 H% {- }
1 C% U. `: E+ v; ?) J3 F7 W. S
/* For AB-synchronized transfers, BCNTRLD is not used. */
; m. {, `+ I: e+ L: S ~4 D
paramSet.bCntReload = PING_PONG_BCNT;
4 W" [" Y6 ? ~: A; }3 q
. b# p- j( z1 c$ u& Y$ M
/* Src in constant mode Dest in INCR modes */
3 B2 L7 d' I% n/ |3 ~
paramSet.opt &= 0xFFFFFFFDu;
5 D! e/ I: _2 R4 Q+ M O
//paramSet.opt &= 0xFFFFFFFCu;
- n6 O' p2 |- p
( y5 {9 H) I1 q# t6 h- j6 z
/* Program the TCC */
, V% T. n [+ A' \
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
& y1 [, T% t7 F6 ]1 ^' W
. `. Y4 A6 c9 j! S0 G% w% H" ~
/* Enable Intermediate & Final transfer completion interrupt */
) L2 }0 P8 a4 d& N. j
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
H7 O' V6 s; I' i O- b& U
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
8 m) Z \7 T' b, J4 i6 l9 Y0 d
7 l+ i8 z. t+ M4 b
/* AB Sync Transfer Mode */
, ~. L W5 ^$ e; f8 C
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
2 Z! \* ?$ f7 k( I1 `
0 ]' S4 `. N. j& \( V. R+ k
/* Program the source and dest addresses for master DMA channel */
2 n" c9 R! r* U+ u3 y& r2 n
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
8 W. q, x0 Y7 x5 b# f2 v& k
paramSet.destAddr = (uint32_t)(ping_buffer);
, E6 g8 v6 Y3 Q* k* u0 p
. w" O5 |) b+ ~: m: {& y3 F2 O
/* Write to the master DMA channel first. */
8 e L' s) l) Q+ V! ` k i
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
/ I- A4 L W$ L2 h) y8 a
}
9 e6 Y9 ?# `3 d7 N% Y# G* o' x
s Q! v" X& f, @& f8 f3 S
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
- g2 O7 K6 V( u% I' Z
6 K! T6 P t$ L/ N8 N* _$ f
if(result == EDMA3_DRV_SOK)
& n, J. M3 c& ~9 F2 F
{
; R1 s. ?; x* Z v2 e
print2arm("edma3 driver init success.",0);
4 k6 {8 n6 K" B
}
9 J+ P: P3 W& K, X. i
}
) ?: J! k' h5 ~: v0 J/ w7 c* R5 N
O- ~: g1 A0 i3 u6 S
' b% D5 S2 K4 N6 x& `# D8 R' |: C
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
: \, ?' r: F5 s
# S% }" K8 b. h5 O! Q( d
- b; ^' O- {7 G$ R" i1 a+ n' U2 E
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
: `+ N1 o# m) n7 H g
每次DMA传输完成后都要再次使能传输
9 r* c1 p% ^- C' ~. e* a" H. h
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4