嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
1 u! t# d& ?8 I# `, M3 j
#define PING_PONG_ACNT 1
- u) W n; Z" A+ {4 c
#define PING_PONG_BCNT 8*32*40
: ?( v7 f9 |9 w5 j
//#define PING_PONG_BCNT 1
2 g7 s& R3 ^* ]
#define PING_PONG_CCNT 1
: R1 v$ U* {# m" ]) i4 `
#define MCASP_BASEADDR 0x01D00000
) P8 b8 p- s: a" r! H) I0 I2 B. n
#define Mcasp_RXEVENTQUE (0u)
+ Q3 n& C5 u2 T, g/ v0 T
6 }1 Q& l% F" z) J, X
/* OPT Field specific defines */
; ~1 F7 L! w3 X( R M @
#define OPT_SYNCDIM_SHIFT (0x00000002u)
5 f, T) |# R0 T4 i9 `/ M$ D& A7 B
#define OPT_TCC_MASK (0x0003F000u)
, q7 |5 x, i. m7 _: N
#define OPT_TCC_SHIFT (0x0000000Cu)
: i4 G5 E! v8 l: L
#define OPT_ITCINTEN_SHIFT (0x00000015u)
) }, @6 m' [5 R1 m" J
#define OPT_TCINTEN_SHIFT (0x00000014u)
9 {, t$ [. @2 E- B9 M3 G
# y! }5 l9 ]+ P0 l. @
char ping_buffer[PING_PONG_BCNT];
k. X' m# s2 k% N( S- v- Y& } s
char pong_buffer[PING_PONG_BCNT];
5 h: }6 c) s% J; h6 K& F
, @8 K8 V5 H P: u2 x
2 }$ o. e; A: d. o
- Q; F# b9 T. i8 X
0 U3 Z2 j+ V# w# E+ t7 j
static void ys_edma3_init()
0 G. P0 _9 L; C8 ^3 L5 c+ j
{
+ v+ |; D$ t% _
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
4 p4 e, P V [5 h' {+ |
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
1 k1 G. I& C, Y
EDMA3_DRV_Handle hEdma;
& }& [$ a2 {0 D9 z4 J) ~/ s. I" p
uint32_t chId = 0;
# B; M: I j0 T# z! r1 V5 o
uint32_t tcc = 0;
0 @/ g% `- p( M2 l% x
' M$ C% z( W4 H
print2arm("edma3 driver init...",0);
* l& s4 T/ z' e: K) R/ p8 A
$ C' ^8 Z' Y$ K: Y9 V1 n* P
hEdma = edma3init(0,&result);
# J& |' I" Q- I7 e* M1 q
if(hEdma)
8 s- |5 H. g9 q3 Q
{
, i# ], k% I( K5 L' s8 C. b: s
print2arm("edma3init() Passed.",0);
4 m# V; [ ~% K5 J. U3 p0 ^; f
}
' A. ` w+ z/ Y* B1 M/ u; A0 y
else
+ ^; y4 p4 d+ Q- D
{
$ ?! g" B! g7 h( [( P
print2arm("edma3init() Failed.",0);
. `3 `/ h8 G: K. T- z! u$ s
}
! \. e3 z: G" @0 L
1 q6 J. i+ h& w3 o) x
if (result == EDMA3_DRV_SOK)
1 y" ^/ X% n: w
{
+ b( h4 Z7 ]- F. L& Y6 m
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
7 F) [* f! ~+ s. [8 |5 G, ]
(EDMA3_RM_EventQueue)0,
) P$ k1 L: z/ X2 i' G! P% D
&edma3_isr, NULL);
8 c% Q4 |( g/ b4 j. C6 ]
}
8 Q( B6 j) ? {1 l r# ^% H. h% G; @
3 f! E9 v- D5 k
if(result == EDMA3_DRV_SOK)
/ x4 u+ u" v) Y; k$ w: @. \" }
{
2 z3 ^! R9 Z, ~6 A
paramSet.srcBIdx = 0;
$ C7 g/ D- Q0 t6 t+ F9 x
paramSet.destBIdx = 1;
9 r! O6 q9 i9 `1 }1 f6 h
paramSet.srcCIdx = 0;
" [8 N. V; y( Z1 s) v
paramSet.destCIdx = 0;
' P8 V4 W1 K3 o
paramSet.aCnt = PING_PONG_ACNT;
4 o3 C4 w4 h3 Z! D
paramSet.bCnt = PING_PONG_BCNT;
8 V+ s) F1 C5 @% U3 t/ z
paramSet.cCnt = PING_PONG_CCNT;
+ o" g9 h" l; Z6 U0 E1 w/ _9 p
- ?6 i" ^9 O# X+ W F5 g% O
/* For AB-synchronized transfers, BCNTRLD is not used. */
) `3 `$ P! k4 z8 _/ W
paramSet.bCntReload = PING_PONG_BCNT;
9 i# c; R8 K0 n9 w6 n/ L2 m
8 u9 l% Z" \9 r- v
/* Src in constant mode Dest in INCR modes */
$ v( C! b. Y. x2 `- z5 U
paramSet.opt &= 0xFFFFFFFDu;
$ Q) O/ Q% z4 s2 U3 a! l3 B
//paramSet.opt &= 0xFFFFFFFCu;
`( ]1 c, i6 r
- C) x! O& \: s* m( O
/* Program the TCC */
# d2 X* I) S/ \. P: X( \
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
0 u% l0 j. U' {5 g# Z% d6 ?
3 C6 g. f" e* g( p, t( g7 s! Y( t
/* Enable Intermediate & Final transfer completion interrupt */
& B' f' \- A5 c0 D2 L! l
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
" y& ]8 B- _/ Y8 j6 g
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
6 L' }, O( q" _$ f3 ]/ w# P5 v
: D9 E+ m2 k& |
/* AB Sync Transfer Mode */
0 j* Z; c+ c! W# u8 a E# Q
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
! K1 J2 O* \3 Y
/ H5 e/ i% o: f4 K2 N
/* Program the source and dest addresses for master DMA channel */
- B0 y9 Z F E0 }
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
) I, J* K* q3 b! C. ]& f$ m
paramSet.destAddr = (uint32_t)(ping_buffer);
( j4 p/ B7 I: Z8 D5 }" g9 [' \
/ x# A* U0 o" h8 ?
/* Write to the master DMA channel first. */
, F; x% G7 L: O e& f; n4 X+ z
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
' s( w" m# }6 K6 L$ g5 Z$ {' a' h
}
( @9 b3 @6 z: g+ U0 A3 r
3 Z' [/ F+ _9 _1 b, Z- N( y
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. P! P3 R h5 ?0 Q: d+ T, F' | y
|" J8 e+ l a( e1 L& X* V4 j
if(result == EDMA3_DRV_SOK)
: E9 U2 U1 T' |( R" P0 W( Y
{
1 A9 F+ O) F- O# G1 @
print2arm("edma3 driver init success.",0);
& x& O- e- O/ W& ]% R( l
}
0 @2 {0 o; C% k* ]& _0 C+ Q: Z
}
* ^* r! c, o, {6 ?( O
6 }, E; u/ e( ]% E( ~
4 D: X. G/ |0 j0 `
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
9 A" ~( U" b6 Y6 y# g J
4 o' S- a r7 l0 h) i: W
8 b( c6 F2 `0 q& H4 [, f5 B
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
* h0 H0 `. U5 D6 N! k1 r
每次DMA传输完成后都要再次使能传输
. E8 i2 z7 J: S! w$ r! @0 J
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4