嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
( f! _& E) V3 ]- B
#define PING_PONG_ACNT 1
6 S, X/ U, `; M
#define PING_PONG_BCNT 8*32*40
) |; t4 }6 Q! Z( V5 K4 n( Y
//#define PING_PONG_BCNT 1
+ r5 ?$ {6 L, }/ a# ]
#define PING_PONG_CCNT 1
, M' @( H5 ]8 S) C, I
#define MCASP_BASEADDR 0x01D00000
1 O i' |4 L" z, W2 _. u2 m# v
#define Mcasp_RXEVENTQUE (0u)
: k% o/ q* | \
0 F `) d# F: @! b
/* OPT Field specific defines */
% R. p T* N" O* e3 Y# b3 d
#define OPT_SYNCDIM_SHIFT (0x00000002u)
% s! @- k1 ~8 v5 B8 F0 @
#define OPT_TCC_MASK (0x0003F000u)
H# J- M" i( z, n8 u* M
#define OPT_TCC_SHIFT (0x0000000Cu)
2 T) A& T) W8 k w- A- J
#define OPT_ITCINTEN_SHIFT (0x00000015u)
# R( }/ H; Z2 _) v# M/ m3 j
#define OPT_TCINTEN_SHIFT (0x00000014u)
, K+ T! Z( h5 ^: S
* d, L: v$ h k
char ping_buffer[PING_PONG_BCNT];
; [( L+ F. V; s+ O) v' }
char pong_buffer[PING_PONG_BCNT];
4 A( j1 ]0 Q- t9 {' e; s+ y
, f5 q; I0 `, k: i
; E5 N! s: R5 c. A! O- C$ z
+ i$ T( I9 W8 [$ V6 \6 N, e
% V$ ]4 r7 B. p' W3 U! G, H- b
static void ys_edma3_init()
# ]( X( ^( G! D* Y! U% C4 V
{
4 _( ?$ ~% |& Q- b2 [! g9 R, c+ ~
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
5 F9 B/ K ]: @# U7 ]6 g
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
8 @6 V) y: {8 r* N3 A }2 v
EDMA3_DRV_Handle hEdma;
! N! ?& \8 V0 d; K2 H
uint32_t chId = 0;
& n( K1 I% u/ c. s/ Y
uint32_t tcc = 0;
+ s* l+ B0 o$ ]' q" U
, C0 z# W+ ]- g
print2arm("edma3 driver init...",0);
4 P2 D% V" j3 }& G7 q
+ B7 ^ A* X8 F( W
hEdma = edma3init(0,&result);
9 _/ z n1 U" O' y5 k7 g* v1 f
if(hEdma)
2 V8 z0 J4 X/ g" R) z
{
# F9 j' e" O0 @* U
print2arm("edma3init() Passed.",0);
8 W' T/ k; F; O# R5 a
}
) P3 p6 r% h! L0 \8 h0 {, e
else
& |+ G, C* r$ H3 M& n2 F6 b# ]
{
0 W2 d: b8 T0 Y9 P) h3 h; ^
print2arm("edma3init() Failed.",0);
' e6 b/ w( c/ n2 l+ y/ b0 G: D
}
% v, B; w/ d. b: N* d1 y
& h9 z8 E1 V" `
if (result == EDMA3_DRV_SOK)
- B5 k) d! b; {- q- O+ s& K
{
2 s8 a" {+ G/ t3 v* J: k4 D# y
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
: p3 u% _8 q0 ~$ k1 c
(EDMA3_RM_EventQueue)0,
A6 b ^; Z/ \1 a8 |
&edma3_isr, NULL);
" l- ~) `! P0 F3 u
}
4 ]5 g6 `4 [5 r
9 i# ]1 k+ ~ N. |: \: w
if(result == EDMA3_DRV_SOK)
! D% x4 b$ ]/ `! x( i- R, B" J( v
{
5 k9 \2 T; U) v1 f
paramSet.srcBIdx = 0;
2 ~9 @- _' t r: @
paramSet.destBIdx = 1;
* X0 s7 |* ~( V: S: T0 Z
paramSet.srcCIdx = 0;
+ U& ^( @# p6 M8 I% a
paramSet.destCIdx = 0;
+ A ~5 {/ O. c+ J c) O0 X3 ]4 V( \) L2 V
paramSet.aCnt = PING_PONG_ACNT;
, S0 E5 I: h, T
paramSet.bCnt = PING_PONG_BCNT;
+ Y: [3 p6 U, b% r
paramSet.cCnt = PING_PONG_CCNT;
! ?' j9 R# |1 T
9 k- n9 ?/ k& q: E6 M5 a4 u
/* For AB-synchronized transfers, BCNTRLD is not used. */
; m' e) I. g: N6 a7 t7 g) h6 C
paramSet.bCntReload = PING_PONG_BCNT;
+ e; ~, ^. j& }
' U! w0 l1 T7 _7 a
/* Src in constant mode Dest in INCR modes */
. Y! V# u- }& Z$ |" h
paramSet.opt &= 0xFFFFFFFDu;
8 Z j+ n! I6 o% r+ m
//paramSet.opt &= 0xFFFFFFFCu;
6 D) B8 {& I \" g, b
7 `. Z0 [" P7 Y, T
/* Program the TCC */
1 l) R- E g, p8 [' C* Y6 v N
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 Q0 X: m. l- o6 Q* W, w4 O6 ]
, Q% T' E, ^$ Q2 F d% S
/* Enable Intermediate & Final transfer completion interrupt */
8 o. I/ Y: `1 z- J
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
+ \0 {% k w4 P0 C7 z$ W7 Q
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
# J$ @; }- v' {4 [' ^7 w
+ f @, K' p0 P0 P! t! g& w' u
/* AB Sync Transfer Mode */
8 ~* n' t6 `# U* O! e+ c: n
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
' `' Y/ ?3 x9 W! O! P* `
& {' F, T8 C; N
/* Program the source and dest addresses for master DMA channel */
! e$ R, ?6 t1 s) ]
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
- I0 I) R) d* K; F0 n
paramSet.destAddr = (uint32_t)(ping_buffer);
* M+ L% f( r2 ^, ~
6 r$ S: w2 K% P7 K9 v
/* Write to the master DMA channel first. */
4 ?6 p6 }: y( S' o& W, X
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
: U9 ?! Z$ J7 T& H% m A
}
w* a2 g' o9 S# ~) i |
; W# Q/ I- o: g- U
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
7 V* F$ ~4 c0 u( d4 b8 e/ Y& b2 \
3 d( y8 S+ m% B& F7 g6 _
if(result == EDMA3_DRV_SOK)
6 B; H% P n; [' [
{
% ]6 e }8 Z6 u @
print2arm("edma3 driver init success.",0);
+ l( ^8 I- U% M3 X! r# n% H; z) N
}
$ k0 O5 V" m0 p( d9 X: I
}
B4 W6 P) D5 F7 {: B
0 E% y5 g4 O+ L) L! a
6 P6 `+ o! Q4 g0 ~4 z# j5 {: H
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
E- [4 h3 i- c* s3 V
3 ]6 @& ^4 b0 e* v4 w
7 A( G3 z3 u1 t7 p9 d) O
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
0 _9 q5 \ d% O, J$ R: J: @0 S5 x. [! e
每次DMA传输完成后都要再次使能传输
7 I6 y" T$ X# r' k' j" X% P5 h" [
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4