嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
0 S! |9 {# n7 R# y) X
#define PING_PONG_ACNT 1
& c/ r+ d6 e* C8 T
#define PING_PONG_BCNT 8*32*40
" P7 C! y& m/ j3 ]7 o- [9 N2 G
//#define PING_PONG_BCNT 1
, b0 `$ T& G' j
#define PING_PONG_CCNT 1
! m& X# I! o, z0 v
#define MCASP_BASEADDR 0x01D00000
( K, i; C6 ^' [. c4 m! u; G% o# g; N+ b
#define Mcasp_RXEVENTQUE (0u)
0 @7 T4 Z" E. r8 J% k
# I5 U5 m1 T/ Z4 q) ?4 i
/* OPT Field specific defines */
# g( u8 c7 j5 }
#define OPT_SYNCDIM_SHIFT (0x00000002u)
$ f( j+ M3 h2 x' B% L) W+ T2 y
#define OPT_TCC_MASK (0x0003F000u)
1 I8 ]& e) ]" ^& c- R+ p
#define OPT_TCC_SHIFT (0x0000000Cu)
7 s% ~0 R. Y v+ E
#define OPT_ITCINTEN_SHIFT (0x00000015u)
& t5 i5 ?' }4 ?% b/ r4 C: c/ j
#define OPT_TCINTEN_SHIFT (0x00000014u)
M3 P. o" F; W: |
, F+ y8 X5 G( R9 b1 e
char ping_buffer[PING_PONG_BCNT];
* \! k7 T0 @" n( J! O
char pong_buffer[PING_PONG_BCNT];
% D# D j3 ?: |
& @2 G, }3 e) j
. l+ k" K. T/ V: v* k r+ h
' p5 Z# ]; ?- b) k7 b* M" l
d; i4 h# y) O) g% y2 v
static void ys_edma3_init()
% Y" b1 z- e' w8 E5 p
{
/ N& u! |; M9 v4 n( b$ T' U7 }
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
% |$ X# v% @( u1 E4 M/ y$ N
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
* ~# R* j" ?' L. Z G) Y" `
EDMA3_DRV_Handle hEdma;
( ~4 B; |& A' ?$ y- p
uint32_t chId = 0;
5 v: x. x. f+ I+ E! I7 I
uint32_t tcc = 0;
' E/ w' D" `4 D5 Q) [
3 A }. G0 B5 v+ O8 e7 ?
print2arm("edma3 driver init...",0);
, c C/ U% z) \, ]7 w9 ^
) } ~9 N- b$ W
hEdma = edma3init(0,&result);
@5 j% C8 a" ]
if(hEdma)
3 h, [/ j3 }1 @0 F. M& [$ o
{
! I$ T ~, L( x
print2arm("edma3init() Passed.",0);
+ x }) h3 c- L( Q
}
1 u( @8 v& k' j% I2 }6 p2 j
else
9 o% z4 k8 H3 q
{
; a" `' }( _' N3 U# Y+ K1 N
print2arm("edma3init() Failed.",0);
9 e7 H# K6 D! ?/ w
}
+ l, N5 ^ ?- s& o! V7 Y8 Q& j" N" b
, U- h' J1 C) \9 ^6 N
if (result == EDMA3_DRV_SOK)
+ o( @. w9 X8 D. P+ H3 Y
{
- ^+ T3 ^6 p5 e" L% H/ v" f0 h
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
( C8 A/ f4 Y T p5 m
(EDMA3_RM_EventQueue)0,
) |2 N$ [% j: ]& g6 {
&edma3_isr, NULL);
4 b |. h* x9 q2 b6 Y
}
6 Z+ p5 u9 i; D9 R
U D1 [9 x, |' I8 \/ n
if(result == EDMA3_DRV_SOK)
: H2 f+ a, ~: V1 {- o+ R! u
{
" w2 E0 g9 t) K2 S, l8 w5 X& V
paramSet.srcBIdx = 0;
' v- q; |0 j. j1 q+ X2 T
paramSet.destBIdx = 1;
/ x, C5 M* v8 a/ c4 {
paramSet.srcCIdx = 0;
8 C8 F4 N2 x* }* k
paramSet.destCIdx = 0;
& t5 N H" D' D @/ c1 i' Q
paramSet.aCnt = PING_PONG_ACNT;
$ w, I1 l6 |5 d% u0 ^# T
paramSet.bCnt = PING_PONG_BCNT;
0 _( D! V) _1 \4 {6 x% v5 |" _
paramSet.cCnt = PING_PONG_CCNT;
7 d: _9 ?2 m8 ], N8 ?* j: C
, Z$ j- x! w M9 u% I2 \7 ~& C
/* For AB-synchronized transfers, BCNTRLD is not used. */
% _. h6 G! m' H/ C: U4 t
paramSet.bCntReload = PING_PONG_BCNT;
/ W2 K; r! A: j2 E
3 m$ i( P5 o( N$ w! M3 U5 Q
/* Src in constant mode Dest in INCR modes */
7 U8 u+ C- q9 r1 b9 u' M
paramSet.opt &= 0xFFFFFFFDu;
- v4 ^ v7 [" d
//paramSet.opt &= 0xFFFFFFFCu;
) T: ^1 k) O" r3 N0 b1 _
: {6 h! y, z, Q" v
/* Program the TCC */
9 s" n7 f, q: J- _: d8 v" _
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
H& X$ J2 N/ H! E% K
* m- l- G' I% {; P: K$ s9 q
/* Enable Intermediate & Final transfer completion interrupt */
* b8 P* e O; i; f" o* H
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
; K ^ r+ ]) s; X, \
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
* k4 V; [$ h$ H' F6 h) e
! ~7 o! r5 Y! O0 T8 o, g/ Y
/* AB Sync Transfer Mode */
9 ]" [1 u; ~+ d7 p2 F
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
) ^! E; U" ?6 E; M* d" W
2 [' t% w/ S8 _/ i' n
/* Program the source and dest addresses for master DMA channel */
. K" B# H# R6 \" Z$ t1 Z
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
T9 K' b( Y) z* B& m: T
paramSet.destAddr = (uint32_t)(ping_buffer);
; k: v3 r5 |1 i! B( `5 V! e
; W1 a. D6 f; O
/* Write to the master DMA channel first. */
: K5 y. S- X# A0 s ?! z- Q
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
9 d2 v+ a0 S6 x/ ], z& ?
}
2 C1 |8 h) s: {; n9 f9 g
7 b: p( w E4 Q, F: U# B& g
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
( y( O0 f+ ]; Z. P% p* o& {* K
' I/ a/ d" d& c( v
if(result == EDMA3_DRV_SOK)
7 ~! @1 M; Q% q, f/ G) t1 b) S
{
, G5 m1 v) }. r3 \0 h4 t2 q8 J
print2arm("edma3 driver init success.",0);
) I8 }7 S8 f e3 I) p5 M
}
. [9 o% W% ] Q/ S" f( h; n: F2 ^# Q
}
f1 l6 J! ` y% G) r6 A' I; o0 D
# D& c7 y9 P" F2 h+ [* y
: _% K$ r- z5 {$ c1 e9 K; W, L' A
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
9 s- A0 b- C( Y6 y& b. {, m
% |4 ~5 Y& H: F& d* ^4 `; Z
$ e& u2 z8 w5 k$ p
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
! @' S9 H% V. R: t- y2 B
每次DMA传输完成后都要再次使能传输
: X/ ~) K- y# S G6 w. k2 W
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4