嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
. f" s5 N" j( X
#define PING_PONG_ACNT 1
; B P4 O- w6 x! A+ S! |
#define PING_PONG_BCNT 8*32*40
& O) u% u; H+ B0 R
//#define PING_PONG_BCNT 1
* R* ]4 O4 A7 W
#define PING_PONG_CCNT 1
1 I+ p/ m I' Y; |0 g
#define MCASP_BASEADDR 0x01D00000
% i8 w" s% P# W3 I0 ]! M
#define Mcasp_RXEVENTQUE (0u)
! E! i9 J# E; q. p* \1 T
& U' s! F' L+ N. P& _
/* OPT Field specific defines */
U7 J4 @/ Y( E+ K5 b
#define OPT_SYNCDIM_SHIFT (0x00000002u)
5 w+ V0 T, G' _8 r, F2 t" b" m
#define OPT_TCC_MASK (0x0003F000u)
. G+ F' t! @; j8 W0 w: j
#define OPT_TCC_SHIFT (0x0000000Cu)
% c4 _" _7 J! C& |! D/ ^! Y
#define OPT_ITCINTEN_SHIFT (0x00000015u)
3 Y9 _% z& Y5 V5 x
#define OPT_TCINTEN_SHIFT (0x00000014u)
4 n: w0 L! T2 B2 U+ i$ ]
1 s! i b: P Y; V2 f" r1 z
char ping_buffer[PING_PONG_BCNT];
& ]* ~' f6 g" A# k) u5 |
char pong_buffer[PING_PONG_BCNT];
% c& k; Q3 B* \) k! W
- m& y: F6 e# Z; l
0 H6 h- o9 c( Z2 z8 J8 U4 C
" d! a6 O+ s* u+ Q) q# G' A
# C- d, @) V" j, r
static void ys_edma3_init()
2 j+ z' J9 s# S
{
- m+ ?+ P1 h! b8 |
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
0 k2 I2 A- _) {- ?5 X: S
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
" p8 W% r4 T0 O6 L* E$ A
EDMA3_DRV_Handle hEdma;
# G0 o0 _) n! o/ {( l4 R2 j
uint32_t chId = 0;
1 @- c' v' v7 z& F* G" Q& G
uint32_t tcc = 0;
- h7 \4 I0 r; V- d2 E- l* w# K
! L1 T# H# N# P6 N- v7 C
print2arm("edma3 driver init...",0);
; \* V5 q6 J, O7 P
9 e4 L. o5 r9 @) I/ \+ n1 E+ P2 \
hEdma = edma3init(0,&result);
$ |+ X% u5 K6 C
if(hEdma)
: B c. w0 U' u! G( x0 u: q9 |) m
{
! u7 U$ D) l* ?8 g% _6 e
print2arm("edma3init() Passed.",0);
R1 A" Z: t# g, f
}
" o) u- k4 x/ w3 ~
else
* T( u2 B9 Z8 x: y4 a, }
{
! v- L3 |" m& u+ C+ |4 x. `; ~
print2arm("edma3init() Failed.",0);
% t1 M6 V, b3 T
}
* g. q, y; F: V! y
7 s+ I! N b$ R* X$ w7 K! a
if (result == EDMA3_DRV_SOK)
8 r0 |% V* g/ U% k8 A) l
{
/ A8 L0 t) U$ k( B4 p* Y
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
u# Y( V0 ~- r
(EDMA3_RM_EventQueue)0,
7 \) c' C4 Y k$ F8 d* E
&edma3_isr, NULL);
) T2 @1 o# o7 z! X2 ~
}
4 A' K$ S- }9 a
) k2 l/ f' ^0 R0 y' ^$ G1 v
if(result == EDMA3_DRV_SOK)
0 r9 ^- Q9 X5 f# M1 S
{
# \# t! d7 R- n1 d& z( R+ Q, W3 k! Z
paramSet.srcBIdx = 0;
) L1 n9 E+ X. Y3 k
paramSet.destBIdx = 1;
& F+ \$ D+ c0 ]% d" M
paramSet.srcCIdx = 0;
4 }/ y' y/ Z, M: D4 }: k% q6 A+ J
paramSet.destCIdx = 0;
; a9 j7 b. O- b
paramSet.aCnt = PING_PONG_ACNT;
6 z/ s0 E' H; z4 Z0 o
paramSet.bCnt = PING_PONG_BCNT;
4 p/ ]3 n- M2 {% q
paramSet.cCnt = PING_PONG_CCNT;
: R' s$ O. A# }4 U1 c0 j0 |( N
7 q! v* r l* m9 }% X
/* For AB-synchronized transfers, BCNTRLD is not used. */
; q+ k0 C+ Z2 i8 n
paramSet.bCntReload = PING_PONG_BCNT;
. S$ i2 \8 K# k9 b0 c$ T$ v+ ]$ S1 V
! S. b- Y9 R ?6 B, J6 ^
/* Src in constant mode Dest in INCR modes */
+ v8 J: {2 P5 ]1 e
paramSet.opt &= 0xFFFFFFFDu;
$ a# M6 u4 N/ X
//paramSet.opt &= 0xFFFFFFFCu;
+ X+ O, E8 _9 ^. t2 B+ Y# M
) @4 ?$ s/ H, U: o
/* Program the TCC */
, Z! Q3 I: y3 C0 p o; r) z9 x2 G
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
& k/ Z; F& @# R/ S
: e4 y4 f/ c( N$ m
/* Enable Intermediate & Final transfer completion interrupt */
* o+ y G6 W2 O; v3 k
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
x: f3 _1 u6 u: A! ~- q8 a
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
' T& `- v) T( b. P
) w8 D, Z; N2 s4 Z; @9 V6 I4 N0 s
/* AB Sync Transfer Mode */
5 ` Z" U7 f! f, J% S5 u( l
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
1 u' E. X: E# d& h
' O6 F4 q: {6 k. g6 o. g
/* Program the source and dest addresses for master DMA channel */
( v6 k' q8 d. }5 h/ h( `
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
" E$ @6 Y$ |' {1 p3 U3 \
paramSet.destAddr = (uint32_t)(ping_buffer);
5 P1 m& J% x7 ~% V/ J
0 p1 ]8 V# u) ~6 f5 s
/* Write to the master DMA channel first. */
$ W* r# z% U- c; C$ w
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
1 I1 _1 {4 E5 N8 w& ]
}
! c8 q- Z; c% F2 w2 r
# d# U7 [# w; |
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
$ K* k$ f. B4 B0 l0 i
! o! y& v" a/ w2 R1 w
if(result == EDMA3_DRV_SOK)
. P# G" {: k7 t' e0 I$ A+ Q
{
5 _* S! W) l' f/ I6 X6 d. J
print2arm("edma3 driver init success.",0);
; B0 B. A8 c% w
}
+ D3 p9 a1 J/ ?, O9 q) A6 J
}
3 _; \" d! q, t8 R C
+ V4 K7 h# |( J7 {; w# X
- ]/ D2 K% W0 c
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
7 u3 u# t9 a* B8 n+ O
3 y7 J2 f& @5 o6 o
0 ?# ^& K$ }8 D+ S/ ^6 {- |
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
& ]5 K9 \0 A' S x
每次DMA传输完成后都要再次使能传输
5 C) E' _# K* H/ ~8 M
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4