嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
% C `5 }8 a) t2 y* F: n: L
#define PING_PONG_ACNT 1
9 R6 P; E* H6 @" v
#define PING_PONG_BCNT 8*32*40
3 s2 V$ C* h- r. `+ j
//#define PING_PONG_BCNT 1
7 w7 d+ c0 e- T0 v) b& F% m1 @& M$ _
#define PING_PONG_CCNT 1
) p1 w2 m. }; M- b% e: X! v
#define MCASP_BASEADDR 0x01D00000
. X- C4 S7 t* M
#define Mcasp_RXEVENTQUE (0u)
9 Z6 l: D) @8 @
& S$ p1 N3 X3 _. y$ G0 G
/* OPT Field specific defines */
& |' C o( c/ i8 R5 R+ O5 n0 s
#define OPT_SYNCDIM_SHIFT (0x00000002u)
* g6 v/ e' Y/ q. Z
#define OPT_TCC_MASK (0x0003F000u)
% C. w' Y8 \& A" m( M
#define OPT_TCC_SHIFT (0x0000000Cu)
, Y7 t3 e4 ?# Z6 X% Z* Q
#define OPT_ITCINTEN_SHIFT (0x00000015u)
8 D5 `4 Q, b8 \
#define OPT_TCINTEN_SHIFT (0x00000014u)
}" W9 O. Y3 l& r+ v8 G9 Y# E7 E
5 r* x& @+ m1 I) l& }
char ping_buffer[PING_PONG_BCNT];
2 t$ U8 h* B) ^5 w+ P* y7 w5 _/ J
char pong_buffer[PING_PONG_BCNT];
$ x9 i4 m* ] i; ~
S% q( I+ u8 e! C
; `" ^) l% Y' t+ y
! J; ^9 f4 N9 a) F4 J) m L& X$ G
, w" z8 A/ ?' B: T2 v. s3 \
static void ys_edma3_init()
% M6 [7 h F7 j% [
{
! s8 I( W8 h* y% b; L% _( T% Z
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
- y2 U8 W" j. {2 C' u2 W
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
$ Q' @( }3 j6 c! D- t# X- U
EDMA3_DRV_Handle hEdma;
( M! |% P; C3 y5 v6 f: b5 E( @- I
uint32_t chId = 0;
: [; G, O# W/ m) T
uint32_t tcc = 0;
: B3 G* L# b! ?* U: s& Z# g" @
; F: F9 I. ^: I. S5 ` x
print2arm("edma3 driver init...",0);
; Z2 T5 m/ B* x( j3 x d+ y3 k
$ I4 o# e+ B# s& y2 C6 k$ x
hEdma = edma3init(0,&result);
' g' O" h/ W3 z
if(hEdma)
9 j3 G9 V+ s! L2 {
{
# _. K" `# h3 i, c: _
print2arm("edma3init() Passed.",0);
+ T0 n2 K& `3 j; ^. n3 @! N2 {
}
8 o! E4 X6 y3 C3 r* [; W+ N
else
6 K- D/ S) @7 U0 |6 D
{
* ?$ t2 ]1 ?& Q# V
print2arm("edma3init() Failed.",0);
4 D! Z+ T( P! }0 H% C- X' w
}
+ i3 N( \, E. C* K/ P
& @5 m* p2 F% A$ L6 W
if (result == EDMA3_DRV_SOK)
" Z$ z i8 N; E! N( Z0 P. a
{
7 L- {: ^7 q/ E- N" l
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
% ~6 S4 r' [" z5 U/ p) v
(EDMA3_RM_EventQueue)0,
! s% c( U( s" k# l F
&edma3_isr, NULL);
7 l/ }" e8 [4 v/ R( N9 N9 A% E! H' B, d
}
; C. b- e0 N( ~+ o4 j% h
0 p T3 s: B: w* ?0 D
if(result == EDMA3_DRV_SOK)
9 h3 C* w8 |2 C. b6 h# c: ?$ M
{
# y) B9 p7 K( R, m
paramSet.srcBIdx = 0;
5 d' y5 m& h- F' X; a" t0 W% j
paramSet.destBIdx = 1;
; ^ b4 s4 K7 G, j
paramSet.srcCIdx = 0;
A' k- _0 g' F: ~3 ^4 _
paramSet.destCIdx = 0;
, N7 I9 P# J- q
paramSet.aCnt = PING_PONG_ACNT;
. K" q9 e" r7 p8 T5 ]
paramSet.bCnt = PING_PONG_BCNT;
( `& A/ l8 a. v9 I& O5 o2 s S; x
paramSet.cCnt = PING_PONG_CCNT;
6 U, y* C; `1 G% h8 f4 Z/ n
) u# U. g6 C c( Y2 Q
/* For AB-synchronized transfers, BCNTRLD is not used. */
5 i: |2 R! `# V# z8 ?* o* f) v+ S2 g
paramSet.bCntReload = PING_PONG_BCNT;
3 w/ C+ a# l7 |/ f
- N& G5 s9 s# l) j& W! N! }% K3 H6 Z
/* Src in constant mode Dest in INCR modes */
1 V# c- h+ g- U0 v
paramSet.opt &= 0xFFFFFFFDu;
0 _# ~$ F# Z6 _. i# z1 K
//paramSet.opt &= 0xFFFFFFFCu;
5 J+ N& ~; P) n
* B4 A; P& |+ Q+ L8 t8 V% F
/* Program the TCC */
. S9 ~) A: T0 w: m+ e
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
' ]- d, {) O8 n) w+ @5 O( |
4 x* e: @+ [, y1 \# M- p
/* Enable Intermediate & Final transfer completion interrupt */
! t6 J1 d8 d9 |& e) P2 @' a7 H
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
( p# d4 z2 {0 P# w. m
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
3 ^* C% |; S% @* g, U) U- [9 R! A6 ]
" U4 O4 v t% [# ]; V# v; w
/* AB Sync Transfer Mode */
- ]6 p% w: L. B5 o8 r
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ ^5 R! X6 \; W2 V( D& ~
0 \, s/ b4 u8 o
/* Program the source and dest addresses for master DMA channel */
! {7 ^5 H& G3 w, V: b% X
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
9 I c& K- {/ [1 c+ E" l
paramSet.destAddr = (uint32_t)(ping_buffer);
. K+ ]3 B& ]. ^5 p. L
) t% y( W9 Y7 N8 G6 F: t" L8 [1 T
/* Write to the master DMA channel first. */
1 ~# y' |' v6 p0 x" t* Z2 c9 y
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
0 t2 S0 [! G: t( ?3 p& u6 j2 t
}
0 |+ D& B! n. ~6 i7 c) C9 `" T; o2 L
2 `! N- B9 a1 c9 @$ l0 m
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. ~: ^! }, \: W8 l4 W
* g( F [) Z& I9 k. h. F
if(result == EDMA3_DRV_SOK)
4 B' y8 |" N% }3 b% p# p$ Q a$ @" o) J
{
+ X1 \- Q% \- ?& t% K. g1 w/ }0 I' [ A
print2arm("edma3 driver init success.",0);
& B3 j; L9 g: h7 ?* h3 O3 k$ \. b
}
# |8 X- c( z. d/ |5 y! O5 H
}
. @$ q9 p9 E. T, M5 G; {; q* }2 {
/ h V% H! [" h# P
$ {) x8 y6 a' _* f: W' j5 W
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
2 p# L& `7 j3 j6 r
* k; z5 r: c! [5 d% c A0 D
6 O) F, m, Z+ \2 h) J
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
- v) |! C; Y8 B0 u
每次DMA传输完成后都要再次使能传输
" C5 {+ e: t, ]! @. X, Y. m) r
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4