3 Y5 h9 _/ Y6 P4 E* i! z / y, C9 d* [$ Y/ i. j3 e+ ~" } # G# ?8 ~7 f9 X0 u5 t% J6 z* i $ y2 c* q- w: o& R3 Sstatic void ys_edma3_init() # R" S2 n0 P; I' H# H1 B7 V{8 W+ A* ]3 P x% X4 {
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};: M7 X2 C4 C& a' L
EDMA3_DRV_Result result = EDMA3_DRV_SOK;# w. `: J K2 p
EDMA3_DRV_Handle hEdma; , x6 h: C8 G9 H# ` uint32_t chId = 0; ' [# Y; r+ a" y9 I: l uint32_t tcc = 0;6 f) w1 X2 |& m4 U
& P- D. n$ @- v2 m/ B# ^
print2arm("edma3 driver init...",0);' R; a+ ~; u/ v
1 n+ |' W. s& y/ [5 E( P) L. O hEdma = edma3init(0,&result);$ b) {1 T: |7 |& s; _
if(hEdma) ) R0 f* `' i6 E6 ~2 z0 f1 d) f, e. m { # f: \- ^* q; h, W x+ D- f print2arm("edma3init() Passed.",0);3 c X1 |1 L! P% s
}/ o- [5 P, H0 R* L
else0 k. W# f1 t9 [ E: L
{9 S3 A. h9 |- N1 @4 c8 M" y3 S/ D
print2arm("edma3init() Failed.",0); & S9 [( G' }( W1 M }, P. T2 t+ W2 P2 i; H2 p
, L" F" o3 C. W" X% d D/ d if (result == EDMA3_DRV_SOK)5 ~8 X% U* Z. L( }( p
{$ H5 @5 s/ A- y7 D
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,. [4 M: ~% }, m7 ~* N5 s& [6 T
(EDMA3_RM_EventQueue)0,/ t, J h( O5 K, {, e
&edma3_isr, NULL); , i; E9 c1 r D( U! p' }1 R }0 Z) X. d" ^- P# \' P
3 |% O2 X* y; O8 v) ]/ Y7 H& }7 [% S
if(result == EDMA3_DRV_SOK)) v: V$ P* w! W# @$ R' W: [. r
{( {( |* m# [# W" \/ {5 b
paramSet.srcBIdx = 0; ' s" f- a' s6 W5 a% r paramSet.destBIdx = 1;4 f4 G! l$ X8 d2 [1 o4 O
paramSet.srcCIdx = 0; p& S7 C. b L$ c P5 x
paramSet.destCIdx = 0; & r( O3 p- y4 F% w. t' C3 P- q) g+ m paramSet.aCnt = PING_PONG_ACNT; 0 y5 @ t" r% y5 c paramSet.bCnt = PING_PONG_BCNT;. }: d r4 k' u( v1 B- T
paramSet.cCnt = PING_PONG_CCNT; - I( `. ^" H! C, X D + |" {( [/ X0 S+ d% Q& E1 x* d /* For AB-synchronized transfers, BCNTRLD is not used. */ ; j, R Y6 q5 U: C, g! ^; i4 h paramSet.bCntReload = PING_PONG_BCNT; & m% T. r. r* I. @0 E' d2 _# N6 e% a) `6 \ T5 c5 S/ R
/* Src in constant mode Dest in INCR modes */4 p2 c7 G' |0 Q
paramSet.opt &= 0xFFFFFFFDu;8 u. e( Q- ^8 v& |9 m: G! u q5 p
//paramSet.opt &= 0xFFFFFFFCu;7 }( j9 _8 y* p3 U8 e/ u, z
! h3 Q& l* F# L: Z5 O( J- e
/* Program the TCC */ 8 q9 |9 s8 [% }9 a* g paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);( { L. R6 Y! `( G; o& _
0 n, i. J4 X; u+ a2 l5 K /* Enable Intermediate & Final transfer completion interrupt */ " Z4 l4 }4 w3 \$ ? T6 y paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT); ( J% t3 e1 q# N" `+ P# B paramSet.opt |= (1 << OPT_TCINTEN_SHIFT); Q) X/ X# D! z+ T4 K6 p
# P% p8 c2 l. n8 Q/ m /* AB Sync Transfer Mode */1 ?& U- n. W) F; G& a& ~
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);% X! n9 F, u: {$ R
3 c, c* w. I1 q: p6 E
/* Program the source and dest addresses for master DMA channel */. h! \$ M$ q5 S/ }. X
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C); / D; P* m: k' |: x2 g paramSet.destAddr = (uint32_t)(ping_buffer); x2 a0 a* C4 ?" z- i2 A
- H$ M# K- T& ^% O/ p: d8 K /* Write to the master DMA channel first. */ ' }, \! {- B9 n& {% L5 X# f result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet); : o3 y7 _/ l: q2 j5 G; I8 t* ~ } " j$ l2 P& T U9 @) U" k
+ s6 _- {; T4 `' v' o) j. k3 b result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT); ! i' @5 h- C1 y; B- T 8 [4 n( [$ P# X9 w* h if(result == EDMA3_DRV_SOK) 6 h2 `/ F1 ?2 y. J2 T* _ {5 F7 z' z; P6 }) N4 D" r
print2arm("edma3 driver init success.",0);) o7 O9 }- x+ T- d0 G+ m9 d
} 7 k$ z# b( j7 T& S
}$ D* `6 \" K; y9 I- o, F
& U+ a2 l# C x1 W/ N* K/ h9 F; B I
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。1 B) u% ~2 L; B _3 ?! i# O3 U
u$ `9 I( y+ s3 A 5 G8 r2 m, j8 M1 z4 o作者: Lewis 时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输作者: silent123 时间: 2015-4-29 23:25