嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
8 n: |/ Y5 c# B7 c; p* k& x
#define PING_PONG_ACNT 1
7 a0 P% S- S+ _$ P9 H
#define PING_PONG_BCNT 8*32*40
2 a$ A% V, e ?4 O: `; E
//#define PING_PONG_BCNT 1
# R: X' Q! A! B
#define PING_PONG_CCNT 1
7 o3 z7 U! ~6 u3 X1 o
#define MCASP_BASEADDR 0x01D00000
) G7 p/ e& o3 G" j1 t2 [; C
#define Mcasp_RXEVENTQUE (0u)
8 y, a8 s, |& O9 I+ e7 ~: d
" j J+ D* o E( i4 m. I
/* OPT Field specific defines */
4 c8 p4 o' f( O! O
#define OPT_SYNCDIM_SHIFT (0x00000002u)
$ K& M) a" ~6 N! \
#define OPT_TCC_MASK (0x0003F000u)
! z2 q- v2 I& K9 m8 B6 M% m
#define OPT_TCC_SHIFT (0x0000000Cu)
) i( z R# `% C1 X q
#define OPT_ITCINTEN_SHIFT (0x00000015u)
: X$ D5 t" o1 O2 i3 s' G* H k0 U
#define OPT_TCINTEN_SHIFT (0x00000014u)
) v+ A/ u9 X S. U
9 h: L) \3 c! K0 B+ I m% P! u' K
char ping_buffer[PING_PONG_BCNT];
4 Y& K9 b4 D6 `" g
char pong_buffer[PING_PONG_BCNT];
8 K6 {* @% q9 C' m! U1 f
$ F4 M9 A- m0 m2 Q( @7 m
: ~- P1 i% u& }
0 _; \9 d; ]. M, `- g
" z( }5 U! ]% ~* v1 L- B
static void ys_edma3_init()
1 f) D: d! X% D/ F
{
5 u, }, O% G) `
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
2 _1 [0 O4 q# o, N( \" K# f
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
7 h2 U) h# V. u1 k! z( k1 I
EDMA3_DRV_Handle hEdma;
' Q5 d3 `" w; K2 @, J1 x
uint32_t chId = 0;
; Y2 F0 T# Q; j1 G9 z' s! [3 V
uint32_t tcc = 0;
/ C Q& S8 N; f& o: |" p
3 {( X0 `7 q& E4 b/ j
print2arm("edma3 driver init...",0);
5 ] t( D: T: o) \
8 Z: }% ^/ o3 r/ q
hEdma = edma3init(0,&result);
7 a D0 o6 R' E& Z
if(hEdma)
% k. V: S3 J- w% r8 m
{
' t, H0 m* t1 M9 x
print2arm("edma3init() Passed.",0);
0 q1 s& V$ r. v2 [& U y( a
}
3 p3 y6 U+ M" }& C4 t! P! T; [
else
. P, C* A" G$ ~; Y
{
- A- i' f0 G7 y2 x
print2arm("edma3init() Failed.",0);
k3 M! u# Z9 W0 Y; w) X) l- O, U
}
; M- O7 Q5 X) Z s5 v( j, Q
$ Q2 |" G1 [2 y n7 [9 A6 K3 {5 {8 I C
if (result == EDMA3_DRV_SOK)
4 ]8 `+ ]% Q5 l/ U; u) j% Q
{
/ g: L; v M/ l" a
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
' n3 ~+ z, k. ~( H8 m
(EDMA3_RM_EventQueue)0,
& x& X# h' B* b6 Q$ Q0 |9 ?5 ]7 Z' [
&edma3_isr, NULL);
2 V! ]+ {4 L/ j
}
) u$ { S& r; B0 C: k" y' P: F7 H& B
5 Q( r# C4 d3 ^
if(result == EDMA3_DRV_SOK)
5 C* D( g& C! O. o- ^
{
+ ?) T" L# y; ^" x# X& U1 Q
paramSet.srcBIdx = 0;
5 A9 t' F% p1 x) F' r
paramSet.destBIdx = 1;
& e" }* R1 J" r6 F1 K0 l
paramSet.srcCIdx = 0;
' E; h2 r, k! H* o
paramSet.destCIdx = 0;
9 p+ F [+ \3 V
paramSet.aCnt = PING_PONG_ACNT;
) C( }5 M9 ^, Q
paramSet.bCnt = PING_PONG_BCNT;
$ E$ D4 ~7 ^+ K* v% C0 t
paramSet.cCnt = PING_PONG_CCNT;
+ M+ n# u& g+ J" W2 i
- v+ }3 E F) k
/* For AB-synchronized transfers, BCNTRLD is not used. */
5 O; i' x1 u. E; b. C
paramSet.bCntReload = PING_PONG_BCNT;
, H( n" g% z+ v- ~
* H# {" T; u8 A3 {0 U" V
/* Src in constant mode Dest in INCR modes */
6 A3 c0 A- A2 q
paramSet.opt &= 0xFFFFFFFDu;
7 s( J$ i5 K/ u9 j
//paramSet.opt &= 0xFFFFFFFCu;
9 x y: j @6 _3 W- q# I- D
& ^2 B( d& R& C9 J0 H, @+ [
/* Program the TCC */
4 v1 A- A9 h9 z0 z$ O( t- u% u
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
$ z3 ~/ V3 d1 ]) x
. k( h: @/ @; I" {7 B& z4 l
/* Enable Intermediate & Final transfer completion interrupt */
6 ^0 I: U) @ w9 P. ?3 M% W
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
7 n2 @# j4 z t' m1 s, D
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
2 V: Z9 S1 t0 o1 y% U( a" I4 b
- J! i) f& J: i: P! {2 i! g
/* AB Sync Transfer Mode */
1 G* K5 B: U0 `( R3 S
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
X5 @. _6 M' @
( J% Y3 M% p0 q+ @( `% r+ C. a
/* Program the source and dest addresses for master DMA channel */
6 \5 c, T, [' a: w8 y
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
. H( w% ^7 H! x5 G
paramSet.destAddr = (uint32_t)(ping_buffer);
! ?6 B- n' y" u) s& [7 w
# n7 O4 _/ i: B: v* i
/* Write to the master DMA channel first. */
! z5 d" t7 K# q, s, A0 }& K' P
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
" j9 D+ N0 D, a! W$ M- a
}
1 T5 F8 B2 u9 r- { t7 j9 i" T
1 ~4 X& J8 m4 j9 i
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
$ Z' }. ?! b" g9 n- \
* n; s$ I G2 o- h( R: O
if(result == EDMA3_DRV_SOK)
* n: e, M9 i) ^9 |: D5 X2 j
{
, g+ M" ?' U3 j8 k! A; l
print2arm("edma3 driver init success.",0);
9 f w6 a" a' X/ g0 ?
}
& o6 F) ]4 }4 V5 N3 x4 {
}
$ d8 ]3 t' V. D* @! V
$ E1 k$ ]% I- w" R4 A) M6 O
+ ]0 |( g. n: C! J2 ?1 Q% X
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
) ~- A* Z/ k$ c& Z: d- U% X- e
& v( F% n) s( S, s# x2 H, t
2 B7 _+ h/ P6 y h5 T1 l2 f2 X% ~: ?# B
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
% z9 `6 C9 [) ]7 T! k0 K2 g
每次DMA传输完成后都要再次使能传输
8 E' R5 m3 @: V& i& E" ?/ N
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4