嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
* Q0 F2 r; r5 R
#define PING_PONG_ACNT 1
O, S' w ?4 g" w e
#define PING_PONG_BCNT 8*32*40
9 X' ]; X1 X; ?- `& h9 G8 q
//#define PING_PONG_BCNT 1
3 y/ _1 z/ l) E
#define PING_PONG_CCNT 1
: A0 _( c( M9 J4 S
#define MCASP_BASEADDR 0x01D00000
3 D' V, k! K" s' |- b- M! w
#define Mcasp_RXEVENTQUE (0u)
d, T. k$ y% y0 t/ T8 ^' j, I5 D
) }8 @7 `4 v) m. F/ A
/* OPT Field specific defines */
) U2 @7 ]0 g6 x
#define OPT_SYNCDIM_SHIFT (0x00000002u)
e; P7 V! `4 U$ L2 a
#define OPT_TCC_MASK (0x0003F000u)
0 j$ A/ F+ L6 G
#define OPT_TCC_SHIFT (0x0000000Cu)
" u0 o' H- E7 Y9 z
#define OPT_ITCINTEN_SHIFT (0x00000015u)
* i% @- I- }' N
#define OPT_TCINTEN_SHIFT (0x00000014u)
' a8 N5 l; Z8 `
$ I* z3 w8 o+ d( w& y* U: A- L
char ping_buffer[PING_PONG_BCNT];
0 |$ ^' b* y4 ?/ q. v' F
char pong_buffer[PING_PONG_BCNT];
* j; a4 Q2 r: p8 V, z1 P0 f
1 r; L& [6 f3 c f! n# q
1 A% h8 X6 n9 |2 G& I
/ Q% K D9 V" g1 T x2 i& i# p
m6 U4 c! j3 O
static void ys_edma3_init()
3 ~5 x. X$ F6 w9 Q- s
{
9 |* V2 S: r: E5 p0 e/ i0 t% p* S
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
1 }9 D- [' P# H! ~1 |- B; C) I
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
* b3 w. `1 t8 P" D0 |4 G
EDMA3_DRV_Handle hEdma;
0 g: v8 w- D/ A0 S9 E' {( J2 i
uint32_t chId = 0;
& z( [1 R# j; Y: W# r9 v7 f$ j
uint32_t tcc = 0;
% ?( X; B6 j9 V
3 H0 b$ M& j3 z5 i6 J$ ?! }- M
print2arm("edma3 driver init...",0);
5 _9 ?3 o! }: B4 d( Q
! {2 a4 n t+ I$ R8 x
hEdma = edma3init(0,&result);
4 T8 |( J) Y0 Y9 c G- J2 F) t3 j$ B
if(hEdma)
) A6 K! B s, V, [5 L5 }5 R! L
{
9 B0 D+ g5 J$ ]. z
print2arm("edma3init() Passed.",0);
) S+ b5 g# J( m% m0 T, Z
}
. K- C) J% l8 T W
else
' _7 Q. X. P* H* \
{
6 a i& E1 P2 G# m! B3 @
print2arm("edma3init() Failed.",0);
5 ]9 ~- j& p3 P+ J
}
0 K" a O/ }- ?: V# R
5 W; ?" ~% e* B% t. c I4 s( R
if (result == EDMA3_DRV_SOK)
% w$ U, Z: w* W; @! Z9 t
{
5 v/ a' V' [! P7 U6 a7 l8 f: L
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
4 s( T+ D) Z1 e4 h1 ^. D, Z
(EDMA3_RM_EventQueue)0,
/ G0 j5 T. b1 D: T9 w1 N" _
&edma3_isr, NULL);
% X% }0 a; ]' z. N& E) r( ]
}
+ K' _( U6 X: ], g
Y6 S$ U$ m' X* b [
if(result == EDMA3_DRV_SOK)
0 L2 m$ d, p; W3 v& Z
{
& @- p+ K0 P% Q( c
paramSet.srcBIdx = 0;
) J3 O; w$ s0 f* {9 q# j
paramSet.destBIdx = 1;
7 t. u' _$ s7 t# y# `4 P
paramSet.srcCIdx = 0;
$ a, e& f- z1 R! A3 }% @ C
paramSet.destCIdx = 0;
2 l8 v u8 t1 l6 x, k- D
paramSet.aCnt = PING_PONG_ACNT;
0 ~, ~1 ?0 e3 d7 |3 w/ G
paramSet.bCnt = PING_PONG_BCNT;
3 u- Q4 V5 z) ?0 d/ F. g
paramSet.cCnt = PING_PONG_CCNT;
0 T8 z0 U8 L% U& a& H$ S* b& q, m
, }# P4 N/ h5 x8 |, T
/* For AB-synchronized transfers, BCNTRLD is not used. */
: a: m/ g$ C" _+ f+ B, k7 Z
paramSet.bCntReload = PING_PONG_BCNT;
8 E' l8 d0 i3 J P$ f
* M! s6 R2 o( f9 T. T; {
/* Src in constant mode Dest in INCR modes */
1 g1 ?! h# o" s. h/ F
paramSet.opt &= 0xFFFFFFFDu;
% p0 i5 F7 N) R; i) z; G$ j6 R
//paramSet.opt &= 0xFFFFFFFCu;
" q0 @. a5 S' E- z; V% }
9 N. G& G- i+ B+ V2 e# J7 j2 A
/* Program the TCC */
+ P; a& }" P" V. E* T4 V
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
- C6 b& d$ b6 j. {) q$ ]1 d
$ B( V5 e2 g3 a- B8 Z8 d L
/* Enable Intermediate & Final transfer completion interrupt */
& \2 M! ]8 C" |; X
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
( x& C4 z& t1 P1 Q l) g
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
6 Q2 Q! _: E9 u \
3 n1 Q8 D' w, @) w
/* AB Sync Transfer Mode */
' y1 m o \; @
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
- X) Z6 Q7 V6 w& ]8 @ c$ ^' s
( j, i, N, V2 u+ @( j( C) C& ?; l
/* Program the source and dest addresses for master DMA channel */
4 A( s# m% C5 d1 h3 l* Y9 M
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
) `! T, c# c: K( T C
paramSet.destAddr = (uint32_t)(ping_buffer);
0 z5 ?$ U$ J4 {: F `
$ O+ C' U7 j8 Y2 @) Q
/* Write to the master DMA channel first. */
' x6 l' V( D; l S4 Z( [6 [1 ~
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
5 j2 q+ a4 p, ~1 M
}
7 \4 X0 Y9 {6 c3 }# j- F8 j
6 Y' L$ T, @* d5 ?1 M6 j* L; r/ v
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
" D2 i: f e r) P! E- F
" X- }' V/ t; W5 j# l' `" [
if(result == EDMA3_DRV_SOK)
& x) P c5 R7 c5 P. f
{
0 O! i" G+ c# X, B) B! G) o+ T( W
print2arm("edma3 driver init success.",0);
$ i4 x3 b, {+ Q
}
* O) B( j( _ c7 s2 q
}
( \: O" x6 i7 P/ {
0 c) J) j0 {+ T
9 t2 M: p8 ]* f7 p& v2 {7 Y
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
( P# `" Y, _$ Q* U" P" e
( O- F! p7 x4 f$ [5 |3 Q
# J8 a3 ]. k# L: m5 p3 b0 P
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
8 w/ ^% {6 C: r, _+ i, X0 e; {3 t7 m7 `
每次DMA传输完成后都要再次使能传输
: C7 U. h1 A' }. F0 x1 I
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4