嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
6 f0 h% F2 i& n- Z/ I6 a
#define PING_PONG_ACNT 1
, w! I: W, o8 O. Z, f: }, K6 a
#define PING_PONG_BCNT 8*32*40
9 ]( E+ T2 o7 j b# m
//#define PING_PONG_BCNT 1
; |; M% ~8 v' N: I$ @6 r. p
#define PING_PONG_CCNT 1
+ Z- ~4 L& e) _* N. b8 H
#define MCASP_BASEADDR 0x01D00000
8 i; z0 Z& ` g7 F1 v
#define Mcasp_RXEVENTQUE (0u)
- J! }- E* W w7 B& [8 C, ?" T* G
2 {4 ^* x& c# t2 V& s0 X
/* OPT Field specific defines */
- f* g, i6 L1 x/ e
#define OPT_SYNCDIM_SHIFT (0x00000002u)
5 p7 W3 d) G( u) |7 v; ]
#define OPT_TCC_MASK (0x0003F000u)
: Y! D5 {! Z$ g
#define OPT_TCC_SHIFT (0x0000000Cu)
& j( @# [+ m7 O" X6 m# q0 l5 _% t
#define OPT_ITCINTEN_SHIFT (0x00000015u)
0 I" i K$ o8 G
#define OPT_TCINTEN_SHIFT (0x00000014u)
' X- A6 P$ }; @7 @- w$ J
`, c0 c, _8 B; K* v4 R3 d
char ping_buffer[PING_PONG_BCNT];
- n4 s, k+ H7 Q/ o
char pong_buffer[PING_PONG_BCNT];
2 V3 s4 G! J" |
. M% e8 x- J% Y- ^4 k0 r) k
R$ T7 W5 f0 _$ C
+ K4 i6 X+ t; R# J
: ~ W# l; Y, |1 Q
static void ys_edma3_init()
* y. |, O$ F" C
{
" F" N. B; A9 V0 ~
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
# `( z+ v, p9 \
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
& w0 D) N1 |' A. _, n: A
EDMA3_DRV_Handle hEdma;
7 b0 h/ ~8 l: I$ l: e
uint32_t chId = 0;
- l! Q! ?* O, c
uint32_t tcc = 0;
# f" A9 S% {& f7 ]. S
0 n W0 x" X' n7 i
print2arm("edma3 driver init...",0);
* m3 q; y A# ]
% p1 e# }! Q9 ]
hEdma = edma3init(0,&result);
! y0 h a+ p( r5 w
if(hEdma)
: u, A: b1 I2 A6 I' C3 Y" P
{
" ^# N5 B ]9 o. V
print2arm("edma3init() Passed.",0);
1 N& Q( q) Z. v9 U
}
# i. q5 _1 V: z1 x1 k
else
# _2 c/ I, ~3 g, X( T
{
6 V7 M; i1 x7 l5 Z1 _: \7 t
print2arm("edma3init() Failed.",0);
y7 r* `( U7 ?5 ~" K' y& I
}
, N+ l( R6 D2 _ j9 p4 l
- k) H6 `3 ?, y5 t
if (result == EDMA3_DRV_SOK)
3 ]$ G' M( V f0 b% l" K8 n
{
& |% N) U7 T) j( a7 W, h
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
. ]6 j7 |) H, Z3 E- f
(EDMA3_RM_EventQueue)0,
* l- \. o8 _ q s. F$ p- Q/ x: g1 W' a
&edma3_isr, NULL);
% p# N V, d5 T3 v/ s; A
}
8 e% |# N6 J" K
+ @# d3 k: S% Q3 m
if(result == EDMA3_DRV_SOK)
9 }' u6 @! F5 w+ f
{
: D1 M# C9 `$ Q* l1 o, l
paramSet.srcBIdx = 0;
$ }* }' f2 d" b3 w: n! q r7 o
paramSet.destBIdx = 1;
. ^0 z$ M- r7 d9 b2 [- N' m
paramSet.srcCIdx = 0;
) f/ [+ c: K' ?- X% d0 E' n3 a
paramSet.destCIdx = 0;
! ] M. v/ ]" e/ J4 D1 Z2 p
paramSet.aCnt = PING_PONG_ACNT;
! x' W" j; O- H5 E
paramSet.bCnt = PING_PONG_BCNT;
1 Z- u0 P1 ]; {& t6 [9 q
paramSet.cCnt = PING_PONG_CCNT;
8 `% I' t! s* D" L/ c5 {8 b' [5 R9 D
% u( n+ y+ ?# ~ O1 u, ^' b
/* For AB-synchronized transfers, BCNTRLD is not used. */
% k% N" N& D9 M, J; |8 w: c& m$ X
paramSet.bCntReload = PING_PONG_BCNT;
3 {9 B( K' s L; G& q
2 \) H2 ]4 e$ H6 [, f$ I
/* Src in constant mode Dest in INCR modes */
' l2 X6 }3 }5 Q# t. q8 a* ~2 k- d% P: i
paramSet.opt &= 0xFFFFFFFDu;
6 {6 B1 n- m& Z! c3 `. F0 k4 P
//paramSet.opt &= 0xFFFFFFFCu;
+ w+ V. U9 Y. ^$ D4 K
) L0 ]2 y8 _/ L8 _# b) k
/* Program the TCC */
4 } `- ~, J) k1 a
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
7 n' N& x% @: ]3 e+ e
1 p* ? c( f4 {1 N5 M
/* Enable Intermediate & Final transfer completion interrupt */
! L) P& @5 w- {
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
% o4 ?, X! O: Q2 _
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
& y; k" V% d( C2 |& l+ T/ g' A
1 p5 }' P! F/ x! @/ I3 G
/* AB Sync Transfer Mode */
, w2 S5 ^- d/ `8 ~# L
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
# S R3 A& d3 f, A: [
/ f* \7 V* n& v# n/ O
/* Program the source and dest addresses for master DMA channel */
3 r- q6 ^; r% z4 z
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
" a! @' `% s6 Y6 s
paramSet.destAddr = (uint32_t)(ping_buffer);
8 ^" _! a3 ^7 @; a4 @1 l
% |5 `# r/ V- W) a4 [
/* Write to the master DMA channel first. */
, { l# @: Z5 E2 c
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
) D) o2 b8 |' X3 P8 ?
}
" l7 b+ ^3 |. x$ X8 [6 Z) G
" Y7 \" I; K# i6 B4 u$ A
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
! |/ y3 D, W6 k0 Y
y! B) I& d8 i7 Q1 p8 g7 K) K. E
if(result == EDMA3_DRV_SOK)
; b: y( a$ o8 V; K5 p
{
1 e/ Y0 C. O% d1 F9 I! B
print2arm("edma3 driver init success.",0);
; L8 }; V6 Z9 P5 ]2 E9 T7 J9 {
}
. g$ N9 c1 E) l: Y1 R1 }
}
8 V: _0 X/ q3 U0 I4 O& y" i
4 h# L( c) {1 p1 z, b, R
) J% y1 ]1 B- v$ ~
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
) c9 ?/ H5 y% K& q- C0 Y2 l
7 J! b0 ]; }. i
% A5 I* G3 Q8 |( y+ H+ T3 o
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
% c6 {: L; N* P/ [: r
每次DMA传输完成后都要再次使能传输
3 ]8 {* k% A( ^6 P. `1 j; n
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4