嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
! k% O1 ]! l% S9 X9 H' C
#define PING_PONG_ACNT 1
, p) G( ]/ l* X1 o: \& D$ I
#define PING_PONG_BCNT 8*32*40
& F8 L: o5 s$ l j. H
//#define PING_PONG_BCNT 1
8 O5 M1 @& d0 A6 Z& Z5 ?2 d
#define PING_PONG_CCNT 1
1 S! m5 E' [* I/ ]2 R" M
#define MCASP_BASEADDR 0x01D00000
. `; b5 T1 h6 K( ^6 x1 Y: k% [
#define Mcasp_RXEVENTQUE (0u)
3 J- F! U; A% ^/ Z" U
* B7 h6 A; J, e0 ~' q9 V r6 T. d+ x
/* OPT Field specific defines */
0 j: W) w2 L4 I) m! E/ j- H% D9 @% v
#define OPT_SYNCDIM_SHIFT (0x00000002u)
: J: g% E/ }% u. {, k$ v% c' l" b
#define OPT_TCC_MASK (0x0003F000u)
9 E$ m, W3 G$ A. q. J% O* L3 U
#define OPT_TCC_SHIFT (0x0000000Cu)
# n# k! o: x% [. u) e2 Y. A4 B% o
#define OPT_ITCINTEN_SHIFT (0x00000015u)
) v1 H+ v- b, ^# C+ B
#define OPT_TCINTEN_SHIFT (0x00000014u)
# J, |& H0 e$ _4 u2 K5 Z# v" |
# q# v d9 k! h K" e2 R, V6 e
char ping_buffer[PING_PONG_BCNT];
8 r, ?! [! w0 b! ~ Q% J# [2 r
char pong_buffer[PING_PONG_BCNT];
8 i0 C1 I1 u7 @& q4 b! E: n
1 ?; B. y+ Y( L+ x
" t T) a- S$ c, J
7 X7 S4 G, B# V6 p8 i1 u& ?
8 A3 ~! s& a! s8 f
static void ys_edma3_init()
8 S3 V9 X% `- G! l& t: `
{
: ~7 c4 ]3 G# v) [8 a
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
' x: o+ ~; ]4 }
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
* c; c# ^. c; o& x" u z2 k
EDMA3_DRV_Handle hEdma;
5 ?2 g/ ^* j) h' ]5 N$ D8 g! i
uint32_t chId = 0;
: s% S2 U- M8 f5 U
uint32_t tcc = 0;
3 }3 o6 M# r/ H- x" V9 _
1 o' g4 c0 U3 b8 K
print2arm("edma3 driver init...",0);
( F$ g" B! `' J# G1 n) W
/ O2 [+ V% [* H, c" U3 c! S
hEdma = edma3init(0,&result);
) V: q( H/ j. e# s# M0 _
if(hEdma)
$ x! ?) w5 @/ r1 T
{
. L p: W/ r/ G
print2arm("edma3init() Passed.",0);
! d% [* G+ w" c; ]4 T- e( @" Q
}
% [; M+ T$ _1 F9 Y* b3 V2 C
else
! W0 [( M" N! O3 `) N' R$ A# L. S
{
. H0 l# m( w; y9 _, o+ n" T
print2arm("edma3init() Failed.",0);
# e* h$ V' }2 X9 `5 k% q8 a% y8 K3 J
}
; {: h P+ x: T# Q2 `) i0 N
* Z2 d/ H$ r, ?, r+ F
if (result == EDMA3_DRV_SOK)
7 D0 M i& G9 z& ?7 e* Y
{
p( m* \' j9 l& H: s7 E: R
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
, V7 g* |& h; c% f: S4 _/ Z, M
(EDMA3_RM_EventQueue)0,
& S% k1 r) V ~, ^0 g5 Z
&edma3_isr, NULL);
: r2 y$ W" _5 i* f5 h2 ]
}
4 h3 I1 O$ h, D; A2 t" a
1 X/ i: b0 H# T( W7 Q
if(result == EDMA3_DRV_SOK)
! k6 @0 c, [* o# a1 p, W
{
1 e7 [; d: b1 }. W+ t9 s0 [
paramSet.srcBIdx = 0;
: b0 F, B+ F- X4 _7 |; ?! Q
paramSet.destBIdx = 1;
I# a# t2 L" a: i* X: Y; x
paramSet.srcCIdx = 0;
+ z5 W4 j9 F4 X0 ^, r5 g; J
paramSet.destCIdx = 0;
( Z+ f+ @4 i' C. H1 M( ~8 I( M7 G: Q
paramSet.aCnt = PING_PONG_ACNT;
! h: g" u! v% ]9 B ?" v
paramSet.bCnt = PING_PONG_BCNT;
; c4 D" N" e/ y' d! o
paramSet.cCnt = PING_PONG_CCNT;
! a) R- c3 i- ` W% M4 b$ z. F
+ P9 n$ h6 a3 t" ~7 ?
/* For AB-synchronized transfers, BCNTRLD is not used. */
, s0 x+ ^7 h1 n R' C3 M9 u8 f
paramSet.bCntReload = PING_PONG_BCNT;
& s6 }! ?4 ?! z; d
' l1 Z3 W: [% z- f$ k3 H; M) J: w/ H
/* Src in constant mode Dest in INCR modes */
5 ~, i- k1 W% c5 {: H p3 _1 a
paramSet.opt &= 0xFFFFFFFDu;
; R8 ~5 l* `+ P, s
//paramSet.opt &= 0xFFFFFFFCu;
5 Q# i3 d% s# T* l, s
0 G+ j) `: i: _) @" j; i: H* T7 Z
/* Program the TCC */
; _) t" t: ?* Y3 L
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
# `$ ^# d2 c% G! d; i
5 K$ X+ a3 w- `7 \, B
/* Enable Intermediate & Final transfer completion interrupt */
; y) u# Q( j. c; l) c
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
" e8 H! g% j, q5 @; t
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
: {5 } i, _5 z- A5 D2 j
" ?! V3 S# t& v2 c
/* AB Sync Transfer Mode */
- e" C- z5 Q/ ]4 a
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
- ^' b0 R2 h7 v. | k; x$ A6 w+ ^
P v$ N1 s( p+ u2 N, V+ r6 j4 E
/* Program the source and dest addresses for master DMA channel */
0 G; T& y7 ]6 b# w% V9 {, W0 L$ n- d
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
& K. P1 Z8 ~7 E1 l) }# R( ?' A
paramSet.destAddr = (uint32_t)(ping_buffer);
7 \, }5 g1 w* _+ c9 g
' p! t' `8 P5 b7 ?- X4 c8 K3 ~1 a
/* Write to the master DMA channel first. */
, l0 u- ^' X" h* @
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
4 @6 f0 M# S' M6 w$ Z
}
( ^" ]7 |4 r/ U' ^
, a& X% I5 k' D/ ^
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
/ _1 |% k' C6 z) e+ c. x& Y) [
; e3 o& s+ t! D- I$ s+ l
if(result == EDMA3_DRV_SOK)
( \- }2 `5 Q; p$ ?1 x1 u/ F
{
' b. z$ u0 {% j; f2 K/ N
print2arm("edma3 driver init success.",0);
+ @% I% e& C4 J# j* P
}
2 p1 s+ |; e s( Z, `3 j# I1 i8 X
}
; N: { W" @* Q r F
) H e8 A8 e% F0 y" R& ^: k
( T; k- L1 ]1 i2 g9 d9 o
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
9 [ [9 v2 R/ M" J* Q9 R
: k6 {; Z( U& e9 G$ ~) a! K' Y
/ d1 g5 g" ]5 A3 \7 m8 \7 |6 F
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
5 S6 r. ?& s3 R) P+ V' I
每次DMA传输完成后都要再次使能传输
& Q3 j# P9 x0 e
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4