嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
* F6 \7 S& G) W) _6 w
#define PING_PONG_ACNT 1
. L5 _* ~+ K+ z
#define PING_PONG_BCNT 8*32*40
9 j8 N/ A4 J0 A7 ]4 {7 T
//#define PING_PONG_BCNT 1
B" S, D2 y4 h9 W! n
#define PING_PONG_CCNT 1
' q+ K- ~( T0 T; v2 S! v* X, Z: v1 Q
#define MCASP_BASEADDR 0x01D00000
! ^8 Z( {# k; ^7 t6 |/ Z
#define Mcasp_RXEVENTQUE (0u)
3 X6 B0 ?. T( N* U" ?' S+ w( N/ j4 @
" n- ?8 S$ ?; Q4 q/ W( R3 f
/* OPT Field specific defines */
. A+ ^1 k) @2 q0 y" m Y8 G1 U
#define OPT_SYNCDIM_SHIFT (0x00000002u)
! ^ g" t$ d% u/ g4 s
#define OPT_TCC_MASK (0x0003F000u)
! c2 f" R$ `* f1 e
#define OPT_TCC_SHIFT (0x0000000Cu)
0 l: b/ D |9 ]3 F# x( T
#define OPT_ITCINTEN_SHIFT (0x00000015u)
% ~* L0 G/ Z3 n3 `3 V" |$ b
#define OPT_TCINTEN_SHIFT (0x00000014u)
- I: u. B; s, A- f$ v2 f) b
, w# z1 C( @* w! C( w6 }2 B0 Z
char ping_buffer[PING_PONG_BCNT];
: r- }( q2 w" u4 P1 K0 `- F) A- C# j
char pong_buffer[PING_PONG_BCNT];
7 f h5 s: Y ^0 d7 M1 \1 D; b
9 H k. k( c4 {7 S) u. S# V
' Z5 l% d: c) u0 U. X" i
, s$ E1 G' e2 ]- P" l
( N) V1 ?5 {. o! B) i7 s6 s# j
static void ys_edma3_init()
* Y+ e6 a8 k2 l3 ]0 Y2 U8 C
{
; ]3 ]$ M" n+ k' x8 [
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
8 C. Q% v3 g$ z/ Q1 |4 k
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
! F" u7 p& x! U" ~0 `( W
EDMA3_DRV_Handle hEdma;
$ f1 s( _1 x6 I" v' a
uint32_t chId = 0;
/ |. _4 T; m4 @6 w+ c9 e# C
uint32_t tcc = 0;
& E9 n/ A$ ^7 y O8 y0 @- a) E' P) C
" B7 R8 T- P4 T
print2arm("edma3 driver init...",0);
, d: m' W) E3 N
' O( {5 T, x1 q. a- }
hEdma = edma3init(0,&result);
5 H2 p1 D5 G" ]
if(hEdma)
& v+ p5 A$ k% r
{
& X- D" D, L( g! X; V
print2arm("edma3init() Passed.",0);
+ n) O0 U# i" }2 t( q/ V
}
j( H- H6 c# K8 ~: b% M
else
% @% A! e2 b5 l+ Q; U6 M
{
- i/ s6 J6 [3 Q+ G
print2arm("edma3init() Failed.",0);
2 ]. W% v, ~2 S+ z0 Y1 w7 B# J
}
. l# Z# C D2 M& b d
# w. [/ f( n8 H/ K S) x
if (result == EDMA3_DRV_SOK)
) I* q; ]6 b: j/ \' M$ \9 m1 ]/ g
{
5 G5 `- t* E5 J7 A) p
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
- ^0 G! b# j, _
(EDMA3_RM_EventQueue)0,
% `+ O. L [% U- A
&edma3_isr, NULL);
2 A$ _2 k9 `( L' G. l. S# x
}
4 e) w1 ?3 Q: q0 V+ [6 }
6 _2 T; r+ m u
if(result == EDMA3_DRV_SOK)
, @' T* B! V8 R4 T4 W
{
. F/ s1 `4 j0 c& T' C0 c
paramSet.srcBIdx = 0;
R8 U& U( ~/ V7 J
paramSet.destBIdx = 1;
6 @* [# v+ k# G- T* l$ p
paramSet.srcCIdx = 0;
0 t z- [6 D# G7 K4 ]) H# `
paramSet.destCIdx = 0;
, i) A9 s+ q A8 F# N5 b7 `+ x
paramSet.aCnt = PING_PONG_ACNT;
8 T L7 E) B5 [7 C m: E# n
paramSet.bCnt = PING_PONG_BCNT;
5 G: z9 @0 T! J/ C0 C: [
paramSet.cCnt = PING_PONG_CCNT;
5 \. Z9 y7 ?, g8 ~
8 E+ x$ A4 u( P6 ~0 t) I
/* For AB-synchronized transfers, BCNTRLD is not used. */
& E* s: f) F6 |4 f! F6 m* a
paramSet.bCntReload = PING_PONG_BCNT;
; d2 n) Z% s S( d5 m: r6 Z
/ ~6 W7 f- }& e7 t
/* Src in constant mode Dest in INCR modes */
& c: J9 w) W4 R! u; ^" N
paramSet.opt &= 0xFFFFFFFDu;
% F, F1 w( d9 s5 q
//paramSet.opt &= 0xFFFFFFFCu;
! p4 @: n' O$ \, v/ u
4 v- B a# }- f0 H
/* Program the TCC */
+ v p& q( {% \4 h+ ]& b6 Q
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
/ |! C8 C K8 |. k5 |
4 _6 x' `* C9 h) z, O" N4 p
/* Enable Intermediate & Final transfer completion interrupt */
5 B% j# o6 h5 H& c a! q4 S
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
9 f7 @# e3 t8 w7 ~( j- M
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
% o' Y: A5 X/ j( Z
! K' b/ O) t: g# y$ f+ \ i1 Q1 X
/* AB Sync Transfer Mode */
X4 x, A( u2 _& n
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
- y- |2 o b+ `" r. e( I
; v$ R% D k0 X; {
/* Program the source and dest addresses for master DMA channel */
& A) n2 _2 ^2 q& f
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
9 S! v3 A+ s; l# [( p1 N( W
paramSet.destAddr = (uint32_t)(ping_buffer);
4 v& Y# c4 s1 e' t3 L9 |" j: p( R
9 E* [% J/ H5 t, H9 w" c
/* Write to the master DMA channel first. */
9 Y# G6 L5 I2 o: D/ }9 \
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
, j& G& j+ E, I4 J
}
& j+ `# @ V9 I# a+ h9 d# A
v7 u7 a' i( X
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. e% v8 i' j3 K: Y( M' c
0 c5 m) R. w+ z9 e# r% Y
if(result == EDMA3_DRV_SOK)
U% c4 F4 B# Q
{
8 h/ [3 s7 G& I, ]$ _: {
print2arm("edma3 driver init success.",0);
) p" M3 p& {' Q. e8 ~0 [, ?7 K
}
' \5 {4 C& M' H3 u: C
}
: x }/ X. c& U" o7 G
1 ~6 x# u o0 h: `# F8 B( b
, O, M9 J" L+ j# ~ x4 C
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
, m/ M6 F5 ~) c {% ]$ V
4 R0 I% r/ ?1 ^- M; h3 y( ~
5 e1 E; K N- V* n* {. [1 o
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
6 u3 B d; C- A# q* a
每次DMA传输完成后都要再次使能传输
. S' j: g5 s- y: z% r
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4