|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:; |9 I2 P, Z- p7 B
#define PING_PONG_ACNT 1
* S3 y" x* B4 u3 E1 _- `#define PING_PONG_BCNT 8*32*40
* r) P4 V6 w6 q* o# P//#define PING_PONG_BCNT 1 ! m4 M- J, n+ r: v( l
#define PING_PONG_CCNT 1 X$ E0 H8 x7 F
#define MCASP_BASEADDR 0x01D00000
9 q& Y, i& ~+ u4 D- `# V5 P#define Mcasp_RXEVENTQUE (0u)8 C/ N0 j6 ] S/ x( y/ v/ S
5 f# d8 j; U$ x, r |1 T) `
/* OPT Field specific defines */
) _$ `7 q, E* B9 A$ x#define OPT_SYNCDIM_SHIFT (0x00000002u)1 M7 a2 Q6 f% [5 O
#define OPT_TCC_MASK (0x0003F000u)
4 t. V! w# a+ D; H5 v# S6 j) z) K o#define OPT_TCC_SHIFT (0x0000000Cu)
! R! M, m% Y/ ?& [0 v#define OPT_ITCINTEN_SHIFT (0x00000015u)6 K! ?# W1 S4 q& ?+ @4 h7 i
#define OPT_TCINTEN_SHIFT (0x00000014u)
0 @( a( z! {& V: j: s' Y& |
' X! b; v7 g1 ?, r! C# W" kchar ping_buffer[PING_PONG_BCNT];
& ^ q& m4 l" S9 c( w8 _; y) { Echar pong_buffer[PING_PONG_BCNT];
7 O% a* ]$ i) @, I5 Q3 N1 f
* A; Q8 I% I) R" E* X
8 \2 h, X3 s: @7 Q- J, y6 n: [" H A* ~# ^* S' l. [
6 ^3 B$ S% S. e, B4 B! @6 q, E
static void ys_edma3_init()* E2 d& a$ h( ~ O2 C
{/ Y0 D/ F0 d8 N' v
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};: t8 k; A& c0 d6 _( ?4 j+ W
EDMA3_DRV_Result result = EDMA3_DRV_SOK;' S3 p$ Y6 O7 k1 Z2 Y. v/ \
EDMA3_DRV_Handle hEdma;
" C$ ?5 W, g& R5 \ uint32_t chId = 0;
) j( S! _6 k Q/ \9 V uint32_t tcc = 0;
" B- g. G* C# E( ?) x$ Y- @5 D3 |* ~- J# | b% H
print2arm("edma3 driver init...",0);1 m& H3 ^/ [+ e
: L$ L& H8 a q4 }& _' V" }# w hEdma = edma3init(0,&result);
" X4 i: X' a! v( H) i. ^( Q if(hEdma)6 I: J1 V& \" F/ ~& \# U* X: Q# `3 ]
{
& p" B& v D9 J) z: R) C print2arm("edma3init() Passed.",0);
7 ^+ g* u2 `) A8 z }
2 G. ?# `0 h5 a' V( h1 R P else( z, m" L# H/ b' \/ D
{1 y9 I( Y6 |! k
print2arm("edma3init() Failed.",0);
8 ?' k' G2 X0 ^; l) P }) ]6 m3 G8 W+ Z) G
( M i# `( [# E if (result == EDMA3_DRV_SOK)8 o+ i3 k: `6 \. O6 I- U( s9 m1 U z
{
o, i0 \7 j; @8 G/ i* \ result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,0 l4 _! Q% q; q# b$ x2 q
(EDMA3_RM_EventQueue)0,
& \9 ?! U. }% i' s' v &edma3_isr, NULL);3 ^# c; l7 k3 l
}7 K# V. E3 m/ ?* C
1 H+ B+ w5 A' n: h. }1 m0 A if(result == EDMA3_DRV_SOK)( F8 k b: y I' G$ w4 B$ Z
{
: ~- u5 w8 X+ n, v& O paramSet.srcBIdx = 0;
8 I c$ t# n" i1 b0 x$ R% I) O paramSet.destBIdx = 1;
+ O) r- n2 R7 c3 Q, p2 V" u3 N1 h5 K paramSet.srcCIdx = 0;
3 i! \" M3 T' R/ E* s paramSet.destCIdx = 0;( ?) V0 m) z2 F0 M5 Y; f# C w
paramSet.aCnt = PING_PONG_ACNT;
2 p* d, G! B2 U; F% u6 U paramSet.bCnt = PING_PONG_BCNT;! |* _4 v) ?$ R7 N- K
paramSet.cCnt = PING_PONG_CCNT;: S+ q- y9 {' K% L; ~0 n; g
; S9 n2 a) l7 R
/* For AB-synchronized transfers, BCNTRLD is not used. */
& O3 ]. X* F1 y. B) D paramSet.bCntReload = PING_PONG_BCNT;, L e5 { W# T5 Q- s3 q: X9 H ]
& F% W1 [3 k* P2 Z3 |. f/ U- e
/* Src in constant mode Dest in INCR modes */
0 {% U4 { o; v paramSet.opt &= 0xFFFFFFFDu;% e8 ?* A/ u& n/ k% W
//paramSet.opt &= 0xFFFFFFFCu;
/ M7 S. G, I9 a ' B4 [, j; ]$ z# z# B
/* Program the TCC */+ i0 A+ _1 M; C* z" `, E# p" ~
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);4 f7 U& {3 D- [4 Q' t
. U. a7 o" d" l/ [& B8 p! ~7 B /* Enable Intermediate & Final transfer completion interrupt */
, c6 x' G8 @4 V2 m( o paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);; S5 p! U5 a3 [ U$ K1 @. u
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
+ \6 X/ b! w9 ^
9 H0 A$ M( `& J& A3 A$ p /* AB Sync Transfer Mode */
! u5 L7 ^/ U' N) j6 F1 {; J paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);1 g; ?$ s& N, Y4 g* g) w
' M' ]. B3 u2 \6 z5 j" G. U6 r
/* Program the source and dest addresses for master DMA channel */' j" k6 Y- W6 ]; d' ?$ H8 D7 _( m
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
2 e! ^5 D, o- ] paramSet.destAddr = (uint32_t)(ping_buffer);: _' P$ u N8 W# @( t7 G) \
- i, p+ [: B# Y* } /* Write to the master DMA channel first. */
2 \" u' s3 y" q; h3 ~$ \' Y2 H3 t result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
3 _. b1 x5 M; H) z- P; c' @ }
" H* f' o3 U* x5 B9 A! V
E/ l& l# o V" M result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);; C' V- d0 [1 s
% i# o& j' U% d' e! E O% r' y" H. A
if(result == EDMA3_DRV_SOK)
9 M& T7 K* K9 M* S {
6 l$ A" n! {9 c' y6 P print2arm("edma3 driver init success.",0);
- c5 E2 Y" f5 A3 {0 G, ^5 j( | }
2 t2 _5 m# s+ J. V4 n( }) L+ m* a}
' I7 n: u4 \ f9 u, T. X" g4 Q3 [: J$ x1 ?
7 E/ K7 j1 V) k, \& y% \9 A3 z* _$ q
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。, a, x- e9 G# d7 W! c, @( m; h/ X5 P
% o: M: R) h3 A. t! d
0 c. R; g6 |" V0 n s5 M
|
|