标题: edma3中断只能进去一次 [打印本页] 作者: silent123 时间: 2015-4-22 22:01 标题: edma3中断只能进去一次 使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下: # p. T y& f/ l# \0 b#define PING_PONG_ACNT 1 / A0 M! e8 X+ N5 a4 C1 a#define PING_PONG_BCNT 8*32*40 3 |3 Z1 t N8 n/ c' `0 ?' {
//#define PING_PONG_BCNT 1 3 Z) m7 v0 N( e#define PING_PONG_CCNT 1 ` ?. B9 m* |# h#define MCASP_BASEADDR 0x01D00000 0 ^+ a$ O% W' M$ g6 E$ H% {#define Mcasp_RXEVENTQUE (0u) / y( ^. h1 B- m: [% Y8 N! q % h5 w' ?8 ]- |$ B/* OPT Field specific defines */+ P% J6 G2 | D7 j" P
#define OPT_SYNCDIM_SHIFT (0x00000002u). i' _8 e5 R) y4 L3 x- t0 R7 k
#define OPT_TCC_MASK (0x0003F000u) 5 _, G1 B) ~9 z4 U8 v#define OPT_TCC_SHIFT (0x0000000Cu)0 W: U( l9 a) c/ G D7 O8 a. w
#define OPT_ITCINTEN_SHIFT (0x00000015u)! }( I" s' z& p7 m1 }
#define OPT_TCINTEN_SHIFT (0x00000014u) 2 v: V2 L7 `& s # Y! N( f- o6 f* d ~char ping_buffer[PING_PONG_BCNT]; % m& u( U, n# e9 E3 zchar pong_buffer[PING_PONG_BCNT]; Y6 ^+ \' s2 Z8 f( f7 m & A; |; T' O }; u+ k( O9 p3 d; `9 E) Q! e, U* v
: l ~+ x, W. m. b( j8 f& X 5 p3 u2 ]4 o b1 d) ~. O, Istatic void ys_edma3_init()9 W; {0 [# b9 A/ _ }
{ / c' M- J: j$ K* g. q( l% j EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0}; # Z6 V* n' F. S9 x( g EDMA3_DRV_Result result = EDMA3_DRV_SOK;& R/ T3 g. M0 i& X
EDMA3_DRV_Handle hEdma; " o. l' W% W) n uint32_t chId = 0;2 c% B& t3 [- ~5 m. ~0 n
uint32_t tcc = 0; q: P6 Z2 r/ A7 X8 w
9 K# R6 t( D6 p. v; W print2arm("edma3 driver init...",0); : D+ A1 g) p! s2 n0 r" o' r( s8 S0 u% v* c
hEdma = edma3init(0,&result);/ y' f6 i+ s# D1 I, k# ` x
if(hEdma)6 }/ L9 X' Q( T! `$ q' }
{8 [) `$ V5 s2 d* h9 t
print2arm("edma3init() Passed.",0);1 ~. ^% W, F3 a3 f& w" ~0 V! D
} 4 D! U) o8 @$ d0 V( X8 v0 w else" n1 l9 H! L5 t( b5 d- H! G
{ : M" T- \) \+ c U( | print2arm("edma3init() Failed.",0); 7 c: e- c! s/ u9 }. }" b- B0 l. _0 G+ u } $ r# b9 B9 j% b B s( U' @5 A {; G/ e: v% k+ Z% l7 N
if (result == EDMA3_DRV_SOK) * d+ w( v5 d- E: o: B2 s: X$ ^ { 9 N7 x, r; ^" N0 k* e) n* s1 z% P result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,$ m+ _- F2 w7 J3 v# g+ N& l8 w
(EDMA3_RM_EventQueue)0, . y$ V& z& F# L &edma3_isr, NULL);+ C! O$ _7 R+ T, } t9 n3 c
}' \+ C& d5 ~1 u6 |* c* T
/ Y3 [/ a: e. y- y! m" D3 t if(result == EDMA3_DRV_SOK) . D3 g j# J1 V3 ~. L0 i5 w { - F( _ N6 A; z( i& I7 B1 w$ c paramSet.srcBIdx = 0;& N' a# A! h X7 V, g0 |
paramSet.destBIdx = 1; $ n- z! [4 |9 \ paramSet.srcCIdx = 0; , @) N) {, X8 v paramSet.destCIdx = 0;2 V& n* x+ n O- @$ x
paramSet.aCnt = PING_PONG_ACNT;1 T# M9 b4 v6 L6 }- L3 J! N6 m
paramSet.bCnt = PING_PONG_BCNT; ; g n4 {9 c5 S1 p5 l2 I/ b# Z4 B paramSet.cCnt = PING_PONG_CCNT;* O P+ J, A$ e( P" W4 z1 z
6 G; D/ C0 F3 H+ ?1 F2 o2 o
/* For AB-synchronized transfers, BCNTRLD is not used. */& ^8 p) N+ k) ~
paramSet.bCntReload = PING_PONG_BCNT;: C5 K ]5 v2 F& U& N& V- r. L! t- u
+ r. l' C" l2 W: b/ ~* o
/* Src in constant mode Dest in INCR modes */ / b& S8 {( ]4 f paramSet.opt &= 0xFFFFFFFDu;! t8 M3 {' U6 F& z; Z
//paramSet.opt &= 0xFFFFFFFCu;! h) e* p3 }2 p& y; P4 Z: z
' Y. F, C% q: Q a$ n! m
/* Program the TCC */ : ]5 w/ m _5 e7 c6 Z' ~' E/ i paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK); + p t2 m7 V2 K 5 |" K2 V/ r' A4 W /* Enable Intermediate & Final transfer completion interrupt */ 7 Y4 W4 I: ^3 m- C% J" I" K" e paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT); : }4 @9 `! q4 h5 k3 k; Y paramSet.opt |= (1 << OPT_TCINTEN_SHIFT); . K1 V3 |- Z" o4 x, h! P / t( E/ Q9 P4 N6 Z1 Y6 S /* AB Sync Transfer Mode */4 w1 {5 o4 d- I5 H" w* } L; I
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);* n G2 \5 j9 g
% k. W& v$ T$ W& f$ K /* Program the source and dest addresses for master DMA channel */0 m1 K3 ~7 y: d) C
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C); * G+ K- a* Z' r5 d6 K4 U) a+ F9 x paramSet.destAddr = (uint32_t)(ping_buffer);6 [. o, |4 f9 A; v8 x
* u* e4 h/ q- S, L# _5 W: P /* Write to the master DMA channel first. */ / P6 b2 q8 A+ V+ U5 j result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet); 8 Y( V) @' D, U. F+ l# F9 U } ) G) r3 C3 b+ a( i 4 x& {5 o: V9 X0 d. a result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT); 9 x* O$ g& ~7 n8 b # ?1 b4 v5 y) p/ d% T
if(result == EDMA3_DRV_SOK) 2 z R. n/ h6 O' S
{. h d3 w& r: `8 b) X
print2arm("edma3 driver init success.",0);1 Q( @8 e9 ?0 q4 w% F0 r
} & Q$ i, M9 v5 |( }; `4 A}. C0 n, t* P5 G) ^$ I
( S3 m' _1 X- A F
( r, G( k9 J) s, ^3 V
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。# G8 H# @. t# ^. y& x: }# ^3 @
8 N9 l% M9 \& A; t" D
4 C9 P' ?) R& s作者: Lewis 时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输作者: silent123 时间: 2015-4-29 23:25