标题: edma3中断只能进去一次 [打印本页] 作者: silent123 时间: 2015-4-22 22:01 标题: edma3中断只能进去一次 使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:6 v# h) p( a4 \1 B' F& W* a2 c
#define PING_PONG_ACNT 1# n% T: h( W% p. M1 ] W5 V8 h/ K
#define PING_PONG_BCNT 8*32*40 , f) L& ]( s0 p( C% f//#define PING_PONG_BCNT 1 1 \# G Y" m, [% V$ [$ q/ K4 [0 u#define PING_PONG_CCNT 17 ?0 u8 c" P: b6 N
#define MCASP_BASEADDR 0x01D00000 * @/ L' R* F7 S+ q. L1 G( H$ S b6 t#define Mcasp_RXEVENTQUE (0u) ( _. W- q% k% |8 ^8 ~ 6 F# @2 Z; \+ M' `1 f# D, |, U/* OPT Field specific defines */ H% ]4 ~# P; v/ [; D# E# V
#define OPT_SYNCDIM_SHIFT (0x00000002u) 3 Z5 D3 J' F' ]) j1 M6 W#define OPT_TCC_MASK (0x0003F000u) 0 u- o" f1 c, z#define OPT_TCC_SHIFT (0x0000000Cu) 7 s& T3 |% s4 I, [+ q#define OPT_ITCINTEN_SHIFT (0x00000015u) " b& w9 [7 {. `0 A#define OPT_TCINTEN_SHIFT (0x00000014u) & p$ z! @6 v3 a N8 ^" U 0 a3 b/ t. m& Q, D# G4 ^ b& tchar ping_buffer[PING_PONG_BCNT];. y. R# M1 v0 o2 g
char pong_buffer[PING_PONG_BCNT];) K F& \: D: X5 A5 d: J3 t: Y( q2 r
+ u, L) u& p! Y; ?
' f0 w, [: z1 q7 U8 p$ p: Y0 w, q" ~( ^7 U
1 [4 p) t) T, J K
static void ys_edma3_init() 3 t7 C. y- a; Z- P5 w4 \! m7 M{) S' I$ z8 H- k. F7 m9 [* c1 `
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};% K }7 @* g# v: p
EDMA3_DRV_Result result = EDMA3_DRV_SOK;- q; X. l( L. J+ D) A) X0 s
EDMA3_DRV_Handle hEdma; 5 ^$ \! E/ l# c4 u, X- H uint32_t chId = 0;+ o* e0 I i1 R: I
uint32_t tcc = 0;$ }( l4 z9 t9 V6 b
6 U1 G2 d' |0 F, k9 {; b
print2arm("edma3 driver init...",0); ' J( }3 G) t3 W' U* G1 c$ f2 P. o1 e3 G* e4 K2 S
hEdma = edma3init(0,&result);" ^( Y, _- H4 ~
if(hEdma) 5 ~/ q) ^7 C+ [9 M6 L) p( g {" D8 C4 l/ w- I6 i4 Z8 v0 Y
print2arm("edma3init() Passed.",0);, K9 X( E; l- k
} ]$ r- x$ @& ?' B+ X0 N5 u
else1 |1 D# V7 u# B0 g) h5 q1 g
{ + N' r0 c- S/ K5 y; b2 C print2arm("edma3init() Failed.",0);( ?7 {8 _9 z+ a. n" N* U
}3 a9 [1 | V" m6 B1 D* T* ?
, d6 p5 U6 n* Q! P* F if (result == EDMA3_DRV_SOK)8 X, R! ~2 Z S
{ & T7 e, H0 l7 ^ H% V: P4 _6 d result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,7 E l+ D- E, T$ q! @; g
(EDMA3_RM_EventQueue)0, 6 r% t) \+ t1 d &edma3_isr, NULL);; P& x* L# `! c. I9 c
} 5 L) X& U9 x: o3 P " S% T7 C' i0 | if(result == EDMA3_DRV_SOK) 3 X2 d. w- x6 M2 y; U8 V% `1 m3 @ { - p1 k& f' _- j2 n paramSet.srcBIdx = 0; 3 B2 F6 y6 S: r: f$ d6 R paramSet.destBIdx = 1;/ s2 x K0 p3 m' H Y
paramSet.srcCIdx = 0; ; X! n2 C5 B8 p( z6 \2 e1 i: g paramSet.destCIdx = 0; ' f; W! a5 g+ u2 Y; s& x paramSet.aCnt = PING_PONG_ACNT; 3 L3 m5 c% M* R' \5 Y paramSet.bCnt = PING_PONG_BCNT;; y, A* @3 Y+ ?$ O3 a7 C, F2 |
paramSet.cCnt = PING_PONG_CCNT;9 a. b x" j. p: j9 g: x1 G% M0 p' m
3 ]) ]" N" J2 ^$ l. u
/* For AB-synchronized transfers, BCNTRLD is not used. */ ! n$ }/ W3 |; r. J/ u) n paramSet.bCntReload = PING_PONG_BCNT; 8 j* g8 r6 p" t7 V; C9 T9 A , Y- S$ P3 x1 W8 ?. z+ z/ D& F& i /* Src in constant mode Dest in INCR modes */. G( l& R7 X! \' g/ W( u
paramSet.opt &= 0xFFFFFFFDu; 6 k ?4 K" G) o //paramSet.opt &= 0xFFFFFFFCu; 6 k I& [0 m* S. d1 O ! q P& v) D/ K1 r
/* Program the TCC */) z- |# C( Y0 x; r6 v
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK); ) G' A% c6 G& a2 W, e/ ? ; _% P' ]- T" N- p. n1 o /* Enable Intermediate & Final transfer completion interrupt */ + ^6 _4 M2 v v, S% d$ \$ J4 m paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT); , s0 K5 K# [: F paramSet.opt |= (1 << OPT_TCINTEN_SHIFT); ; f5 u# z7 m3 y: N6 H4 {3 X1 a1 g+ q2 ?: W% S- S
/* AB Sync Transfer Mode */ 1 t% j. S& h5 m) m4 Q paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT); ; o6 O+ N$ X1 j6 x& G5 z 4 h M v( B9 Q8 h' P
/* Program the source and dest addresses for master DMA channel */ D: P$ t- l: ]" Z
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);6 L9 q3 b7 W- @& ^3 J" m, ]
paramSet.destAddr = (uint32_t)(ping_buffer);6 L5 w+ z+ Z5 M( n0 L
/ a5 S0 ~( w! Z6 c8 j. e /* Write to the master DMA channel first. */0 g) [$ G. B" c: [
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);/ D D1 s6 |$ C! `8 H( I
} / j" Q( S B$ [- B z$ x6 J3 _1 a. E# \3 X
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);9 c# j3 C' J t3 v$ g! A
% F: D* p: U' N+ f0 x0 a: q* n if(result == EDMA3_DRV_SOK) $ d c% I- R; O8 s {9 Y! E3 n. ^# I# z' X4 p) B
print2arm("edma3 driver init success.",0); * H f F: U, u* k } $ D9 k# H9 |: K# s( ]- H
}( e4 w+ M2 p7 ~ p& q3 h# A! }; e
# d' A3 f, j; t- C$ w