嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
; J: \3 \/ f) @/ E1 w0 @5 [
#define PING_PONG_ACNT 1
4 v: G9 {; Z% k6 r5 [
#define PING_PONG_BCNT 8*32*40
$ p* _6 \! h I( u, R2 ]* o
//#define PING_PONG_BCNT 1
& n% I: e# J5 K/ T! ]9 f, ^* \
#define PING_PONG_CCNT 1
9 @8 e* ^% \! `+ Z' \
#define MCASP_BASEADDR 0x01D00000
0 }! D0 F9 r9 h1 I, g* I2 L
#define Mcasp_RXEVENTQUE (0u)
# J, @2 `" Y( r4 }! l* i6 b
2 `" E3 |6 {% {( R( X: \- x8 I) o
/* OPT Field specific defines */
! ]: K( M+ s8 y5 T' L$ v0 ?
#define OPT_SYNCDIM_SHIFT (0x00000002u)
: C5 y6 J _, e' ?
#define OPT_TCC_MASK (0x0003F000u)
# q) n3 s2 q# V8 k+ i4 x; ?
#define OPT_TCC_SHIFT (0x0000000Cu)
4 p/ c9 o4 c- `$ ^$ _
#define OPT_ITCINTEN_SHIFT (0x00000015u)
( p1 j" `4 U A R; D6 l- a
#define OPT_TCINTEN_SHIFT (0x00000014u)
0 N; I" T# H7 P- Q( `( |
8 ~; T- w8 @4 t0 b8 f7 q d
char ping_buffer[PING_PONG_BCNT];
# h, Q9 |4 X4 B9 H$ E" O2 Q
char pong_buffer[PING_PONG_BCNT];
% a- o( @! z5 p7 t+ z5 _9 B
' \$ |: K3 q0 Q. t4 Y
) Q+ Z$ I4 O. q
9 k5 Z6 P& a, ~/ A7 H
% l' U/ q' R% G, f
static void ys_edma3_init()
" d: y1 _% s. X# X7 I- o
{
: p+ O( s; n" r) M2 x5 z
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
% o$ n. m: m3 {0 d2 O4 X
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
X5 c8 W; \$ v$ p! X: T
EDMA3_DRV_Handle hEdma;
2 z- s- }* [& R. B& O# t3 ^
uint32_t chId = 0;
5 R* g4 X0 O% Z2 ]' K3 D
uint32_t tcc = 0;
# A8 U7 M8 K: u& G) N
, ^( u; Q& m9 `
print2arm("edma3 driver init...",0);
8 s5 L) i& [: E5 H$ Y
! n) w* |$ _3 \
hEdma = edma3init(0,&result);
' a& m' a' @( \: x3 `0 z
if(hEdma)
M5 \; O$ q8 [9 Z/ U/ X2 X
{
J- b1 Z0 O+ q
print2arm("edma3init() Passed.",0);
& t/ d' @! z# e C4 \. R' [
}
3 e5 Z4 m5 U: {6 x. H$ C3 f
else
2 n/ g& y# G) w& J3 S
{
/ f1 e c* |7 s" D1 V0 x* c
print2arm("edma3init() Failed.",0);
# y( g8 E$ s9 P% b5 S
}
0 Q; D3 E7 L" ~ O, M! y: U: v4 |9 ?: E
( D. e; A5 }7 D- V2 m
if (result == EDMA3_DRV_SOK)
# k) _' a2 n- v& g8 n+ Z0 X, _! ?
{
' G% p: b; W+ Q z1 O+ u% z
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
0 ^0 @+ ~; `; ?; ?6 A, J, i5 y3 g! Y
(EDMA3_RM_EventQueue)0,
# z/ c# x& d7 Y8 C/ f# ]9 ]
&edma3_isr, NULL);
& v' h$ V' J0 W8 x' s
}
e' l; U& q9 A! L, H# t h
8 N( w5 |1 f0 ~3 y; {0 L/ N
if(result == EDMA3_DRV_SOK)
! }. ]: W' p0 i# _) ~/ t
{
x" j2 v8 V" z( N7 l) Q6 q
paramSet.srcBIdx = 0;
2 z7 F% P r3 ~/ {# @1 ^4 D1 \
paramSet.destBIdx = 1;
# j, o: p. |! g# l2 s: Z
paramSet.srcCIdx = 0;
! ]* I/ U; U. s7 v& O2 |! ?
paramSet.destCIdx = 0;
+ R% \/ f" ?- J* H. _
paramSet.aCnt = PING_PONG_ACNT;
# Z+ a* a9 v; W. d% B! c( i: F, w
paramSet.bCnt = PING_PONG_BCNT;
' n# O# X; L( ?+ L w1 Y
paramSet.cCnt = PING_PONG_CCNT;
0 u2 ~: m1 y+ ^1 G% p+ V% V! _8 Q
+ `: s! I. F; h, Y5 l
/* For AB-synchronized transfers, BCNTRLD is not used. */
' `0 [2 E/ b% c6 b {) n
paramSet.bCntReload = PING_PONG_BCNT;
0 d) F4 o8 N0 c1 `: J
, k4 @1 I' `1 B5 n5 |5 P
/* Src in constant mode Dest in INCR modes */
- [2 w9 X( E* D- v$ X
paramSet.opt &= 0xFFFFFFFDu;
4 `; g& x( U2 [" f
//paramSet.opt &= 0xFFFFFFFCu;
" t/ ?1 M0 a. Q/ W$ n) T
! Z+ M1 W$ k% S9 p0 Y' D
/* Program the TCC */
+ d# Z; _& E( m8 X
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
# N9 [+ W6 \! E- Y! S/ [
; S! R2 P1 @8 K! ]2 d% P
/* Enable Intermediate & Final transfer completion interrupt */
7 Z1 W4 [) U! B7 n k) b
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
' l2 m5 z- B% B! v# |7 O- \
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
4 f1 p! Y o. C4 S
0 @+ Y, n+ `) E8 j3 y& u
/* AB Sync Transfer Mode */
+ n0 W- H' h1 g: [% F S
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
6 I! r# w3 t8 j6 d5 \: q
B, d6 w, ^0 e+ v2 h8 k: a
/* Program the source and dest addresses for master DMA channel */
* O! K7 C( r. s. ^# V
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
! i5 `- {) c5 a2 ~
paramSet.destAddr = (uint32_t)(ping_buffer);
" g" a: A' A% A1 j
: V8 h9 K( G& A: V3 N
/* Write to the master DMA channel first. */
" x9 d3 u9 U% T( M& U0 h' x
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
* |) M8 l. e* y! |; A8 W: B/ I% b2 @8 Y7 A
}
" U/ w l4 j" g; F% i$ w' E
. T) D. C, } Z1 I0 h
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
8 _9 w5 u4 V' U7 H* f% i' a3 N
4 s( w: i" y2 l3 J9 k8 `) d
if(result == EDMA3_DRV_SOK)
: R2 U; r6 N5 R. H3 A
{
) C/ K! V1 q; B! a( f! }
print2arm("edma3 driver init success.",0);
$ {" {$ u0 L- _) P
}
4 n* d4 A( v6 [. u* {+ |7 _
}
) }: s' K, G- m2 j% h }9 |; F+ L
5 m5 V$ o, P4 }7 F! p6 q. \
0 |3 O- l4 G: H' @6 o8 O* D
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
0 v# c8 a. D, G9 B+ \
' E! i9 L% |( `$ f+ T
( Z% l/ F P$ A0 q# @- P$ p
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
0 Y9 X0 d+ _1 c# p% F% S
每次DMA传输完成后都要再次使能传输
4 d7 Y) ]6 w+ {
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4