嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
7 V+ s7 B( d3 e0 s: i {7 u) u
#define PING_PONG_ACNT 1
M( }# c8 x8 k
#define PING_PONG_BCNT 8*32*40
+ }5 y3 \, d# P8 _8 g9 w) A
//#define PING_PONG_BCNT 1
: f0 \) ?5 @- ~- e; D3 q/ u
#define PING_PONG_CCNT 1
' g$ E% o' E+ P: \; | D
#define MCASP_BASEADDR 0x01D00000
& W' d' u1 `* i/ b5 I% x2 T8 o& Y
#define Mcasp_RXEVENTQUE (0u)
6 ~& h$ \6 O3 q
2 u) U- q. J& t+ W5 a
/* OPT Field specific defines */
9 P' L6 `9 @" k& I8 E* z/ q
#define OPT_SYNCDIM_SHIFT (0x00000002u)
' y. s9 [' N8 l4 E
#define OPT_TCC_MASK (0x0003F000u)
4 m e, D8 ]. `
#define OPT_TCC_SHIFT (0x0000000Cu)
* K) S! A& Y( C( ]: z$ R2 I
#define OPT_ITCINTEN_SHIFT (0x00000015u)
: @- D8 A" ^, j/ S! F2 k0 }& G
#define OPT_TCINTEN_SHIFT (0x00000014u)
) M3 v) r2 Q" k$ S( q
% d: v; \; C$ l I+ s/ ^/ n* v
char ping_buffer[PING_PONG_BCNT];
" X7 F) ?% \- F% E K" K
char pong_buffer[PING_PONG_BCNT];
5 B* N* f& u0 X' R6 S6 G/ D6 d
/ `/ @/ ~5 G8 C }
5 g) @9 ?! t& \% s6 {7 J5 M
. U1 A9 s; L- F6 J9 R# b, U" j
% r g. ]4 L) g. R: j, H1 D. C6 ]1 _
static void ys_edma3_init()
. K. j% }/ W7 N8 i$ m# C' N
{
2 V2 D4 T' j3 g( n) t& v
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
: l0 |' I6 t5 n; d- a, D2 m, p0 g1 M
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
$ D8 P+ I8 Q4 q' W) G
EDMA3_DRV_Handle hEdma;
1 }: n3 F7 t3 b! W( M- g
uint32_t chId = 0;
0 w- e8 T7 l! _" R
uint32_t tcc = 0;
9 h$ `1 P w' i$ P
) p: T" d7 `/ Z5 d! s) `% Z& b7 F
print2arm("edma3 driver init...",0);
9 c& J' K4 f1 z" K
2 y# ]' ?+ P5 M+ z+ m% p
hEdma = edma3init(0,&result);
D/ Z" }) x% h8 g+ n
if(hEdma)
+ d' F7 |3 r* Y$ H7 B" G
{
5 S& L2 {; c# F2 b2 _
print2arm("edma3init() Passed.",0);
6 A5 N* H5 x* `& P+ y0 N
}
/ q6 @ s0 {8 v7 x5 d& i; T
else
2 [$ [8 g1 I3 ]; C0 w
{
7 J& n2 G. S/ r
print2arm("edma3init() Failed.",0);
2 V) ]' |" J+ U9 i- Y+ p% V
}
. P- y* ]( f) I6 H0 Q1 u$ o* r
, b5 M1 x" J4 t/ ^- {4 I' q
if (result == EDMA3_DRV_SOK)
3 Q/ B8 H1 w3 Y& u0 u% e5 x" ~0 K9 P
{
. c& u; m5 d3 M2 `. Q2 g
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
3 z" X9 V( ?# v" ~! l7 D: y
(EDMA3_RM_EventQueue)0,
+ v: }" u$ h) z' v( H& n# Z0 }
&edma3_isr, NULL);
2 o" }5 t5 V1 u8 u( L' q
}
N! p \! d7 f; d% z0 Y
, J; \( U" C# r% C
if(result == EDMA3_DRV_SOK)
# |% S9 l, ?' O
{
6 R) d* J0 y3 |6 b1 c+ a2 [- w) p
paramSet.srcBIdx = 0;
- ` H, P4 o# s& d* \' P
paramSet.destBIdx = 1;
0 g5 _5 Y/ L4 P% I
paramSet.srcCIdx = 0;
* F/ M9 X6 A4 a1 T
paramSet.destCIdx = 0;
# e9 [3 ], u6 ~3 Z3 N
paramSet.aCnt = PING_PONG_ACNT;
; n) R/ d1 T: ]
paramSet.bCnt = PING_PONG_BCNT;
8 U6 S6 O( W/ J) Q4 X, n# o% B% w e6 H
paramSet.cCnt = PING_PONG_CCNT;
F9 m7 | [2 k1 h7 u! c( r
1 w: C& h5 [% L# d( M" J/ t
/* For AB-synchronized transfers, BCNTRLD is not used. */
8 N) X6 y8 }; X0 J( g
paramSet.bCntReload = PING_PONG_BCNT;
, L) }/ `! t4 ]/ k+ h |* F9 ]
2 i8 W; h% B- y9 f& o% K5 K
/* Src in constant mode Dest in INCR modes */
. k/ t1 K) t3 |6 e4 i! d
paramSet.opt &= 0xFFFFFFFDu;
; j" F' b+ J& |5 W- ?: Q
//paramSet.opt &= 0xFFFFFFFCu;
- L& U; V0 b2 q4 p& z7 h
' N9 D% E/ E1 P# r& \% G8 q
/* Program the TCC */
0 J0 f# x }' G6 a6 W5 O* D
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
+ u# H: O) l+ O% n. O1 t. G
. E" {- y, |) i8 h9 C
/* Enable Intermediate & Final transfer completion interrupt */
/ P4 }( A" {& X' Q. F/ S
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
7 b3 C: P1 q% N* b) W Z
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
" u8 J3 @8 ? C: ?
- {/ C, m+ F$ z2 W) n" d
/* AB Sync Transfer Mode */
0 I1 H* k! }+ V X& Y6 K$ g
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
& ~, K6 X$ r/ \+ e& G. P3 C! |
: f- y" Q i# m5 u
/* Program the source and dest addresses for master DMA channel */
% g' w. k! X/ H: ~4 u c/ o& Y3 E
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
* R* m. M# p B. L
paramSet.destAddr = (uint32_t)(ping_buffer);
! f2 J% h E+ ]/ y0 A; i+ {; e
3 S8 i# C" g# {. `4 U- X
/* Write to the master DMA channel first. */
- J: ]7 ?1 E D% U7 D' b
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
5 ] Z% [$ X& a' K" g
}
) \7 M0 I+ Y1 Y- f/ a
* C3 S( p% @/ k6 q: Z
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
8 O& L3 l. R, w/ G
6 a# F0 t; U5 S: K" `9 W7 M2 M
if(result == EDMA3_DRV_SOK)
/ u3 i3 J# A! I- u5 Q$ \
{
' z' ]" r+ u: o+ ^9 C
print2arm("edma3 driver init success.",0);
4 Z1 E" }" ?$ `9 G
}
0 A b4 `- M1 r. E
}
& F* A3 U3 \0 ]1 j, V* B' |+ {
& ?6 U, C0 K/ L3 S" I
7 s9 g1 ~2 p5 E; F9 e7 h
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
+ s) l) V2 Q* w _0 [. g. m G
: f ?' o7 U- N( O
( Q! C* E# G6 ^
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
; ?. F! b+ `( [2 P
每次DMA传输完成后都要再次使能传输
0 {8 ~6 d% W" a1 [) u( a9 G" m
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4