嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
0 a3 @4 K+ h0 ^6 X* X" _2 J6 [* u
#define PING_PONG_ACNT 1
8 o0 i, W5 U, q
#define PING_PONG_BCNT 8*32*40
& y1 j2 V; R# g6 z
//#define PING_PONG_BCNT 1
' p+ r$ P* E: I' m
#define PING_PONG_CCNT 1
* g# E1 f a1 S, {
#define MCASP_BASEADDR 0x01D00000
: ^. A2 m/ X- [. q7 K7 h1 i5 E
#define Mcasp_RXEVENTQUE (0u)
. ], j: M( J3 ]. D) k7 }/ {$ {3 w
8 E* t4 z4 h4 G
/* OPT Field specific defines */
, G8 `6 V5 ]0 W) W8 }9 {5 K
#define OPT_SYNCDIM_SHIFT (0x00000002u)
8 H3 q" N3 n/ O& n
#define OPT_TCC_MASK (0x0003F000u)
! _; u# e6 k6 ?, X# R: b
#define OPT_TCC_SHIFT (0x0000000Cu)
- R( U3 K, C+ r) f7 a
#define OPT_ITCINTEN_SHIFT (0x00000015u)
& |5 q* O4 Y- }5 ~2 e! g; [
#define OPT_TCINTEN_SHIFT (0x00000014u)
9 |$ p( Q8 B0 y& k
) Z1 E% F* [5 L8 ?6 u
char ping_buffer[PING_PONG_BCNT];
3 }! l8 s7 N* [, ^
char pong_buffer[PING_PONG_BCNT];
% e; `5 ~7 y5 b; J; x9 f) `5 R
( R- t6 u$ [6 {7 L# `
( f: J7 L/ e! W: k" k5 r5 M
, [' @3 I0 A" s$ }0 D1 h2 D
7 A& I' c& R# M) Q
static void ys_edma3_init()
, ]* {' j }7 K8 Q j/ F- c( d, [
{
! [* ~2 Q" z$ w( g% R4 {
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
* P5 p1 c" h( S6 q5 v, d$ p2 l3 }$ ~* Y
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
/ Z- X4 G2 U* o$ s& d
EDMA3_DRV_Handle hEdma;
! X4 F" S9 f _ ]3 P
uint32_t chId = 0;
& N& }$ ?+ y* W8 R" F, ~) Q
uint32_t tcc = 0;
Z. K% x: l- F; t6 H
" l! r" H; |1 [' n) y7 o0 \
print2arm("edma3 driver init...",0);
& B4 G* J8 g5 J6 [; P' j
) ~! z8 R2 b: {% D" p
hEdma = edma3init(0,&result);
! S+ n# w! j- z
if(hEdma)
( i$ Q7 u& ~' H% j: T* }7 K
{
! \9 e) ]0 X5 c# {2 n
print2arm("edma3init() Passed.",0);
: b K- b" {3 B: K/ d
}
7 C& d! c7 \" ?/ J7 Q! |5 a
else
6 }' x3 g [0 e6 }
{
9 q/ O: W, g, G1 T' B/ r+ S3 L
print2arm("edma3init() Failed.",0);
) o0 s4 b+ l3 d) @
}
' N% S ~) x- i! s. ?2 `
1 Q+ u$ z) P0 m5 c0 u
if (result == EDMA3_DRV_SOK)
4 K% v) R- Z* a
{
: O& ~# [; J4 h9 _+ l( o
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
% z1 U' z: _3 a* r
(EDMA3_RM_EventQueue)0,
( V' s/ f6 M/ m
&edma3_isr, NULL);
' k* E5 s2 X' e6 a2 R& x
}
* y( ^3 h+ z6 |3 D( X
$ ]: d7 k4 Q% y5 u6 \- ^; t
if(result == EDMA3_DRV_SOK)
8 C$ H9 P1 Z9 M( r
{
9 s% M+ e7 o, q
paramSet.srcBIdx = 0;
. t+ x! `9 |2 j$ z8 s
paramSet.destBIdx = 1;
+ l6 |8 f6 T; E8 z
paramSet.srcCIdx = 0;
' d) A2 b' z: V% S+ ]7 E) N9 v
paramSet.destCIdx = 0;
' [: c7 Q V/ D7 Y" r9 I1 @
paramSet.aCnt = PING_PONG_ACNT;
* U, O% D8 ]( U* f- i. j
paramSet.bCnt = PING_PONG_BCNT;
1 t2 p: {2 Y2 ?2 ?# b
paramSet.cCnt = PING_PONG_CCNT;
, R! y% F, T5 \6 U( T9 D
8 W: r ]# W6 H' y
/* For AB-synchronized transfers, BCNTRLD is not used. */
7 Q0 Y( `8 m1 P8 D% f, f# L
paramSet.bCntReload = PING_PONG_BCNT;
# q2 G3 g+ m" h& r9 g/ O, r; D
! i6 v3 v2 t9 _+ C0 A4 O
/* Src in constant mode Dest in INCR modes */
7 D! v) K0 u% o; ]0 Y; U: [
paramSet.opt &= 0xFFFFFFFDu;
. P. h- E8 T. J( D A' h2 B" H
//paramSet.opt &= 0xFFFFFFFCu;
" ?* q( a0 y9 Z" j
9 P8 ^3 r/ G- S# i9 d) t
/* Program the TCC */
9 Y1 T, E5 |" Q
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
2 }$ }/ ?6 f5 m( E Q* x3 U
( _7 p& x2 f9 m, Z" A. K$ C6 P; }
/* Enable Intermediate & Final transfer completion interrupt */
8 L9 |: z# L1 b1 M( E; j$ ^
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
! k" F# |3 j7 x4 J
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
! ^1 h( T" X4 _7 e) [0 s# q
3 y- Q1 b5 k# q5 G
/* AB Sync Transfer Mode */
) n/ j4 I% k) L* L4 @
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
# R+ T+ f! ?( d1 W
$ Y4 @3 f2 m) |$ @3 S, o
/* Program the source and dest addresses for master DMA channel */
4 Z! N% y; y* O4 n
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
( b! m1 E6 G! }8 V+ @3 D
paramSet.destAddr = (uint32_t)(ping_buffer);
$ {4 E Q. {9 W
* S- j% o9 N2 @; V5 T$ @
/* Write to the master DMA channel first. */
5 n4 |1 w* M4 p8 U3 ^! V
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
( _0 `+ V4 q" c8 }. |
}
. x7 s" g& Y; Q0 t3 s% ?
$ a' [, ~ v8 e. M$ }8 V; Z
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
1 m& t u y, P% r
+ C! _; p1 \/ ^2 Y% d
if(result == EDMA3_DRV_SOK)
2 g ]. ?6 e- p! ]
{
$ l& C' k ~( T4 M
print2arm("edma3 driver init success.",0);
5 u; h. F) n) e$ B! J6 C+ K" S0 f
}
9 ~, ?$ z* |6 V
}
3 O o% B( G H0 k- H1 G
7 {( ^% J! T- V$ r& S* W
( w7 E: e0 P2 D! T3 Q" K; X# n
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
" Q9 ?+ L5 O. |4 I e4 k4 k. c, V0 N
) H( B# j* X9 n+ ]
2 k! Z! U) B5 J7 U5 j) f( A' R
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
* p; Y$ e- ]1 A4 m4 K
每次DMA传输完成后都要再次使能传输
/ C8 o- R: R5 {- F7 H( }" m( p7 D
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4