嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
3 Q4 b) C9 A; R! k# t/ I8 R
#define PING_PONG_ACNT 1
0 D9 b* F% C: G( T/ g }
#define PING_PONG_BCNT 8*32*40
2 x E9 d( @+ x2 s. D
//#define PING_PONG_BCNT 1
: M$ h* h2 i5 c* {8 Y
#define PING_PONG_CCNT 1
: {# @1 [ D4 D: Y9 K
#define MCASP_BASEADDR 0x01D00000
) ]# o2 M7 `( ?
#define Mcasp_RXEVENTQUE (0u)
: p( j: f- Q/ u4 d
* ~* H! w. b3 N5 K$ ]: B: `: o
/* OPT Field specific defines */
* X, H; N4 A- z1 U" d
#define OPT_SYNCDIM_SHIFT (0x00000002u)
' l* P, y. u9 y5 K: `3 H
#define OPT_TCC_MASK (0x0003F000u)
0 L# [, m% U5 p' \+ l
#define OPT_TCC_SHIFT (0x0000000Cu)
% C) [# |" G8 E' x
#define OPT_ITCINTEN_SHIFT (0x00000015u)
* j+ P# o! O5 P
#define OPT_TCINTEN_SHIFT (0x00000014u)
. I; w& U, t- F
6 {6 ]0 m+ p* {' h# X3 H
char ping_buffer[PING_PONG_BCNT];
7 y7 Y& O: Z/ L
char pong_buffer[PING_PONG_BCNT];
3 R, B7 c9 k$ {$ B8 z
/ k. q V1 c5 H* b
$ R! r) M$ V0 D1 r& n' k4 O: M
( A+ q$ e7 j, R
" p# B+ O: q5 f9 A8 `( z+ Y7 I( P) s
static void ys_edma3_init()
# E- t8 d" @( \8 K3 I- [
{
- `4 {7 M8 }4 n. l2 M2 \
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
5 s7 v- s+ v$ |' L. Y: x
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
, c( A; R+ v# c) z
EDMA3_DRV_Handle hEdma;
- i0 d% J$ {4 D' x) r
uint32_t chId = 0;
/ H3 n, q& |: P% s! w" ?
uint32_t tcc = 0;
# N+ l: Q5 Z' W; c& Q! v: |( l
$ c' Z) ?% m; ]+ @! _$ h) W
print2arm("edma3 driver init...",0);
/ p6 y4 ?+ I. x2 q2 U" y, U5 a
% S9 H: \+ j3 M+ _6 E, |
hEdma = edma3init(0,&result);
3 c5 p( f- K' \1 G- v: g2 M1 M- u
if(hEdma)
; W. S" y$ H u3 @4 m, F
{
! O# a1 _. M# H
print2arm("edma3init() Passed.",0);
( g6 ]4 b3 @) C0 K/ r1 \
}
8 e- r9 I1 v% g$ H
else
j/ z5 }1 d! ?' d" m
{
9 g+ ~5 N+ m1 l/ I; }6 }" w& ~
print2arm("edma3init() Failed.",0);
/ P- `7 U* S9 |
}
5 }4 Z- A& V: O. k& |! E |
, E7 S1 ]' V9 a) w- k
if (result == EDMA3_DRV_SOK)
& }7 w" }$ b/ A$ \3 Q) X& u- P
{
# l( p5 f! V! D! M
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
0 b! x# x0 ^+ _$ B
(EDMA3_RM_EventQueue)0,
$ N& P( ^8 J" e' K* L- z) `
&edma3_isr, NULL);
J1 e, a. W1 z- y
}
$ R$ X9 S G+ U1 z
N: i3 N9 A. V( ~) J# t
if(result == EDMA3_DRV_SOK)
1 N W6 J9 n% r9 n
{
) S# r; u4 ?, w
paramSet.srcBIdx = 0;
( j3 F, o2 W% C3 U
paramSet.destBIdx = 1;
" s; a" w0 d( t! l
paramSet.srcCIdx = 0;
; e7 F& k/ h6 B) ?
paramSet.destCIdx = 0;
% V* R+ b+ t5 J7 C! k7 o& p
paramSet.aCnt = PING_PONG_ACNT;
% X' y+ E/ U% G# P, ?
paramSet.bCnt = PING_PONG_BCNT;
+ k* [7 {1 ^0 w" N, R4 s
paramSet.cCnt = PING_PONG_CCNT;
: E; k* P5 |0 t
" D7 n- t' Z1 z4 r6 s% d5 X
/* For AB-synchronized transfers, BCNTRLD is not used. */
% l& ~0 J7 V4 e7 z
paramSet.bCntReload = PING_PONG_BCNT;
5 z- h) G8 y3 b" W& `# y* L8 I
) _$ F0 H9 s$ M- z* U
/* Src in constant mode Dest in INCR modes */
6 L0 B7 }+ U+ \9 \* ]5 W
paramSet.opt &= 0xFFFFFFFDu;
* {: o, G3 f$ _8 k2 s
//paramSet.opt &= 0xFFFFFFFCu;
2 I+ m2 x4 D0 w4 K- J8 p
( y* k+ }& H8 V9 j2 ~+ o6 \
/* Program the TCC */
K( \9 T. a/ ?: i. A* s
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
, ?* t- h0 a4 l$ X8 U8 S! ?. S
; B, d) F) k) T% e/ d
/* Enable Intermediate & Final transfer completion interrupt */
& P6 G. U% E; c3 g; q# @+ z* t0 R V* w
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
5 O; e- L: H0 a$ X" }
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
" d8 o4 x+ D1 c r8 V0 |* Z( F( a3 a0 z
$ s0 T, X0 `* r% j a
/* AB Sync Transfer Mode */
9 S' H. _" Y! u. i
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
: j4 |3 S4 y5 m Z& P) k
% \% ~3 K# [5 l
/* Program the source and dest addresses for master DMA channel */
0 Z. ]! o% r% i, \
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
Q2 w/ c& N7 H9 o. }* [+ V# q
paramSet.destAddr = (uint32_t)(ping_buffer);
( A' }8 G. E0 _+ `# E, B! u
+ f7 L$ S" m' K
/* Write to the master DMA channel first. */
5 {) w* `( `. Q# E( ?% n. x1 L
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
6 B3 I4 {" K) `+ m3 w+ d% u7 z6 g% b
}
- l3 l% D6 q! Q, I4 Q/ I
; q K* B' ^1 U) O7 S! R" U
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
' u4 r: i2 b9 ^) v
7 L- o8 H7 a- {5 ~: f* l" Y- l
if(result == EDMA3_DRV_SOK)
5 s. ` c3 b* a7 e! o+ L1 D, x! o) b
{
( e* d5 E. O2 M0 O
print2arm("edma3 driver init success.",0);
: V$ F0 i$ P# X6 D: y- U$ E
}
1 O% f; m. o8 f2 t7 Y* G
}
0 |9 D+ {% K4 v% Z3 w( e
* @% P* ]0 z4 p; ~' S
9 _9 p/ l, U$ P% A
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
* S s$ @: k6 l
6 ]8 i# C! |0 ]) e8 U; s! K7 e, I0 v
, h+ X6 w V0 Q& [- n
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
5 R( {& v+ n' Q: k, J) Q. ?: D( V1 H* J
每次DMA传输完成后都要再次使能传输
4 F# {% |& q) s6 n1 N
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4