嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
3 s" ^: |- |% C$ m6 K
#define PING_PONG_ACNT 1
0 G% z- C& ~% Z8 a0 l$ s
#define PING_PONG_BCNT 8*32*40
3 e8 {2 m& ?8 u! ~. A. p
//#define PING_PONG_BCNT 1
- ?, d5 s9 a" d2 a$ A% t/ B. A: g
#define PING_PONG_CCNT 1
' ?% F4 I( K: S9 S, m( ` t" }
#define MCASP_BASEADDR 0x01D00000
/ V+ Z) w3 N4 k7 T, E1 l
#define Mcasp_RXEVENTQUE (0u)
- n, R. T8 a6 ~7 O8 m6 O
1 r, p4 }1 D6 o" Y5 G
/* OPT Field specific defines */
: c5 H0 i7 ^! I6 O
#define OPT_SYNCDIM_SHIFT (0x00000002u)
6 O2 u9 P& J1 \+ k0 q7 t: N
#define OPT_TCC_MASK (0x0003F000u)
8 i, ? C' K) Z9 p
#define OPT_TCC_SHIFT (0x0000000Cu)
* D5 L; N; \8 q. @$ g9 }& \! Y
#define OPT_ITCINTEN_SHIFT (0x00000015u)
# y# m6 \5 v# D9 b. ?3 X
#define OPT_TCINTEN_SHIFT (0x00000014u)
; d8 M% f" N$ f+ m3 H, j% _4 `
# N; s' q2 w" x- Q. V; i0 |# i7 @
char ping_buffer[PING_PONG_BCNT];
: t2 A) p& |9 q
char pong_buffer[PING_PONG_BCNT];
; K) k1 F8 E( V# O
+ Q7 F0 `( a# F+ q" k, ?
8 r& _" ^. t# b, K# ^. v) e
( e6 H% G' A3 q% p/ x1 b
( B5 X$ Z2 Z" A/ [, l
static void ys_edma3_init()
% |8 t4 U$ Q+ g) c. H
{
8 n7 R3 @# V8 |" J. y
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
# {7 S6 L i9 n9 a' i& `
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
# F- L2 i% `" @4 N4 ~
EDMA3_DRV_Handle hEdma;
5 m2 |* t; w0 D5 k! M
uint32_t chId = 0;
! B4 u! |0 O9 p, C2 r' z" q
uint32_t tcc = 0;
& j b; U, R8 _! T
4 K! Q; Z5 C& m9 b; c& A
print2arm("edma3 driver init...",0);
4 g% }3 p9 |. f9 k
2 e. K# o+ }- K4 h% N: P
hEdma = edma3init(0,&result);
; A) a* ^7 I* l' z$ |
if(hEdma)
% K- I$ R- _8 L; q5 H, G' p
{
1 c4 n A) _: D$ v/ W; z- V
print2arm("edma3init() Passed.",0);
/ ^# v$ R5 X( b; A I
}
: Z1 F0 F W: ^ `' |3 ^( P @1 [
else
+ a. V6 [- m8 W5 c% {
{
- e2 ~. i! }- a& O
print2arm("edma3init() Failed.",0);
1 _& v9 V$ J* j/ V8 M
}
( t+ B' u4 S x+ Q
3 f) g( ?" R; w: K- W" P
if (result == EDMA3_DRV_SOK)
9 w- ?$ o1 Q, Y X5 D K2 A
{
! @. b1 g( ]' j1 g G; t u( U
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
8 d# Q% G H, y1 N3 l
(EDMA3_RM_EventQueue)0,
: a2 D1 r- n$ j( q! w$ r
&edma3_isr, NULL);
6 i2 T( c- g, [7 g+ A! \# ?9 [8 O
}
/ ^6 V# T8 B1 a1 C, ~
1 k, c* l! G, V/ P
if(result == EDMA3_DRV_SOK)
' V& |1 E" T$ \$ Z
{
( t/ t9 U. z% T& Y- Q
paramSet.srcBIdx = 0;
( u& e# N% p) h
paramSet.destBIdx = 1;
8 x2 k& e5 j9 b& i
paramSet.srcCIdx = 0;
+ y) l$ M; e& f7 Y% o) c
paramSet.destCIdx = 0;
0 W, r5 q- l5 r; G! L
paramSet.aCnt = PING_PONG_ACNT;
1 b( D2 l! c1 X/ _
paramSet.bCnt = PING_PONG_BCNT;
, j5 X7 R7 O7 d) {' [' Q
paramSet.cCnt = PING_PONG_CCNT;
/ N) @. f1 d3 s7 S) u& k b' N
! G9 u& ^! C! x u7 ~# G
/* For AB-synchronized transfers, BCNTRLD is not used. */
/ v% b2 t" N6 G2 _' b) m% S
paramSet.bCntReload = PING_PONG_BCNT;
1 q, S# y8 q. H& G* j
" D9 W3 o+ R$ p" D# H P* L
/* Src in constant mode Dest in INCR modes */
1 \0 B. a. O7 @! x& J! K
paramSet.opt &= 0xFFFFFFFDu;
: i$ f$ x: F8 V) t* z/ o) }
//paramSet.opt &= 0xFFFFFFFCu;
" p0 g- G7 h+ v
4 V7 X! H4 c5 r" M! N3 H' u' m
/* Program the TCC */
4 D) C6 @9 _/ `4 [3 I1 V" i
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
1 U7 z( C6 K0 X( m5 X+ T/ {
# S/ S9 d" A* q- J' f
/* Enable Intermediate & Final transfer completion interrupt */
" D, {# v5 T% b8 P. }" F
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
b; C1 q( ^7 T) K3 h) L
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
* x! W8 s$ B+ v* J
6 b. i& z2 v7 h
/* AB Sync Transfer Mode */
! r f2 `) a, i4 j
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
9 {+ S/ {) b4 _) G
3 U5 [# F- C2 t
/* Program the source and dest addresses for master DMA channel */
3 d2 d; ]7 N$ p7 j" E2 _4 E. d+ C* b
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
' A+ k9 l* y* p
paramSet.destAddr = (uint32_t)(ping_buffer);
* i6 {9 f" j* l. ^
- T) ~& y/ {6 P" O. o! o" c9 n
/* Write to the master DMA channel first. */
# P' E" B5 q* O, B6 H$ Y
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
4 m# H( v5 g$ {; f" P
}
+ T# |5 I$ m5 K' h4 u- a
2 \; m, S: {+ t* H' R$ r
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
5 J [: z' N# w8 y. h m8 q3 g% y9 [
" [. n) D* L% r/ Q! U! [
if(result == EDMA3_DRV_SOK)
) w& @& A7 y0 [9 e7 K! O* g
{
% H' ^1 t$ O- ~- H( G# }. N& F
print2arm("edma3 driver init success.",0);
! N0 ?6 T I5 z% G0 w1 w
}
7 W* C( B. R/ r
}
# K) z ]2 ]( Q! F. m' D5 ]9 t
- v) D& O# d6 m( h- ^- k
4 h# H" q& k& L, `& @
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
. _9 y$ ]8 G9 z6 W, l2 @' Q
& W( s8 g1 B& G0 T6 k# J
) h$ N z" D9 }! e& e& b
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
& J5 U8 e+ @8 _# R' X# X8 U2 n7 O# h
每次DMA传输完成后都要再次使能传输
( x8 Y) Y3 E- @3 M4 o
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4