嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
; Y* T0 h6 v4 P3 T
#define PING_PONG_ACNT 1
+ Y+ r# k/ Y# y1 W: L; H: a
#define PING_PONG_BCNT 8*32*40
: X* d' J4 }3 G
//#define PING_PONG_BCNT 1
L- c) o* m! [ [( @8 d5 J
#define PING_PONG_CCNT 1
/ C5 ^0 \8 v0 g% N9 i
#define MCASP_BASEADDR 0x01D00000
6 M" ^- F S5 ?5 Z# d5 b! o( l9 \! s
#define Mcasp_RXEVENTQUE (0u)
& ? h/ h; j! D
# k( F& @. ?! x4 c
/* OPT Field specific defines */
% k6 P/ Q, n5 b* |. F8 M, b9 s
#define OPT_SYNCDIM_SHIFT (0x00000002u)
" B' V% Z4 H3 ~/ e: {, h K
#define OPT_TCC_MASK (0x0003F000u)
8 s' K" Y6 v8 ~! S
#define OPT_TCC_SHIFT (0x0000000Cu)
% c# W! h p. {, K# \
#define OPT_ITCINTEN_SHIFT (0x00000015u)
) W _5 x4 C- E; @2 \0 B6 e- w; X; z7 E2 n
#define OPT_TCINTEN_SHIFT (0x00000014u)
+ V8 w* E: ~( T- K6 N, w0 D+ i
+ w3 I4 Z% q0 F0 V8 @
char ping_buffer[PING_PONG_BCNT];
* [2 ^0 o D* P
char pong_buffer[PING_PONG_BCNT];
" ` H% j) |+ K8 k# _4 d& R. L
P5 [% k8 x: L- E; }7 |
% h) `& N0 R- I( o) s5 f' x$ B% k
. r5 |* M8 ?/ n
# k% D/ H: v/ f+ W" ]$ ]' p
static void ys_edma3_init()
# d' p0 q& U0 A4 Q9 L
{
/ f2 X% t( L, T+ R
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
+ k$ ?+ u# t% l, F& M3 A! `
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
2 ^" U0 T& L/ C
EDMA3_DRV_Handle hEdma;
9 b* H) e* {4 b. j! R% r- n. ~& n
uint32_t chId = 0;
" k, z* C \ O
uint32_t tcc = 0;
! s7 A$ H: X* I1 P8 J7 ]" Q2 t
# s! H# w& ^4 j- }) F
print2arm("edma3 driver init...",0);
0 l! s* E5 U t5 B: S4 ]) P
$ N# o! ]' i' D% v& R) q
hEdma = edma3init(0,&result);
0 V9 W% {" n* G+ D
if(hEdma)
& n" `7 v/ q$ U7 E' R& ^
{
, j* j1 @- s, W: e
print2arm("edma3init() Passed.",0);
2 s4 d- ~5 ~* V' _' C5 F
}
3 z- a6 D8 t! m3 h9 e4 l$ V7 J
else
# J! L' P6 n- Z2 f0 ^" z
{
9 u f' l0 v7 T) H) B6 \- ~
print2arm("edma3init() Failed.",0);
3 Q8 J5 W( R5 G0 j0 I2 f
}
_& r$ W# q3 Z5 c4 N/ a
( j( G& A7 w7 c4 F( q% }
if (result == EDMA3_DRV_SOK)
. u$ \$ B/ j+ j( w/ {/ h) g
{
. k: s7 r) N7 N
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
6 e8 Q9 y( }. a6 [, T! G
(EDMA3_RM_EventQueue)0,
- K% E1 G7 B7 U9 H
&edma3_isr, NULL);
, o% D2 K' K/ r6 w2 `' Z: l& ]( O. n
}
6 ]+ z1 q2 _% F' N# F& p- x* w
" @9 X8 p. A4 O* k; ?5 y$ | i
if(result == EDMA3_DRV_SOK)
7 e/ z7 q A0 `) h) V
{
5 n) ^ e; D& R3 s% h1 _, Y
paramSet.srcBIdx = 0;
8 ^$ A9 {. e/ N; q" l
paramSet.destBIdx = 1;
. S7 a" Q4 D1 I+ S' X* |' O! H f' Q
paramSet.srcCIdx = 0;
3 J! V6 _ A$ Q$ Z7 B$ G
paramSet.destCIdx = 0;
% ^/ M* b1 }7 ?5 |/ j" z1 [/ a
paramSet.aCnt = PING_PONG_ACNT;
0 E8 L/ U u& \9 ^5 w( v5 Y
paramSet.bCnt = PING_PONG_BCNT;
. V, V5 B+ w$ s6 ?' B+ z! ^3 o
paramSet.cCnt = PING_PONG_CCNT;
& }- c, i3 Q( O( @5 B' H; e: M1 `" f
5 m }5 `' {# i# D9 f; F& z/ I
/* For AB-synchronized transfers, BCNTRLD is not used. */
" I% g4 {" g9 V; G1 Q0 G
paramSet.bCntReload = PING_PONG_BCNT;
/ O: G3 i- W( k& _( t) l8 D. F
7 _) w) Q. N! P, P) l1 V' n1 v
/* Src in constant mode Dest in INCR modes */
l# Z! U: L2 r i+ o
paramSet.opt &= 0xFFFFFFFDu;
7 x- Q3 k# H, T; l
//paramSet.opt &= 0xFFFFFFFCu;
6 K7 L2 C A8 |. ~, V- m/ x: H M
6 ?' o8 \4 p. e: {0 l
/* Program the TCC */
# O0 j$ A5 o# {$ a3 B8 S p9 j* Z- d( ?
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
$ r: e5 f: _# m0 E3 b
# B5 h8 U# G& L9 _$ y; K# `
/* Enable Intermediate & Final transfer completion interrupt */
' s8 e/ g, c1 E# d6 y( p
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
8 v* x" x- t; {' p3 C4 W% i
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
8 K* D1 Z% `' F: M
( O. i- f M8 M: T7 P1 B) P* d( S
/* AB Sync Transfer Mode */
/ K$ f* @2 Z- M8 U' S
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
3 Z5 t5 g1 z3 I
) h, k. C8 c& E- t, k
/* Program the source and dest addresses for master DMA channel */
8 }1 h( t0 f" T& T6 a Y! ~
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
+ o! y* Q# d5 S! h$ i
paramSet.destAddr = (uint32_t)(ping_buffer);
1 Q/ ]2 _* P& e( _
+ k5 T; U+ [- c, w' b% z" t0 m, t
/* Write to the master DMA channel first. */
6 d) j0 e+ u8 ~0 m' W: k' c* Z
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
6 c$ e$ i! i/ l) C
}
$ d6 L* P! C& c1 x/ C0 S
% _8 ~# o- D0 t# b0 w
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
4 k+ h c+ [# u: X% n4 a' ]
' }3 d# Q X* g" @
if(result == EDMA3_DRV_SOK)
* T* ]" t0 ? V6 H0 i
{
, b" C, ?/ J" `2 C1 x) I( S! o
print2arm("edma3 driver init success.",0);
) }7 P w+ Q2 r. [
}
% D8 s+ b. M1 O+ s$ V2 [( v3 C
}
$ }1 P/ R/ \2 ?8 A
$ Q, B% y' E) C; ~% ~+ s2 q3 f" R, X
$ j- Y, Q# V2 c
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
0 ]1 j- C- @7 b0 i7 i
* i, G) k n, d
7 a6 z7 e7 _" P
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
: q! s# b0 F P1 I
每次DMA传输完成后都要再次使能传输
0 W6 P9 D# I# B9 D9 {0 d( H
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4