5 C6 i& l! o9 V0 i8 Y7 T6 qstatic void ys_edma3_init() " t) @/ Z$ d; S2 ~5 ]( z& ^{ . I8 f- j; P8 p EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0}; 6 q9 X# p1 l4 @ Q" ]' ?# L( [1 f EDMA3_DRV_Result result = EDMA3_DRV_SOK; , e6 k# S9 B" K EDMA3_DRV_Handle hEdma;' C* I% T# [# e/ f; w7 T
uint32_t chId = 0;% h% `3 J3 q( ^/ p7 `& H
uint32_t tcc = 0; 8 l8 ]5 \, @9 V' K( O% l # `3 m r# C4 ]9 M- Z& {" q* Y print2arm("edma3 driver init...",0);8 f: `4 q# d* a5 V) P) [ a0 @% n/ A
s+ D' b% K1 b7 o% o
hEdma = edma3init(0,&result);9 h4 z. F: |8 a" M5 _" p4 o# K
if(hEdma)5 v# P! u* T) j6 X
{) Y9 t* u4 a2 |/ D8 ^2 ]
print2arm("edma3init() Passed.",0); . c2 ^6 T& F3 Z& K6 ^) P$ ~ } b6 K6 X( }3 ]" } else 2 }# I- ~1 }' I4 P; i# F {$ y3 G" a2 P( e. q U
print2arm("edma3init() Failed.",0); % s, Y M% |6 r/ B3 Y }& U3 g7 d! _+ u/ m3 {3 b" G8 e' X
7 Y; p* n# ?' E% N: S4 Y& Z if (result == EDMA3_DRV_SOK) ; W$ j9 S8 Q, x, P- I% b* e {* E0 ]/ \0 O' s8 g! U6 h
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,% [; k) E# E3 [: Q4 F
(EDMA3_RM_EventQueue)0, - n& ~; s% b/ H }' d& I &edma3_isr, NULL); E1 p- M8 ~) I% ? } : F5 A8 M% T' K1 ] 8 `! T X% A, Y6 n% K. V if(result == EDMA3_DRV_SOK) , O5 f/ B8 `9 O {6 X9 i- p; S6 `8 q
paramSet.srcBIdx = 0;9 N) E( ?3 V: L8 [
paramSet.destBIdx = 1;. d7 R2 I5 A; i; {" z' P
paramSet.srcCIdx = 0; ; I3 g% M& g# J1 Q2 K$ w4 _ paramSet.destCIdx = 0; " I' h A9 [- c, E& Q6 B2 {3 b$ g paramSet.aCnt = PING_PONG_ACNT;0 d- o4 i" u- L5 P
paramSet.bCnt = PING_PONG_BCNT; # J* |; u4 X2 f& B* a9 d, G paramSet.cCnt = PING_PONG_CCNT; 3 i5 P0 x8 z" ?/ j. C ! T- b- U5 F+ v
/* For AB-synchronized transfers, BCNTRLD is not used. */ 3 m! C/ Y v* q; c6 D paramSet.bCntReload = PING_PONG_BCNT; & v; |& o0 p9 t+ ~% l, @" u- h9 ]0 R
/* Src in constant mode Dest in INCR modes */ ! e( n! l' x- a! L- {) V paramSet.opt &= 0xFFFFFFFDu; : `. O- ?* o6 |8 k7 k% B! | //paramSet.opt &= 0xFFFFFFFCu;3 o; F+ B1 K% x3 t3 L- n
0 j. }6 \9 A3 H* t) B9 G' R" V
/* Program the TCC */! ]/ k7 V2 ^5 Z8 M
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);- P4 [9 `! o* ~' U9 s
9 J! H; y; \# w( Y /* Enable Intermediate & Final transfer completion interrupt */- M) k8 ?7 \3 r6 L e. |. v, x
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT); ; C/ @5 \: d* o5 ~; E9 p' k paramSet.opt |= (1 << OPT_TCINTEN_SHIFT); ( q; K, e5 ?5 g6 X& M 3 n1 k* d2 D. l8 Y3 ] /* AB Sync Transfer Mode */( y0 x0 f( d% `$ G4 u- L# Q; a
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT); % h0 [8 q: l: `1 ]* z# ^3 Z 3 H9 s; `5 J: [- f6 U* p6 i+ m9 n /* Program the source and dest addresses for master DMA channel */ ; P; H" Z+ ?# y' T: | paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C); : |2 T; s4 j' d/ w& Z7 L" y paramSet.destAddr = (uint32_t)(ping_buffer);/ c$ X! r# g4 Z! [+ M4 E5 Z' g
% A E! K( e5 E$ t. h /* Write to the master DMA channel first. */ $ U K( X+ L- \4 F) ^3 L) C- o7 I result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet); ( i f: S. {; H* N7 D, ]7 c. @. j } 9 F3 k- a3 a7 e8 a3 E! S
1 `/ N: B5 K8 d7 d1 a* @: a result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT); . S; ^. n/ b* t2 X3 l4 a 8 T6 ]$ F( _/ T2 K6 P if(result == EDMA3_DRV_SOK) 3 @; }* P8 q6 Y6 U' A( h J { 2 V0 e& b6 T7 I8 A print2arm("edma3 driver init success.",0); . Q" v& p% I0 x } 9 t! O. u% W9 t( S9 j
} ; k% U6 h9 y+ U$ p: `/ q 4 S" y3 f% {( y( n1 w $ n8 N ^2 _2 z( v/ nEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。# R4 v& e& q+ X1 ]$ U
4 @: q, P; y6 i& j! F& M$ y8 f! ?/ |7 i8 W* b# y 作者: Lewis 时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输作者: silent123 时间: 2015-4-29 23:25