标题: edma3中断只能进去一次 [打印本页] 作者: silent123 时间: 2015-4-22 22:01 标题: edma3中断只能进去一次 使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下: / G3 R5 `: u2 W6 H#define PING_PONG_ACNT 13 ]4 R% J# w4 W9 G1 ~, Y
#define PING_PONG_BCNT 8*32*40 - p) `/ n% Q; V/ }# e k' k
//#define PING_PONG_BCNT 1 * x) T( ~0 A8 y: b
#define PING_PONG_CCNT 1 7 ^! n/ s" o/ _6 f( ?5 X9 R5 |#define MCASP_BASEADDR 0x01D00000% u2 i7 r0 z1 c& Z0 M
#define Mcasp_RXEVENTQUE (0u)4 K. x6 ?& ?7 g
. C7 H7 _' E$ R7 Z. p: m4 f; V/* OPT Field specific defines */ V7 r+ U1 a* o4 l$ n# h4 H#define OPT_SYNCDIM_SHIFT (0x00000002u) 4 {/ t' ]' V( d3 U, a#define OPT_TCC_MASK (0x0003F000u) ( K7 k+ @9 y. L# f# V3 e k#define OPT_TCC_SHIFT (0x0000000Cu)& [4 w- i p$ B; r' c+ ~
#define OPT_ITCINTEN_SHIFT (0x00000015u), e# c% `3 G$ s: H, O# a$ Q
#define OPT_TCINTEN_SHIFT (0x00000014u) / Y# ]7 O9 `1 C+ E% C2 m5 U/ D+ X& K5 ^: P! l* O) _
char ping_buffer[PING_PONG_BCNT]; 1 |5 E" M1 @! r7 `+ \4 U- m, A/ Vchar pong_buffer[PING_PONG_BCNT]; 7 o2 |: n+ f. K$ H" Q# h 6 F, F" @/ |! |- s! P% l( |8 D: j. k; z4 m& W0 ~ A! }; g
/ o0 o9 F, \- z( C# C, e# S' Q
" A8 p! T9 k5 m, c+ V9 O
static void ys_edma3_init() ) N+ ?' X; O8 h9 B n6 u! B{ - G4 s% d3 N5 H# \ EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};3 F1 a1 ]) B" E% {1 S- u
EDMA3_DRV_Result result = EDMA3_DRV_SOK;1 y3 H$ A/ F! w1 l
EDMA3_DRV_Handle hEdma; : g$ J- }" W/ \( q8 ?& l+ e uint32_t chId = 0; ' b7 }0 m: T* S' _' ~% p4 F, Z uint32_t tcc = 0;- w' `. T2 b6 t3 z
6 U* N) A2 _, B3 c: K7 r print2arm("edma3 driver init...",0); ) ~5 u! j! l3 s8 X7 f# h7 t3 B- \2 K ! \ K! H g% ^+ b- r$ X hEdma = edma3init(0,&result);7 \+ {$ U, w1 A' L2 z2 |
if(hEdma)8 @% z Q7 {7 u e
{+ S" S3 y) k; M4 D; ?, B
print2arm("edma3init() Passed.",0);/ Q/ @: |; b7 q2 l/ n8 s; ^
} 7 h; k& V7 Y" C9 b6 s; }( J else , j% p1 h9 r* v {: ?' e+ g9 ?2 e2 G0 N2 M5 T
print2arm("edma3init() Failed.",0); " P. Y! T' D) z1 B! Y9 C+ R S } 7 Z" v4 h: | x/ E8 r * c8 K6 X J+ M5 e5 M
if (result == EDMA3_DRV_SOK) 2 e0 S# |% U/ c# [) q8 m) x { ! O j8 |+ }" E% g result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,. T/ ?" d$ s0 ~4 X$ x3 A- C1 L/ y
(EDMA3_RM_EventQueue)0, 1 e1 u- b" V) M; d& p &edma3_isr, NULL); 8 z" G9 Z7 W) b' }* @1 j } ) i5 z' j) I2 u: p% r! O( g 1 _" m4 t+ m" ^+ M& P0 ?' [! { if(result == EDMA3_DRV_SOK) ( D5 O& w" n' b+ s { ) B) L9 Y# D x6 b paramSet.srcBIdx = 0;! ]) U3 q5 z3 \! a5 \; }+ l t: s; c
paramSet.destBIdx = 1; - }# `9 k: B H2 ?; w; O8 @3 z paramSet.srcCIdx = 0; ) D/ U" N: Q! k, e; \ paramSet.destCIdx = 0;7 i- n3 p9 h! ]6 W, m
paramSet.aCnt = PING_PONG_ACNT;% q5 Q5 ~% B* {/ ]$ N+ y u" q3 [
paramSet.bCnt = PING_PONG_BCNT; - L3 n! @( q2 |* B: c, G8 V paramSet.cCnt = PING_PONG_CCNT;/ A7 g O8 \: u
M, N" a, A4 }$ z# k0 p9 N
/* For AB-synchronized transfers, BCNTRLD is not used. */. `, Y* Y. L3 C" T4 e7 i: H/ L" }
paramSet.bCntReload = PING_PONG_BCNT;2 n6 N3 |4 O6 A: T
: g P" d4 b( H# M1 Z7 t
/* Src in constant mode Dest in INCR modes */+ L% l' \" D' \. M2 L" R; E5 A
paramSet.opt &= 0xFFFFFFFDu;( F% [, N6 j: L0 N. k
//paramSet.opt &= 0xFFFFFFFCu;1 ]4 D8 I# a( s8 r( ]+ H
( i9 s* H( i; K/ \, S2 I /* Program the TCC */ 7 V [. [2 O. s) j) c. B# n3 b. a paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);' R4 P7 g: ?1 y% t+ M
! S( F( C9 S$ l5 } /* Enable Intermediate & Final transfer completion interrupt */2 K% I5 v e2 f9 n
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT); 4 m" b4 y! X, P" l; \" f$ a1 m paramSet.opt |= (1 << OPT_TCINTEN_SHIFT); , e) [9 {/ Q* {9 F3 q8 @ - r) C$ i* {9 i x7 e /* AB Sync Transfer Mode */ " R6 [3 e4 |4 J paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT); ' e, S, Y/ Z: \# F. i N' }4 m' S% J : g( a, K1 D# s. O) T3 ?! Q. r /* Program the source and dest addresses for master DMA channel */' v) j: m: w. W
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C); 6 a8 {9 Q/ v3 f' D E. X' M9 r5 V paramSet.destAddr = (uint32_t)(ping_buffer); ! |/ J% {- D! v2 i2 x6 x. t / U8 @* F& v: q; C% x, {: m! | /* Write to the master DMA channel first. */ 5 D; f+ p; E( C# y ]+ y# X; M result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet); 0 _ X8 |# T$ j: w2 v } 4 S( p5 L) ?$ ?1 s% C/ ~9 ~& \; W4 K8 ^$ Q8 r
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);& \* O% y X; p0 ^# ?; t& I: G1 t
; D, s1 g5 m5 r8 a if(result == EDMA3_DRV_SOK) / n7 z6 o9 ~* F7 `/ L1 {: O0 B
{ 9 w( h" |8 q: P* G6 u print2arm("edma3 driver init success.",0);! |3 a: J. B2 B$ G! O" p" Y9 ^3 i
} 3 @) v: w% E/ H8 q4 ^" `4 t
} . g' \) m3 E$ w; a4 ] 4 n+ }; k; h/ i+ p1 t ! H. O5 u% K; Z9 lEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。 2 h1 u. f5 D: z0 s4 M) u. }; ?6 b0 z4 O2 Q7 i
* R1 {9 E. @5 @% n9 c作者: Lewis 时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输作者: silent123 时间: 2015-4-29 23:25