嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
- t3 h+ }8 M! B. M8 U: K: U6 `
#define PING_PONG_ACNT 1
. |7 j* E# N: {4 r; |. z
#define PING_PONG_BCNT 8*32*40
6 R' t& Z7 U* X! P
//#define PING_PONG_BCNT 1
7 N9 H( P' a {
#define PING_PONG_CCNT 1
) ^* \& ~; ^ K! L
#define MCASP_BASEADDR 0x01D00000
: O/ H4 M4 _8 V& R1 C$ Z+ v* O5 S' f
#define Mcasp_RXEVENTQUE (0u)
" y) z8 v' n, N% z4 z
# |) Z! O! A w4 M8 [, r
/* OPT Field specific defines */
6 p' ^1 f' B- K6 n9 n( D+ ^
#define OPT_SYNCDIM_SHIFT (0x00000002u)
% l, ?! |8 k5 Q. y1 t8 \
#define OPT_TCC_MASK (0x0003F000u)
( @4 Y: p1 a- G
#define OPT_TCC_SHIFT (0x0000000Cu)
5 Y% y6 U3 M6 ]3 I
#define OPT_ITCINTEN_SHIFT (0x00000015u)
, {. p1 R) i( x9 r
#define OPT_TCINTEN_SHIFT (0x00000014u)
- ^8 u1 S9 P, N5 B
# ^3 O% |1 {2 P1 H, \
char ping_buffer[PING_PONG_BCNT];
0 N2 d7 ]# K' m l$ w: L/ n
char pong_buffer[PING_PONG_BCNT];
, {* O: d# Z+ u9 j0 G. a
1 E7 Z: i% T7 I) V& c3 d9 n" W
9 i( p; c- T# A. Y0 C; @8 G
4 i9 Y) z: `) }( k0 ^
: U v" e2 I' v- Z
static void ys_edma3_init()
: k9 j l) K8 H
{
/ ?4 n7 k/ h+ y$ `
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
4 S0 g+ P3 ~* ?/ Q1 Y7 I. @
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
' n" f. a8 \' i' V
EDMA3_DRV_Handle hEdma;
* ]" c2 ] q+ a
uint32_t chId = 0;
1 S8 ~( V$ o6 `+ u( i6 W) R- v' p" Y
uint32_t tcc = 0;
8 f3 }" S D: z0 K/ n# T% t
) E* [4 U7 q |' \5 M/ n
print2arm("edma3 driver init...",0);
- y% |* e8 o" f) b
& F7 y5 G0 `- B9 Y C, c6 u
hEdma = edma3init(0,&result);
/ x; u: Y; B: G9 k& M, g" K6 o* D
if(hEdma)
$ x% i2 H) E! l! y$ b( |
{
3 t) d; H4 A L
print2arm("edma3init() Passed.",0);
4 q' l6 Z+ X t5 \6 V: z" `
}
w+ s3 B( _# Y* f1 H Q! K
else
8 M1 o- v4 f' q+ T' p
{
) ?) Z% s6 }% v- Z( O
print2arm("edma3init() Failed.",0);
: S! H1 B7 ?* R! E
}
# ?- a2 e: B, [. y1 t# Q2 I8 c
7 R5 e& U8 J0 R* ?$ }4 z
if (result == EDMA3_DRV_SOK)
2 Q! q& A. o; O% \, D0 l$ B/ ]
{
- a( V/ s: \3 L2 N6 b* y
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
/ ]% b( {3 D+ }' X
(EDMA3_RM_EventQueue)0,
( Q" S4 {: a; q5 A, a- J7 p
&edma3_isr, NULL);
" }* v$ w( R. k; K" R
}
9 D: G. s9 t6 Q, a* K0 x
! I5 s& {# m; l. p$ Q' K: e
if(result == EDMA3_DRV_SOK)
; N$ C/ `- J' y2 a2 T- r7 x# L4 u
{
* O( D% _" ?3 h J4 p1 m
paramSet.srcBIdx = 0;
# `* X$ Z9 h! c% T
paramSet.destBIdx = 1;
& N% B4 j9 G1 @" z) d
paramSet.srcCIdx = 0;
1 i2 G- Q! j6 k$ R+ A) N4 B. x
paramSet.destCIdx = 0;
- ^9 p5 I9 ]. v; v J( t
paramSet.aCnt = PING_PONG_ACNT;
# e; E& h2 d2 k3 }& P* f t# Q
paramSet.bCnt = PING_PONG_BCNT;
4 t& e* V4 r) ?- U" W; R2 H# j2 q
paramSet.cCnt = PING_PONG_CCNT;
; I' @8 n. f9 U3 K% O
7 M1 k4 D) i- Q& W3 u: j6 p
/* For AB-synchronized transfers, BCNTRLD is not used. */
. o6 P. ?8 V! g7 B6 o
paramSet.bCntReload = PING_PONG_BCNT;
! W+ v7 X8 R h( X5 d& E
1 t6 B" ]% n; `4 D8 U. w
/* Src in constant mode Dest in INCR modes */
+ }* P* U4 X6 ?5 w/ c% c( S( l
paramSet.opt &= 0xFFFFFFFDu;
$ @* M/ |, L6 r* u7 ]
//paramSet.opt &= 0xFFFFFFFCu;
3 Y* ^# b# Q/ V" L" V; O4 B# d
% t) M7 A" \$ P" T
/* Program the TCC */
8 l( G- I! U0 ]
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
( Y$ \6 Z5 R$ J. G/ i E; u
9 g; N, ~3 j, c4 `- U
/* Enable Intermediate & Final transfer completion interrupt */
% f. i2 X; y4 K D9 U& A
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
( [( e, }' }* F$ K
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
: t* \6 x# ]% [; R
+ K+ H' a" } F& t4 F2 C \: }
/* AB Sync Transfer Mode */
) @ n8 j& J' _. q5 a- [6 p" r
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
2 E9 {7 ?+ T; v
9 G- r% U J3 m, o2 l9 U! N
/* Program the source and dest addresses for master DMA channel */
/ ~0 y6 Q! n8 k7 d' {' b" Y
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
6 q$ \5 x1 I. _* ~1 N
paramSet.destAddr = (uint32_t)(ping_buffer);
2 C! p; ^. _0 G( W( d
8 t2 `% d1 _. O d I: D$ W
/* Write to the master DMA channel first. */
/ E* h% e$ x; c5 n. I% x
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
! k& N: E1 K# p
}
" {8 X; J. A( ]( o# R
1 A' O7 X7 l$ i) y
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
: E/ X- k) Z& ?
9 _7 N* h/ {; S. H2 B C
if(result == EDMA3_DRV_SOK)
, m. h1 c/ u; U0 g- R6 M! a
{
2 F1 o! l3 C: d9 y4 V, [# k0 G
print2arm("edma3 driver init success.",0);
* z6 Q5 j( V1 o/ {8 s# u6 O$ |1 W
}
; m. w$ S. ?: z/ u6 ~+ _
}
& G/ w. Y+ }; X' d- M
1 T, F6 l* _: o- `3 M) v1 f/ Z9 m
& q& v& `( w _; D4 N1 c
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
/ u+ `0 K5 [, m
+ b" N! b. v% j6 f# {0 W7 _8 K
+ K6 h3 m0 ?; E( o: H+ e K3 g
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
* E' p/ T a1 s! M; b; a' I
每次DMA传输完成后都要再次使能传输
0 S* k2 o' ]. k9 R6 O7 x
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4