嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
+ @& {' G% `. p0 H" h
#define PING_PONG_ACNT 1
. F5 Q1 J1 }) y, F. x+ w
#define PING_PONG_BCNT 8*32*40
9 F# E$ z! s' S, i
//#define PING_PONG_BCNT 1
/ y$ f: y) k1 u! C' v C
#define PING_PONG_CCNT 1
: k, _) k4 b1 N3 I1 N" S" _
#define MCASP_BASEADDR 0x01D00000
~& O; {9 F- K+ B# B4 S T
#define Mcasp_RXEVENTQUE (0u)
% m$ S* ]3 F5 G" e) X; N
1 |0 o+ m" s5 ~8 c" ~( X
/* OPT Field specific defines */
/ V2 W$ F' a: e( h
#define OPT_SYNCDIM_SHIFT (0x00000002u)
" h0 M# A2 f* `3 L/ N% `
#define OPT_TCC_MASK (0x0003F000u)
8 i! w U4 W* r# U2 T# S i
#define OPT_TCC_SHIFT (0x0000000Cu)
% s( I0 c( N2 P
#define OPT_ITCINTEN_SHIFT (0x00000015u)
" @4 z* D, H. w1 S5 v4 a
#define OPT_TCINTEN_SHIFT (0x00000014u)
* H. d# y9 e& w- g
5 J- B# X1 j+ O. H9 e. V
char ping_buffer[PING_PONG_BCNT];
+ r( l$ s: T" z1 a1 G, Y; A" ~
char pong_buffer[PING_PONG_BCNT];
# s- J$ G! `; Q/ e
+ H7 a, J ?8 D) R% n$ V: s- s4 J
8 y: Q9 a; `3 P- E: v
9 `1 U# ?' J# m+ O/ \
! y1 p V; h0 j* f
static void ys_edma3_init()
# j5 l+ ^+ q, J( W# S3 g) J# K' s. Q
{
: m* F$ R4 ` b: \# _
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
% A$ ?& F o7 _$ x; R5 W
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
# ?9 b5 p9 Z) m
EDMA3_DRV_Handle hEdma;
+ W: Q% {1 ? J3 L
uint32_t chId = 0;
* q0 A! X* G; F. j7 ]
uint32_t tcc = 0;
/ ?* |. f! u( N* Q! _4 g" m/ n! @& m
& x) X8 U J3 o1 T' D% }
print2arm("edma3 driver init...",0);
v! r3 l; M- c* G2 e5 s: u
8 ~% L/ `6 z5 I$ y7 F- C m8 Q' g- I
hEdma = edma3init(0,&result);
2 E8 Q7 f: W+ f1 w1 o# s* y
if(hEdma)
- A" r6 g2 P; ^& ^
{
0 q g) \ i, o4 H
print2arm("edma3init() Passed.",0);
6 r6 M4 h5 B% L# V' {! W
}
. c' G/ ?5 H6 G V, k' a
else
% x) e! N Z& Z/ t& R! A' |
{
1 ~4 h: u. Y1 h9 N
print2arm("edma3init() Failed.",0);
1 o7 _* B8 C* g
}
. L6 |: K/ G% Z z, B
! T2 s2 A6 h3 g+ E4 `5 d1 N
if (result == EDMA3_DRV_SOK)
, ^# T4 k5 b2 M, u7 F/ x4 j3 Y
{
& L* o' J' N$ X
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
8 }& g3 O) V b, E6 n# m4 q
(EDMA3_RM_EventQueue)0,
& k2 k8 b d- o3 @7 N
&edma3_isr, NULL);
0 o/ G4 F2 c4 P, v; k* O
}
- ^4 y2 {% k) H+ K' y9 x
( S/ b% q* ?+ L% p
if(result == EDMA3_DRV_SOK)
) R; U9 K4 ]$ o1 o! T* _
{
" g3 a8 l: p: q
paramSet.srcBIdx = 0;
+ J" r. F) h* N, J
paramSet.destBIdx = 1;
8 X+ M5 H7 Q& d- j0 _6 x5 @* q
paramSet.srcCIdx = 0;
4 [2 `( ^$ k- P( T
paramSet.destCIdx = 0;
3 S7 |; V' T6 I, M: X; A& y
paramSet.aCnt = PING_PONG_ACNT;
! D- G# [( h! ~; P: N
paramSet.bCnt = PING_PONG_BCNT;
j2 [2 v7 D: C' z
paramSet.cCnt = PING_PONG_CCNT;
. U/ O8 S! f, `3 ~: W# V; G
8 e: C5 |5 \, `+ [. |( t8 J8 D
/* For AB-synchronized transfers, BCNTRLD is not used. */
' S9 A& Q! p( k6 I( u6 u
paramSet.bCntReload = PING_PONG_BCNT;
. K: `% |, l0 G
1 H: I# x- }! Z6 E& a/ U: }0 f
/* Src in constant mode Dest in INCR modes */
) G9 p6 `3 x% R1 u1 h
paramSet.opt &= 0xFFFFFFFDu;
# e! \& C9 T4 L- x0 o
//paramSet.opt &= 0xFFFFFFFCu;
3 m8 W5 M/ B6 k+ }
7 \+ D" S. X% F; a: D
/* Program the TCC */
& C' I5 i* s- ]$ h ?, j' x/ L4 M) u
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
7 P5 e8 G& U7 ?! @% O6 s$ \4 j
, |+ ~6 u* Y9 k' N @3 H
/* Enable Intermediate & Final transfer completion interrupt */
8 ]4 x! k V- n( G( ]9 O" `
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
% Q y* p7 u; i; L- \( _
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
% U( i2 M/ S1 Y" q% a/ K% ?
2 F% V. h( h; K/ [* c
/* AB Sync Transfer Mode */
$ D, N3 Z' c# V) g' q, B- l# o
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
4 }, T9 N$ X- F$ C- f, s* f
* A; [1 I& o9 S% A5 h7 J+ z# O( F) F+ n, L
/* Program the source and dest addresses for master DMA channel */
; c" R$ u( G% g
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
b7 h J6 s ]6 i7 R4 H$ V
paramSet.destAddr = (uint32_t)(ping_buffer);
7 Z* S3 k K/ ?$ m
: x/ o3 h5 _: {' J5 l
/* Write to the master DMA channel first. */
# V N( h! l" \, d5 y" o- q; ~
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
% i/ U% G9 V) F9 Q1 j
}
- J; ~# \4 c' g8 V# B
4 n g3 H4 E- M: R! S
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
9 v3 n$ L) ]) `; \5 M+ h6 b3 M
' C# X2 H) B y1 F8 i
if(result == EDMA3_DRV_SOK)
& f/ L: |9 S& ~4 W- H) z- ?
{
, V- s1 O+ L0 }; U5 _
print2arm("edma3 driver init success.",0);
8 E: l: O+ l) j! [
}
, P9 n' P) [+ Q% q0 H
}
3 o, u& `, p: i' R# |
0 \ M6 W% ^' k0 R
7 @4 d" N" h' u+ @8 j$ t
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
* I: r3 ^: v. a( e+ f
# p8 z* I, ~& P- I
V7 a: \" V* I' O& I
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
# ~% }1 V% |" n. @/ n* C% B# J
每次DMA传输完成后都要再次使能传输
! ^- x8 H3 `* y
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4