嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
% }! a* d; r% S% ^% [( {" }0 X
#define PING_PONG_ACNT 1
" G) d- y$ Q% u0 n# Y
#define PING_PONG_BCNT 8*32*40
4 E! r9 t" b$ i; G/ l" g. z
//#define PING_PONG_BCNT 1
* z% ~' R! J& Z+ ^% R/ c7 j
#define PING_PONG_CCNT 1
( l- b, d: C$ i* S; W
#define MCASP_BASEADDR 0x01D00000
7 V, y$ o- G* y1 ~: ]9 i
#define Mcasp_RXEVENTQUE (0u)
3 ^' I1 w8 e- e+ G( P# l
" D- s5 h1 m e2 r+ l, g
/* OPT Field specific defines */
_) a+ \; I9 O6 L
#define OPT_SYNCDIM_SHIFT (0x00000002u)
: R! V" W) H- ~% K/ N
#define OPT_TCC_MASK (0x0003F000u)
" Y+ S/ o1 e" z- i8 ~+ i6 r1 P
#define OPT_TCC_SHIFT (0x0000000Cu)
n6 G9 q- e) k, P) Y" n/ [: q1 a4 I
#define OPT_ITCINTEN_SHIFT (0x00000015u)
' S! Z8 Z* Z \# w
#define OPT_TCINTEN_SHIFT (0x00000014u)
# H5 Z3 _( s2 g% @; A% t
. {( _( c) O: `1 Y
char ping_buffer[PING_PONG_BCNT];
8 j& x! T1 N- D8 H% L- h- H5 V3 I" K
char pong_buffer[PING_PONG_BCNT];
" I9 x! M9 j7 ?5 G+ m! i
- o" G# ^. H# u$ q- T
6 D3 ^, b: w$ I- I
) n4 [% Z5 O/ @5 B
0 W( R" E" m- u% Z* s
static void ys_edma3_init()
& l* L. d4 `, D0 G2 u
{
( [) b5 N0 [0 t" @# Y4 r% S
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
8 W; Y3 a9 v, d/ T) n) m
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
7 v# W1 O) Y, O b
EDMA3_DRV_Handle hEdma;
6 {7 ]' a. n, u# H; Y5 m
uint32_t chId = 0;
: k: i% i/ |/ h% t
uint32_t tcc = 0;
) e' [ A2 K: b7 g+ ]9 E8 n2 g
+ D9 M) p( b% N" P) }- P: H! {
print2arm("edma3 driver init...",0);
1 x0 O1 o2 W4 ]. o. N' Y' L% c I# J
" D4 D9 e K1 q ]
hEdma = edma3init(0,&result);
, m) I. H, n; c0 w- J# w
if(hEdma)
& t8 H( m- q7 z$ T* L% o
{
" b j+ V0 F, C) ]2 Z. l
print2arm("edma3init() Passed.",0);
, ~$ ?/ ?+ N, w+ h
}
) z3 D, w7 W/ P3 U7 ^1 O; f
else
. l7 t, ?; Z2 c' j& a5 ?( S
{
# O2 J* w3 b3 x7 `1 V0 R
print2arm("edma3init() Failed.",0);
6 F, u( h' P/ h+ E: n$ c4 E
}
# _$ [0 S) Q# d) H* ?
+ ~$ L1 ^6 O* }" a
if (result == EDMA3_DRV_SOK)
1 u, V% O/ l; j3 A! k: ^
{
1 A d3 F1 @# g8 @
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
! c7 M( R: W( l" ~. r! W9 H
(EDMA3_RM_EventQueue)0,
. `5 U8 j: Z1 m* p2 _ {, Y
&edma3_isr, NULL);
0 Q( h; g1 |0 \! T- k
}
2 p3 T. L1 _6 ~- J
) X% j M. g( P2 n" _5 `
if(result == EDMA3_DRV_SOK)
7 G( }; a( a1 B) R
{
8 ^( K' N* V/ j" {- y# J
paramSet.srcBIdx = 0;
/ i6 O- A+ `. K( H5 H
paramSet.destBIdx = 1;
# l7 M4 }' n# o- \: q) B
paramSet.srcCIdx = 0;
( i G9 A' j+ G$ H2 w' |( _
paramSet.destCIdx = 0;
" o5 M* B6 c! p
paramSet.aCnt = PING_PONG_ACNT;
9 \9 @6 G) O" B; A4 _
paramSet.bCnt = PING_PONG_BCNT;
0 ?# Q4 _6 K$ N/ M2 g' m! l
paramSet.cCnt = PING_PONG_CCNT;
3 |5 G$ y/ q: z# _
, u* M6 B8 d- {% z$ ~2 U
/* For AB-synchronized transfers, BCNTRLD is not used. */
I0 R% R Q4 ^% |' Z8 `7 u- w
paramSet.bCntReload = PING_PONG_BCNT;
( s1 p3 z: t! W- G! X" j
/ g! @( i9 ? g9 F& A8 w: R" o, w
/* Src in constant mode Dest in INCR modes */
$ l; v. Z1 N: U1 w! W8 f# p+ A
paramSet.opt &= 0xFFFFFFFDu;
8 f/ r( |! o; j+ O
//paramSet.opt &= 0xFFFFFFFCu;
$ L" L. w. n* n7 j$ f$ p
' H* B) [) q! V: o' Z
/* Program the TCC */
% l" I# M0 y" C2 N _
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
3 j1 [; j {7 [; Z- N
2 X: A+ Q( F8 |4 o2 Q
/* Enable Intermediate & Final transfer completion interrupt */
- A3 `/ J9 e; P" w9 |- O: T
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
% k$ r0 s' G" Z2 O# c* x
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
7 O6 r6 `3 x1 B. p+ }9 c1 B8 O: O
- T! J1 h+ E: n6 g* F4 \6 T" h
/* AB Sync Transfer Mode */
: ~) }, x: O9 c$ C: F
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
7 i2 Y, o# O" R- Z- R5 {- l3 j
( S) M% m: w1 G% U/ }
/* Program the source and dest addresses for master DMA channel */
/ z6 Z( _3 T, Y9 X
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
6 H! N% W% ~( Y- S0 E' r
paramSet.destAddr = (uint32_t)(ping_buffer);
( M# S; y0 i0 |$ |% d/ T
. z6 l- d% j/ f7 D: `
/* Write to the master DMA channel first. */
$ J# j8 q7 m; ?% N5 d5 ]
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
4 o' q) O! x0 p/ J
}
: j' P& a$ k1 q% {" z- z3 S# B
; W: l: p. r( ]: k1 `
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
4 a7 x( V) g9 K1 a9 m
; U* Q8 ^, T) o' I1 x% b: J% s
if(result == EDMA3_DRV_SOK)
( ]) f) P% ~5 T
{
: j. E) w0 Z" l. { S
print2arm("edma3 driver init success.",0);
4 A7 j8 r* \! H O$ u+ c
}
( R3 Z9 Z8 a) Q
}
. }+ n! V: }+ D z3 }1 c
& N" s5 B7 O; Q" s. X$ }! K
( v/ M' y: f1 [9 j
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
7 J5 ~8 r5 @- q* x& k) Y+ I% j4 A
8 u" ~4 r( f3 O5 j: O, o, r) X
, q, X! i. `7 P# \- E+ \+ ~& ?
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
$ M0 Z# }; E* f3 q% M, ^( z
每次DMA传输完成后都要再次使能传输
$ L; M$ i5 Y# Z* }
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4