5 u% ^* s0 d6 [0 S' h* s Fstatic void ys_edma3_init()7 b2 R4 Y0 p/ w: x& P. h% P
{ % `" C6 q; S1 g EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0}; 3 D7 I/ h" ^! N1 E, T' S4 i EDMA3_DRV_Result result = EDMA3_DRV_SOK; ; F$ o4 g2 J) i! r) i EDMA3_DRV_Handle hEdma;: }+ ]) i* y c( v% R# F
uint32_t chId = 0; ( v- f- H5 C4 {! O, C uint32_t tcc = 0;7 P9 y* }7 Q* Z
: @) ]1 O J- A2 _ y7 s% T, ] print2arm("edma3 driver init...",0); 3 ^' V4 i" X' } / n' f; ~) {" S5 t+ M, D0 K hEdma = edma3init(0,&result); 3 l* A2 h' o2 a. z if(hEdma)/ X$ I9 L9 b) p, Z$ d0 \
{5 ]" M- R( D& S: ?8 v5 q
print2arm("edma3init() Passed.",0);, G$ _, w, {6 Y/ n; }
} 6 J! [3 Z8 W4 R9 V else ^- n( C9 l4 w8 D$ i* N
{ 1 `; Q8 j& C, s* K! Y, i; t) e print2arm("edma3init() Failed.",0); . s1 n: @6 I/ F7 \ } : ^5 o! D9 r3 f' M* K8 f 0 L c; h% W5 g6 E$ l' P4 P if (result == EDMA3_DRV_SOK): s) d( _; o! k3 ]7 O/ k" m
{- o7 T6 s3 [$ Q0 ^0 ^: p* }
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,% v9 i U" ? ^% @( k* v$ G' E
(EDMA3_RM_EventQueue)0, 6 W% Q( k3 x V5 \ &edma3_isr, NULL);3 {0 M! w0 |4 N% N
}2 ?. n# y" L* o
0 x% u7 q- F: ^' k) D if(result == EDMA3_DRV_SOK) 3 g7 M/ P+ {& i0 H0 b { : S/ M* s# k5 m8 V paramSet.srcBIdx = 0; + n: ~' }2 U: B5 j' Q/ d* \1 O paramSet.destBIdx = 1;0 E% [! m. N$ }" a
paramSet.srcCIdx = 0;4 r. L K! X+ ]- z: q( l7 D
paramSet.destCIdx = 0; \8 R3 W" g- Y) _3 ?. X
paramSet.aCnt = PING_PONG_ACNT;; _" j/ m& g" D: B3 N
paramSet.bCnt = PING_PONG_BCNT;/ ~# h1 G. @$ y/ ^, M: e4 ?. G; k
paramSet.cCnt = PING_PONG_CCNT;; v I1 ~, z( h7 h" W
" H+ j6 A0 Y' D+ m" A9 z
/* For AB-synchronized transfers, BCNTRLD is not used. */: k* P8 g6 H9 Y6 z8 ~1 f- \
paramSet.bCntReload = PING_PONG_BCNT;8 h2 V/ Z* j- L z" V
0 ~7 w5 O0 d0 o2 S
/* Src in constant mode Dest in INCR modes */0 J6 W, a& S% d; @. w
paramSet.opt &= 0xFFFFFFFDu;1 ~( |1 |3 Y; |* G
//paramSet.opt &= 0xFFFFFFFCu; + Z, Y* p% g8 }# F. D! C. F ( e/ \% p6 S1 W' c# ? /* Program the TCC */ ; w) X% C& b+ @( Z2 [6 a, f paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK); ) S% L- }& H, K4 [2 C " z; l5 j3 B) h, k /* Enable Intermediate & Final transfer completion interrupt */9 Y4 `) D# @' ^( I i& K8 Q* \
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT); / E7 I% T, _ H' L paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);# N: t6 Q- ?3 I0 H) h' G( V9 H
9 b9 @- j1 v8 f9 D6 O
/* AB Sync Transfer Mode */ % _* H" e2 a+ s paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);& G4 c5 B; v' w! I
1 v% S+ n; I8 S: ^1 E! _ /* Program the source and dest addresses for master DMA channel */ 6 s" ^/ P1 T2 f; Y$ r- A& Z paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C); $ D4 X- }1 m0 |& F0 z. @! n, x paramSet.destAddr = (uint32_t)(ping_buffer); 2 X2 h; m$ o% r1 q/ d$ b J6 G2 D" B2 i6 H1 F8 d1 S; A
/* Write to the master DMA channel first. */ 2 |* ]. X' K: }* ?& f/ w result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);6 U, V; s8 w* O+ ~% o. n5 p
} 3 k/ R8 e* g. J5 {0 B) ] 7 p' o( j- z" d( ]3 m; `* _; L result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);# X& S3 q. K, j, h. k! O. @
4 X4 Z. v7 R9 N( k' D- _ if(result == EDMA3_DRV_SOK) 8 }! g" E/ _3 G/ f' z( }! q
{ W6 Y5 V/ O4 P0 u print2arm("edma3 driver init success.",0); 2 f. k! V( K5 b5 F5 j3 E } 8 ?) T v% l+ J; e0 E! Y! E
}+ i; `6 [) r! Y) @4 e2 h
' x0 k% I4 v# `+ p
) R. r2 n d% _1 N& S |8 C L: TEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。* c& a4 A( S1 @2 _
2 q3 Z5 u$ L. g! F/ c s- W
, R/ r2 T$ W% P% P 作者: Lewis 时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输作者: silent123 时间: 2015-4-29 23:25