嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
5 C5 Z; `" F0 E5 h, a' Z" [/ |" R
#define PING_PONG_ACNT 1
5 p! g- ?. g/ ~$ F9 I
#define PING_PONG_BCNT 8*32*40
3 c7 u. v0 ~' V0 t |4 Y+ t z8 x& @
//#define PING_PONG_BCNT 1
: `+ g1 d/ Z$ n0 [+ @5 I
#define PING_PONG_CCNT 1
* i* p1 A1 d8 }& O9 l6 Y
#define MCASP_BASEADDR 0x01D00000
8 V1 q" B _4 n7 ^. Z! ?/ Z
#define Mcasp_RXEVENTQUE (0u)
; l; w5 j# Y* z8 d
?6 ^6 M( I% Z0 O* c
/* OPT Field specific defines */
1 }( W" R" @ x1 I" D
#define OPT_SYNCDIM_SHIFT (0x00000002u)
5 n2 d% }! W f5 ?4 B! ~$ c, w
#define OPT_TCC_MASK (0x0003F000u)
0 x7 t9 n+ w" b! V
#define OPT_TCC_SHIFT (0x0000000Cu)
, f3 Z7 Z: H) w- n
#define OPT_ITCINTEN_SHIFT (0x00000015u)
|1 h) M: d7 x. W
#define OPT_TCINTEN_SHIFT (0x00000014u)
, n! O! {4 T6 B8 K9 d" ^
2 \% F3 C2 `: l( o8 [# N9 f
char ping_buffer[PING_PONG_BCNT];
& @) a7 o% S6 M) v' o4 i! e
char pong_buffer[PING_PONG_BCNT];
' V$ |& {" s# M* X
. }. D/ `' D* g; i7 u! a( B* B
]2 ~- I& J# ] a2 w
* p* |9 Q& s% G
- T% r% V9 w& |* O- y! Q
static void ys_edma3_init()
7 a) D# L! w2 [
{
6 T' x# x$ @. s. f& v' ~7 m
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
$ F, s7 f+ t5 t4 ^
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
; S! G9 u9 r: Y& S. z
EDMA3_DRV_Handle hEdma;
q. F+ i9 l6 n! E+ m+ ~+ X
uint32_t chId = 0;
7 u9 ~( o, H9 g [. J
uint32_t tcc = 0;
5 y( R1 C# ^8 ?* D; c
- U7 S; }" Y. R" {4 |; L
print2arm("edma3 driver init...",0);
. f0 m* w* v* p( _5 ?$ i a$ a
9 X! A9 Z" f$ q
hEdma = edma3init(0,&result);
0 R3 c6 `6 {1 O) N4 \; ~0 `3 n# b
if(hEdma)
' B7 d5 C; Z; A( P- u' ?% s
{
0 y# i; k0 X+ M) A( ^9 |$ V; L
print2arm("edma3init() Passed.",0);
( s8 h, m) o9 b. d+ A( F% i
}
% R/ Y0 P6 J: a9 ^7 w9 A( j$ E: ~% A
else
: I) J' P4 A ]! ?! A+ m% f6 j4 c
{
) f, J, y2 C& S, d& _3 ]3 U
print2arm("edma3init() Failed.",0);
) _- o9 J% R, V( V: m& p
}
4 [/ Y L1 |6 L
; A; X) v. w8 Q: B
if (result == EDMA3_DRV_SOK)
. Y7 l8 Q. }8 v2 J, d
{
" w3 J7 j. j4 c
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
% r* V+ W2 i* u2 G7 P: i5 F8 O% K3 S; K
(EDMA3_RM_EventQueue)0,
: h1 E. }: S' d; l3 Q0 e& B; f( U
&edma3_isr, NULL);
& ?. Y" Y7 `5 F8 U- Z3 r$ r
}
( Q( S$ c6 u6 I" u, r- G7 s
" [: n" U9 {* d7 H% n
if(result == EDMA3_DRV_SOK)
- I! D6 u; A$ a5 k& i5 d/ o
{
4 Q6 p( A% [' W
paramSet.srcBIdx = 0;
& l! N" x+ }, f2 T. ~
paramSet.destBIdx = 1;
0 @( s* n% C+ u# k4 i
paramSet.srcCIdx = 0;
1 k( G: S( r( ?) P. N1 E
paramSet.destCIdx = 0;
) g" R1 t7 ?$ t! X' b3 }
paramSet.aCnt = PING_PONG_ACNT;
8 R" r! `$ c" n( _) I
paramSet.bCnt = PING_PONG_BCNT;
* a* Z6 N- ?( p- J7 S4 o B# z8 W9 g% ]0 L
paramSet.cCnt = PING_PONG_CCNT;
7 G" e9 G& i# E5 h% n, i# T: D
# q/ r8 @+ ~; A$ B/ }
/* For AB-synchronized transfers, BCNTRLD is not used. */
3 n* i' v) c5 a
paramSet.bCntReload = PING_PONG_BCNT;
: G4 B+ R8 y3 z( p- e
' k' U& e& n: y( q
/* Src in constant mode Dest in INCR modes */
( a4 v5 y* z. H
paramSet.opt &= 0xFFFFFFFDu;
' D s/ f8 f/ ?% ?
//paramSet.opt &= 0xFFFFFFFCu;
3 `: s0 V4 e; f; }. X8 ^2 Q
" ^; L! W- N; _# F
/* Program the TCC */
7 h0 F& X0 T, I' y
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
- ~/ L) H7 X- W' E: t) q& `
, ]' f- K/ f4 q. G/ W
/* Enable Intermediate & Final transfer completion interrupt */
9 V8 L( e8 A: X% r, M
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
: ^7 v! \0 X+ g
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
0 w" d! y/ h& R2 E, y
0 Y, t1 s( @" R* Q& s! k3 p
/* AB Sync Transfer Mode */
# y% r: j# b1 F) Y+ c6 t
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
( I! B, p# q' \3 u) m
) ?$ p8 `0 A$ l
/* Program the source and dest addresses for master DMA channel */
$ S, C; V2 x$ J; Y7 c F; p1 v
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
2 u) x6 y! H4 H7 A7 F+ W
paramSet.destAddr = (uint32_t)(ping_buffer);
4 \9 c1 m& u" n- H! f) ], C
: q$ F9 k) k1 H9 H+ S# g
/* Write to the master DMA channel first. */
6 J( L$ v# B: N' r% u/ s
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
* n" t8 R: c" Q5 z/ I
}
6 Y: v" O2 u, @- d
: E# e. q" ]% v- f7 o
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
# [1 B/ H- k1 e
/ _; k: b0 v* V. T+ }& w8 l& A6 n
if(result == EDMA3_DRV_SOK)
/ Q2 f/ W$ q7 n3 S* ~6 ~
{
3 C8 ]) E9 E! d2 V' e
print2arm("edma3 driver init success.",0);
7 O/ }5 ^8 X- S! D+ s
}
( m+ Q3 O3 }% w) `9 l
}
- f$ }! }4 S6 Y) ~! ]! y, X$ [" V
( s* j! n1 ~3 P9 O# D
, R( R N* r- x
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
3 L; \' W( `/ }5 }
+ I! o& u% \ e$ B* Q
! x+ \- }+ A5 S& B: ~( m3 O! i9 g
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
8 G# j! F- {& U& C9 W$ H' W q
每次DMA传输完成后都要再次使能传输
9 M; ~+ l$ B) _1 G6 x5 e
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4