嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
1 ]2 g' }$ z) [0 P
#define PING_PONG_ACNT 1
- Y0 X% @0 f, E. F
#define PING_PONG_BCNT 8*32*40
1 @" W; ]% ~ ^) u9 _, X% b9 f6 \
//#define PING_PONG_BCNT 1
! _$ |) `: N/ S/ f x1 t
#define PING_PONG_CCNT 1
1 p u; I* G! p8 O
#define MCASP_BASEADDR 0x01D00000
3 L$ c2 l R/ j$ _! j7 N; G
#define Mcasp_RXEVENTQUE (0u)
" r i! H5 q- q7 B
1 l6 Q I2 B3 n4 N0 Q: o: f1 z
/* OPT Field specific defines */
+ h& A% [5 s5 {
#define OPT_SYNCDIM_SHIFT (0x00000002u)
& d6 b2 }) w$ D8 f2 r+ ~
#define OPT_TCC_MASK (0x0003F000u)
$ C; m* Y9 `/ i7 {' E4 ?
#define OPT_TCC_SHIFT (0x0000000Cu)
( m# b# K( Z! L% P8 C
#define OPT_ITCINTEN_SHIFT (0x00000015u)
% Q0 m$ u h/ u3 h5 m# W/ }8 f. ]
#define OPT_TCINTEN_SHIFT (0x00000014u)
: T) G' n7 `, j S: \
9 O0 c: F8 z, h
char ping_buffer[PING_PONG_BCNT];
* k! _" H6 K( D
char pong_buffer[PING_PONG_BCNT];
4 Z4 R" R, q; z# A5 W! P
, p$ j6 w, T: I% u
* W8 N5 C) ?! V$ @' u
6 {; {9 h5 } G$ P. a4 l* G2 ^
0 N- ?! y: n6 D
static void ys_edma3_init()
|6 g0 c" G/ d
{
8 g! j+ B+ Y k o
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
3 ?( b8 R' z9 w6 {; s( c4 ~
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
' `. q: q# j$ D2 ?& ]( w
EDMA3_DRV_Handle hEdma;
9 d+ u0 X- R7 F
uint32_t chId = 0;
! @; V) U- I6 T- K7 S2 M% E+ p+ J
uint32_t tcc = 0;
6 Y& V/ c% Q9 ^% H" h
) Q% x9 L8 @. ]' ^
print2arm("edma3 driver init...",0);
3 }8 [; B! a$ E$ Q. _
1 s" P8 ~, r* H! e6 k( _0 n# b2 o3 S
hEdma = edma3init(0,&result);
7 [! i/ o3 Z5 t" }9 s- F
if(hEdma)
: k" {: T2 P; N
{
, ^% s7 j" b. V& J3 c
print2arm("edma3init() Passed.",0);
- C3 S7 K. j2 } g4 @, i
}
W F2 O* H( ]8 V
else
& o5 \# h2 R m7 }# \% c
{
h5 x% E+ I( }+ ^4 d5 E
print2arm("edma3init() Failed.",0);
5 E* y2 C, }' y
}
/ w; j1 V" e* `7 o" V
/ M2 U, E; ?) i5 U2 N
if (result == EDMA3_DRV_SOK)
; i5 U; w: J5 |. v$ k0 [
{
0 j+ P! m# r1 J) Y' N
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
/ F7 [8 @4 U0 J6 @6 N; B
(EDMA3_RM_EventQueue)0,
& k- ?- c% b) M1 A
&edma3_isr, NULL);
" `- [. z+ F2 x4 `* B; x3 {
}
. `6 p2 G# [. ^% M) y. R% f
3 d8 p6 ^" V, n' C
if(result == EDMA3_DRV_SOK)
. A8 K/ o8 r, ` V- ~
{
6 J' w1 p U* @7 w4 k
paramSet.srcBIdx = 0;
& R9 v8 o$ D; o/ Y4 }. a6 ]
paramSet.destBIdx = 1;
4 s8 i( e$ L" Y" u1 S% P
paramSet.srcCIdx = 0;
) V) d3 Y0 x, d
paramSet.destCIdx = 0;
+ C3 \4 S. k2 m* P* {
paramSet.aCnt = PING_PONG_ACNT;
( h/ j Z+ ~7 y7 j; Z2 @
paramSet.bCnt = PING_PONG_BCNT;
7 b; v" }2 l( w# J7 L- G& d+ W" V
paramSet.cCnt = PING_PONG_CCNT;
, p' i) ~% E* z% N
# Z# G0 H" O4 F8 `
/* For AB-synchronized transfers, BCNTRLD is not used. */
9 P2 `2 D9 }% V i" w, f0 ^
paramSet.bCntReload = PING_PONG_BCNT;
) g+ x$ O2 S; V/ A
- ?5 u' ~( D/ `6 l& `, z7 [7 _
/* Src in constant mode Dest in INCR modes */
; K! w" A% S M* J5 d0 @
paramSet.opt &= 0xFFFFFFFDu;
+ B9 [1 l; H! {& h: T8 {/ G1 g, o( G
//paramSet.opt &= 0xFFFFFFFCu;
% r& q( n" }9 {- Q0 {
4 p0 T5 ^& `* w) O9 L
/* Program the TCC */
& M' Q; _+ ~. p
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
/ y1 o" a6 D; V; h
) w* N7 s" _) \; s2 G* c1 E
/* Enable Intermediate & Final transfer completion interrupt */
% j- i/ N, n- B0 x) V! {& m
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
( D! t0 a7 K- I2 Y' f
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
! ~/ z! T& b- G. q) d
4 l$ i. x! @ V0 q, D
/* AB Sync Transfer Mode */
( _0 g# e8 ~) T& D
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
K* V$ Z! W0 F, U' I- g! I
! i9 `2 R* _ I0 y* h, |. s
/* Program the source and dest addresses for master DMA channel */
5 Z0 R$ k" Q2 ]4 I: L. `1 W
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
: ^8 f9 \! ~+ ]2 ], d/ Y; g* O5 B6 c
paramSet.destAddr = (uint32_t)(ping_buffer);
; E$ r9 _9 z; l2 m6 m* Z+ E
/ }, k ?. p- K, R( M2 x
/* Write to the master DMA channel first. */
& K1 w! L- q3 ?$ c, C' o$ z" @
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
5 l G' H% O/ j
}
; u0 d/ x; h! N" d/ {" v
- | o- S, Y/ [4 n
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
8 c; C. g q& u6 m L! P
) M" c# `5 ~; l* h2 v
if(result == EDMA3_DRV_SOK)
4 j* X& H' W' J* _
{
! Y! ]6 _5 n" Q7 F+ u; |" |
print2arm("edma3 driver init success.",0);
1 o% F6 M+ P% Q, o" k% F0 w
}
3 G+ F* R$ O1 u# B2 G" K
}
% g5 \0 c8 K1 n* l# t
# e2 W* X& z( w5 C. L3 @
( o3 F( n5 \0 F2 R6 ^
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
% P+ n( l5 e, @
, K. l- G/ u; }
! l6 i: f* G! Z; n. h8 I
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
2 c" O) ~) K. B! L
每次DMA传输完成后都要再次使能传输
6 g+ k/ ^; I1 b; @3 V7 f N
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4