嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
' Y; q# a& P x& Y& G6 E
#define PING_PONG_ACNT 1
. _$ @* a0 ^) S; u# G. @, l
#define PING_PONG_BCNT 8*32*40
' d+ Z# \* t6 k
//#define PING_PONG_BCNT 1
% S# |" m2 p5 j
#define PING_PONG_CCNT 1
/ B9 H( P3 E, m6 E9 m0 X) u7 C
#define MCASP_BASEADDR 0x01D00000
$ G" e9 u, p* \% N3 J% M) M! j
#define Mcasp_RXEVENTQUE (0u)
! @' B! O1 p Z' [+ Q6 r% |
5 [8 v6 Y& H3 i/ x( k. M
/* OPT Field specific defines */
9 o" U; H' ]+ J9 H: t" O
#define OPT_SYNCDIM_SHIFT (0x00000002u)
; H4 B/ p2 k1 H; H3 m, |0 ^, l
#define OPT_TCC_MASK (0x0003F000u)
5 \8 S) k- Z7 e4 d
#define OPT_TCC_SHIFT (0x0000000Cu)
7 }8 P) M. P* r/ _
#define OPT_ITCINTEN_SHIFT (0x00000015u)
% ?$ E) ]( [- C
#define OPT_TCINTEN_SHIFT (0x00000014u)
6 c5 n9 ~8 s. d. d* z0 r
% C7 {0 p8 [. `) c/ a# z/ A
char ping_buffer[PING_PONG_BCNT];
9 t; d* H* h8 R$ P+ {* ^' q+ }# C
char pong_buffer[PING_PONG_BCNT];
& C& i0 v$ C7 K* M1 U8 k; Q2 e2 ]6 L
! J: O) x* i6 f2 P/ q7 s8 t3 Z, W o
- d. N. t1 T& t; _
7 J3 Q P a/ b' a) f2 h
8 ]; A- J) d! D8 _; g$ J( T' |0 g
static void ys_edma3_init()
" `1 @- _( Z- v& n! g: ~
{
+ V- [7 g- C+ r- I( Z- n
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
* i7 K* Q8 ?- {) K7 K
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
) i3 q+ u1 {- h7 x" A
EDMA3_DRV_Handle hEdma;
7 R. v( f- h4 f/ |7 M# G. B d$ t% p" Y
uint32_t chId = 0;
# {" [! C- P/ G. w/ A
uint32_t tcc = 0;
9 z2 G$ p% g1 Y q
6 ]+ t- K% W9 O7 q
print2arm("edma3 driver init...",0);
6 j( N" t7 l6 h! l
, s; c( m" Q: O
hEdma = edma3init(0,&result);
* J/ i/ y3 P2 K8 B6 w& J
if(hEdma)
/ E3 V0 h) D) _& n; F% h, j9 Q% m5 K
{
2 U4 x+ l% E: C4 U. ~# u
print2arm("edma3init() Passed.",0);
: X; T. I* \( G1 v6 E# k
}
1 {' R1 S9 a0 ] Z7 ]) l) ^
else
6 r8 A b; X0 h% q+ q7 A% C+ O8 N
{
+ ?1 I! ?2 C/ W
print2arm("edma3init() Failed.",0);
& p6 i+ }. v/ S) }2 O) [8 J8 t
}
6 r* l7 c9 C* ]6 @
0 A x- Y2 t, ]$ l1 s3 Z6 S/ A
if (result == EDMA3_DRV_SOK)
" `4 c1 t! a7 Z* u+ j
{
1 `2 F1 z/ r5 [ o
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
) ]8 f' V! I9 s% v3 [
(EDMA3_RM_EventQueue)0,
4 H9 ], L3 K5 v
&edma3_isr, NULL);
* n% D* l& e# c+ A: h$ r
}
4 B9 C: s/ k' |9 }
$ _) v: {7 }8 b5 p. A$ J: m- W* g- o
if(result == EDMA3_DRV_SOK)
$ o: `, W, K$ `5 n: _. h/ H
{
" P* m& m, i! e5 h2 n3 w# q" X
paramSet.srcBIdx = 0;
9 ]3 j& w+ ? i; R* X5 l: g3 c; p
paramSet.destBIdx = 1;
: s W+ C- Y1 f7 X
paramSet.srcCIdx = 0;
& a2 N6 @+ m) d
paramSet.destCIdx = 0;
v4 z6 M$ c% n# K% o1 g5 Y) E
paramSet.aCnt = PING_PONG_ACNT;
1 V$ u( V( B7 ~1 Y/ v
paramSet.bCnt = PING_PONG_BCNT;
: f& k5 z3 _/ o: A
paramSet.cCnt = PING_PONG_CCNT;
9 P8 B# @- {2 f/ M1 k% @
/ T9 F9 Y" ^0 Q! u8 c. B' r
/* For AB-synchronized transfers, BCNTRLD is not used. */
& F* m2 S( T3 c% @/ a5 {, J* k4 `! Y
paramSet.bCntReload = PING_PONG_BCNT;
@ R5 G' c/ `; Q4 v+ \
$ W' g# f) u8 K) l
/* Src in constant mode Dest in INCR modes */
! _/ f. T+ Z& v9 }% |$ v0 `& [) |
paramSet.opt &= 0xFFFFFFFDu;
5 @' a- `8 F+ ]7 r
//paramSet.opt &= 0xFFFFFFFCu;
3 k; D7 q* Y% I# X( q5 n
+ B. F7 |$ `1 [; d0 h9 w" I8 }
/* Program the TCC */
7 m4 @. p3 [- E: Z* _
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
2 K' F7 i! v. M; K
9 {8 ~! L- [: E$ s% i$ d g0 ~
/* Enable Intermediate & Final transfer completion interrupt */
1 c: Z( f% z" N/ V
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
/ P) k/ q. d- y) i
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
% c/ [4 u0 p+ D0 Z9 N( u
& G, ]! i* b' _2 o& U; k6 |
/* AB Sync Transfer Mode */
% Q+ d9 F% I; n' ~
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
% J5 F! ~4 T- Y
; l% \, D5 W; r- l2 k' e( L
/* Program the source and dest addresses for master DMA channel */
3 s* u( Q! |- A! d, }/ B% j
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
' d! B" F4 r3 U% `
paramSet.destAddr = (uint32_t)(ping_buffer);
& N- c$ G' G. j6 O9 H9 o
) W& p4 H3 T! f0 Y! D. K( g
/* Write to the master DMA channel first. */
. q( c' ~8 K) ]/ l2 r: d
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
& h S3 l" j7 [$ r" a
}
" m* z. [/ K2 X" [: r
+ k7 l, N) W% h& u/ Z& H5 t- H8 C6 L
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
9 w0 D& n7 y: M3 k" `
! R5 W) R; s$ E9 G. g' K0 i
if(result == EDMA3_DRV_SOK)
4 h& c5 D/ y- H o$ w( \
{
! B7 T, V* j( Z8 n# X' h
print2arm("edma3 driver init success.",0);
! R; `% H7 u$ `3 P
}
% a; D8 c9 Z+ O1 I% s
}
$ |7 M; g+ t1 G/ N) p8 x p
K$ U" H* I- v Z: o3 f5 D9 o/ B
. S- Y: a' _3 A+ O6 e' ?8 x+ l
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
- f% m4 M2 T, l6 v7 Y# g2 _
# B9 b+ f3 W' k3 d% T
" K- s `; Q- y. r- J- `
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
3 j5 o; Y& J0 \9 _
每次DMA传输完成后都要再次使能传输
3 g) U7 r A& W, }/ Z- o
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4