嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
( E' J1 O% E n8 t' u6 {
#define PING_PONG_ACNT 1
( t f+ ~5 Q7 B/ P7 L& k! O
#define PING_PONG_BCNT 8*32*40
( L- ?. D% k* k \) ^0 Z
//#define PING_PONG_BCNT 1
: S- a p) F! h0 w4 }
#define PING_PONG_CCNT 1
: { y; r! e) l, J( v
#define MCASP_BASEADDR 0x01D00000
n+ A, y% k$ X4 j+ r# x: w
#define Mcasp_RXEVENTQUE (0u)
+ d- ]3 y1 h( C N1 K
1 k+ E( j7 r8 A8 ?
/* OPT Field specific defines */
- R4 T" j8 z7 M' p( O! n- }
#define OPT_SYNCDIM_SHIFT (0x00000002u)
1 k" S; n: m2 Z# r+ X
#define OPT_TCC_MASK (0x0003F000u)
* G R. i J5 Q
#define OPT_TCC_SHIFT (0x0000000Cu)
9 y2 S& N" p1 @0 u! p( F
#define OPT_ITCINTEN_SHIFT (0x00000015u)
% \+ ]) I0 {+ J a8 P ]/ `
#define OPT_TCINTEN_SHIFT (0x00000014u)
; ?+ d: F# D5 L" b0 x, i0 g
- [8 B8 n8 a& F9 T p
char ping_buffer[PING_PONG_BCNT];
4 |8 e* Y$ F0 I. c
char pong_buffer[PING_PONG_BCNT];
% ?$ D4 ? V0 i3 V6 w8 ]7 e
- u Z5 o# M5 D; {
8 P( d" z6 ]5 u5 ~
7 W }; M1 \9 l
( k% \: G) D% ]2 C, V2 r% `
static void ys_edma3_init()
( f- M& W0 w( \) x# {
{
+ F4 h9 y% e' A9 f& k
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
; T4 q v" O; {) O2 {8 |4 M
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
8 k. s' H6 ]7 B9 \
EDMA3_DRV_Handle hEdma;
2 K8 T$ D, d5 d% ~4 q
uint32_t chId = 0;
# G2 J0 `4 {- n
uint32_t tcc = 0;
0 k# f7 h) x4 G: F' A- T$ D
$ F7 `+ U+ u' ~
print2arm("edma3 driver init...",0);
8 H) e2 x( S% e' F
6 R1 ]& i" X8 C1 v# V& @7 E
hEdma = edma3init(0,&result);
. G# S+ K" ^4 N% o
if(hEdma)
) X, r1 S$ U4 p, Z ]
{
$ a7 w0 g7 _( ?* c: @
print2arm("edma3init() Passed.",0);
2 m b+ T4 H' k8 }8 {- C
}
: _# m% O0 S3 }# k$ ^2 C
else
4 t/ @9 T+ g* N4 `+ D' I Z
{
/ ~0 h" z/ U& I5 w0 p- I
print2arm("edma3init() Failed.",0);
& R7 ]2 Z- w' m/ U- Y. l$ X+ b
}
M4 x% M9 A( d' ~9 D, _3 l7 Y
$ h5 [: d8 \; F) I( _9 Q
if (result == EDMA3_DRV_SOK)
% I5 l4 p4 l5 T( A
{
% [; b" m5 q+ |) q
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
; K0 U/ `6 j. v5 s' u
(EDMA3_RM_EventQueue)0,
, h) h+ X2 J. h; S7 \' y
&edma3_isr, NULL);
8 A9 K# O5 n) q* ^: x* i# i
}
" P7 P7 I( \$ y2 e6 N. c
) a+ h. t7 f) [" [* t* o* k
if(result == EDMA3_DRV_SOK)
( M' o0 @1 |9 \* ]$ T
{
. J+ y; h! p3 |9 g* h
paramSet.srcBIdx = 0;
2 Z4 }" K6 f+ f3 M, p7 F6 i) X
paramSet.destBIdx = 1;
; \. h5 p5 h( j3 X2 i6 l
paramSet.srcCIdx = 0;
* v* M7 Z* D3 u' C# _
paramSet.destCIdx = 0;
6 q7 N2 N! y% H' \2 Y( T& X: S
paramSet.aCnt = PING_PONG_ACNT;
0 n4 K) J# \- H$ I1 m; H" A
paramSet.bCnt = PING_PONG_BCNT;
, A" q9 g4 ^3 k6 R& m" K: x
paramSet.cCnt = PING_PONG_CCNT;
5 j ]; E, O/ d& H
4 A: E6 i6 h: P9 e' i$ K" X% t
/* For AB-synchronized transfers, BCNTRLD is not used. */
) A: P7 A$ g6 B# c& O
paramSet.bCntReload = PING_PONG_BCNT;
$ O6 w5 H7 A2 U$ l
5 _9 l6 U3 [, E5 \8 H
/* Src in constant mode Dest in INCR modes */
) X) I. ], \6 `( e) }! V- l3 g
paramSet.opt &= 0xFFFFFFFDu;
) }9 ~/ R! X) \. {6 S) [
//paramSet.opt &= 0xFFFFFFFCu;
4 y2 E6 f7 a9 f% |2 t
0 @+ i# b+ m& k
/* Program the TCC */
& C. @. J+ s! {; n$ p! M+ E7 [
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
_9 m. r% l. a" Z
! y2 j4 @. z" g3 Y1 u7 B0 S
/* Enable Intermediate & Final transfer completion interrupt */
" Q3 Y( h& |, O0 ^
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
- a/ W! k' c" w$ m' b: Z1 t% a
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
& e0 j' l _- C4 x- F* r$ _
4 h+ D0 Z7 c/ K) F$ U
/* AB Sync Transfer Mode */
2 f6 [2 n' v, |) r8 m
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
$ `& v# w- t% K0 P% ^* b
+ `1 X* ?" W, k
/* Program the source and dest addresses for master DMA channel */
3 g6 I4 d' e0 G$ N- Y
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
) @+ o& l! i& b! k* s$ Q
paramSet.destAddr = (uint32_t)(ping_buffer);
6 V( Y+ Q6 Q) s" ]1 w3 f" S. s# k& S
& i( k# g) j: |. t* k
/* Write to the master DMA channel first. */
/ u6 M {1 X3 @# \! b7 \; J: }' B* ~* R
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
( c( j6 s( O h
}
8 m# J3 D; o: c$ n ]- N
0 a4 d; V/ N: p# S+ H4 x
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
7 ~$ w5 E# Z; t: C0 _+ V
3 W8 d# Q6 w2 w; R* r) @8 J
if(result == EDMA3_DRV_SOK)
- q5 E2 M* T* } M+ m$ v8 H z
{
# r4 k4 S/ l0 q# a: z
print2arm("edma3 driver init success.",0);
3 w! O! k. ^) k. a* J, ]
}
( U' q* C" g* ?* h5 A
}
& t' b' R3 {9 e5 Q
9 L# y. P9 |4 V+ [8 v* e B
* E9 f* q% D! }4 C/ k
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
2 w" U3 w4 Q$ c3 D% b# y
5 V A" r1 j# T! x, {
1 h) S5 L3 v( x% [7 x4 J# h
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
9 b3 o# J- e/ h' e m8 v
每次DMA传输完成后都要再次使能传输
8 x7 ]: B8 e/ |. I+ t
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4