嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
% ~$ D7 }6 O" c) w- T5 U8 [
#define PING_PONG_ACNT 1
$ t @, ~" ~3 k( y
#define PING_PONG_BCNT 8*32*40
; l* I5 S8 k1 A; B1 \1 j; `
//#define PING_PONG_BCNT 1
# G' T7 @) x" |, V: \
#define PING_PONG_CCNT 1
# D* Y) @' e; x8 g! _
#define MCASP_BASEADDR 0x01D00000
/ G9 M- }5 s6 H/ s s
#define Mcasp_RXEVENTQUE (0u)
7 {- ]4 o! g5 P: u3 v& Z6 t
" {& y- L) {: ]
/* OPT Field specific defines */
$ S! X: A0 t' Z8 Q$ G! z
#define OPT_SYNCDIM_SHIFT (0x00000002u)
# R- ]' _5 L. L2 X- [9 v# T, G, r
#define OPT_TCC_MASK (0x0003F000u)
" M3 n0 v2 }% L$ @! L# `8 n( l* g
#define OPT_TCC_SHIFT (0x0000000Cu)
$ | |" v1 e+ S# N# ?
#define OPT_ITCINTEN_SHIFT (0x00000015u)
0 W; @) D" ^5 F8 s4 N7 y
#define OPT_TCINTEN_SHIFT (0x00000014u)
# A% e7 P% C! d; U# t2 @2 e
7 o: G9 ]' e$ p- q, b$ m3 b
char ping_buffer[PING_PONG_BCNT];
9 K8 q2 k l, x- v2 i' P$ {* ~
char pong_buffer[PING_PONG_BCNT];
- Y; L+ X1 f5 w
) B* X5 U. |# `8 S6 O
0 F3 n: ]: Z" A ]% T
% j* }5 z; d6 Z6 [( N2 m' n
6 {- ?( M( j0 d6 H6 k" ^
static void ys_edma3_init()
( ^/ p/ P7 q, Y( K# @8 V* j
{
4 A& _0 p. j j" N9 e$ I0 P( c% b
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
5 m. d8 t) j" E4 T9 j# L+ z( ~
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
( {0 L$ }7 G% Y8 R
EDMA3_DRV_Handle hEdma;
5 M* V, t- `8 R4 W5 K1 e
uint32_t chId = 0;
1 }9 @$ Z6 `5 T
uint32_t tcc = 0;
6 w3 u" L( T) B
& i! s* A: e+ | ^
print2arm("edma3 driver init...",0);
- |! h. f2 n, u, G. u
$ E5 E2 C$ n. k3 i
hEdma = edma3init(0,&result);
* G, k2 u3 X' S6 E! B
if(hEdma)
9 K5 x5 j5 q9 s. K0 i R- ^
{
" C0 g9 c4 ~+ p4 }) d: q
print2arm("edma3init() Passed.",0);
. E3 f; h& M% \/ ~6 e b
}
" w/ F% o& e( G& T3 |
else
* `& C& Z9 e# ? P1 u1 x
{
7 H8 U Q0 f" s C6 R( L
print2arm("edma3init() Failed.",0);
$ G" {, c7 ^( U" P
}
9 g& F: s6 D. ]0 `; a' [ x
5 J* b/ P q! s4 W0 m7 H: ?! g o
if (result == EDMA3_DRV_SOK)
. ]/ O+ D7 g4 B- [5 \- N
{
6 Q4 u* ^9 e; B& G' e6 t
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
. X; K- E* J( S: b! g
(EDMA3_RM_EventQueue)0,
' a. E% }* y) R! v" f& \6 n% @
&edma3_isr, NULL);
+ L% O" r8 y# H- t
}
% o, ]. S& r! l3 R8 N: M. R
3 R" Q+ \) w1 V7 j( s$ v8 q
if(result == EDMA3_DRV_SOK)
- H' u1 ], R9 C% p- [9 e4 I( _
{
7 A5 z7 }1 q8 }: I0 U6 ?
paramSet.srcBIdx = 0;
1 p+ Y9 q2 [# g5 l
paramSet.destBIdx = 1;
# G& _4 [2 {% R: W! c( |% g
paramSet.srcCIdx = 0;
6 |7 c. o! j8 X
paramSet.destCIdx = 0;
" q+ i% X: L4 u/ R$ Q( {# ~6 N- f( i
paramSet.aCnt = PING_PONG_ACNT;
& I/ p; ~0 o* `, j+ z1 n
paramSet.bCnt = PING_PONG_BCNT;
3 t$ I+ K' ]8 t* R$ l2 F% f
paramSet.cCnt = PING_PONG_CCNT;
/ l3 Z+ I$ X. o! N
. c: a* b7 E! [9 A0 j# `: J
/* For AB-synchronized transfers, BCNTRLD is not used. */
' w( w$ L4 `" j4 k! `7 ~$ ~
paramSet.bCntReload = PING_PONG_BCNT;
& c- B" t. T# H; g
Z: X4 ` D3 d8 x
/* Src in constant mode Dest in INCR modes */
9 H6 C( A1 r+ z1 q m! P
paramSet.opt &= 0xFFFFFFFDu;
4 c9 B: |6 |% d
//paramSet.opt &= 0xFFFFFFFCu;
5 ?) Q- s# @8 X
" _9 O8 c; c; U9 y& A% r
/* Program the TCC */
5 M! h5 D' n( K/ H3 \% C0 j
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
8 V' W! B u1 a6 N8 N
0 {/ z& l. ]8 e
/* Enable Intermediate & Final transfer completion interrupt */
. `9 ?* v& ]& Q$ A( z6 V6 w0 R
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
* [7 {* @( l: S1 ^
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
/ R' o5 B' N" w/ t) Y6 {& G" z
. x& `' x; e+ b$ `
/* AB Sync Transfer Mode */
9 T) A/ R2 c R% H; I% `! I
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
4 U/ l1 R5 b/ m# I3 }" e
8 A1 u p% o3 ]8 `1 }; _- J6 O
/* Program the source and dest addresses for master DMA channel */
6 r0 ^; I8 |/ \- i
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
; o5 U5 C, B3 i4 y
paramSet.destAddr = (uint32_t)(ping_buffer);
( G8 P7 M5 [$ Z- h: w
3 l7 y6 U, R u
/* Write to the master DMA channel first. */
' m6 A6 k0 i2 L( E8 v W
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
. B2 j- \( z/ h1 N) k
}
M) S! y/ I# l5 n: e
, Q! Z( @8 I" f: H D$ o) l, l
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
) I8 _) W4 Q: a( x% A
2 k9 J1 _. W: b0 m/ S5 x. X+ `, m
if(result == EDMA3_DRV_SOK)
& l9 Q8 S9 r$ Y+ Y
{
2 p1 R+ H; @ e7 T6 u s0 v
print2arm("edma3 driver init success.",0);
' w8 J3 D& y4 y: U1 C9 Z% U
}
, L o: C5 h" K) E
}
! C; F$ D# K* \( @0 u5 v+ n' \; d
9 G7 f( w) [- U, m `$ N
" `, R8 p9 \/ v/ r1 }6 d/ k
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
( C$ @. {* T7 K2 m4 X8 t0 i7 s" U
5 N- h6 t; R4 }6 x1 O- b
j6 e1 T# t# O7 h) R9 c: |
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
) v, j) Z! Q5 K, [. X, e' A$ l! X
每次DMA传输完成后都要再次使能传输
5 W% |) r6 E, C2 w" I. G
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4