嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
# A- k9 k5 v* z+ {) }4 \; p
#define PING_PONG_ACNT 1
, W! o1 v! D6 r) R- S
#define PING_PONG_BCNT 8*32*40
& A" [5 n: J( Y
//#define PING_PONG_BCNT 1
! x' ]1 `& ~9 o# J" e2 C: G
#define PING_PONG_CCNT 1
* V3 O; Y2 C& O. y7 M, Z3 {
#define MCASP_BASEADDR 0x01D00000
3 k( U* r) A: l# Z7 [/ S. E
#define Mcasp_RXEVENTQUE (0u)
/ q( |7 n& P" ?$ |8 d5 a$ a
. j6 p+ Y, h# P2 ], Y* T" R
/* OPT Field specific defines */
2 v- a/ W* ]& o8 q
#define OPT_SYNCDIM_SHIFT (0x00000002u)
! j7 X$ P, \ w% m
#define OPT_TCC_MASK (0x0003F000u)
& I0 Z" t: D8 r4 H
#define OPT_TCC_SHIFT (0x0000000Cu)
' c. t& r/ `. y" ^
#define OPT_ITCINTEN_SHIFT (0x00000015u)
8 Z7 A# F. A3 H; K4 x) x
#define OPT_TCINTEN_SHIFT (0x00000014u)
0 `: {; P) Y: D% r' l0 B3 \
, I4 B9 n% J& a* l; V
char ping_buffer[PING_PONG_BCNT];
( S/ M4 C, z( e( I. l
char pong_buffer[PING_PONG_BCNT];
. k: _: k3 Z" Q) C. j" K3 ^3 e
/ g9 X2 F3 N: g: z' I1 _7 v9 S
8 s. i$ D: c* g8 R6 Y( x
) e/ x, D6 Y: o' L; D8 \: w
7 ^6 I4 X5 O7 v7 i1 R% |4 t& i
static void ys_edma3_init()
1 R, V9 b2 y) U, L# q
{
5 K3 G0 V$ {2 d2 @/ N. J3 t
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
0 `" B" \ L# Q! P# Q. i$ [, J
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
, T; V/ T' j% W6 m$ l
EDMA3_DRV_Handle hEdma;
' o. f% x9 ^ {" n1 _) ~( d
uint32_t chId = 0;
N y' k, b; c2 |4 z" E9 w% l8 @" [5 H
uint32_t tcc = 0;
% i1 Q3 [; w( O7 T9 U
7 G( z8 q3 F% ]3 }# G: `7 \
print2arm("edma3 driver init...",0);
, W+ w) E* Q$ Q$ t: w# \/ J$ \8 X: S
2 ?' Q. b4 R) k v. t
hEdma = edma3init(0,&result);
9 p# y* ^4 k+ n: @7 k" Y
if(hEdma)
& Z/ v3 P3 Q6 Q
{
" ~9 `" Q1 d" M3 q
print2arm("edma3init() Passed.",0);
5 l* A' e3 k: e2 [4 R6 p
}
6 E9 @5 f7 R4 _& p( ^
else
0 `8 P$ H- f8 l
{
3 v- }9 T2 g& w5 e
print2arm("edma3init() Failed.",0);
Y7 c( M/ g; r. O( Z% H% B
}
% x- |8 D, f6 e
: M- c/ A( Z" d7 r q" t1 b
if (result == EDMA3_DRV_SOK)
7 D, D+ c' \! `4 I) Y* c% m
{
9 x; S ~; a! `+ f
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
3 d2 _2 J/ G! J1 N, Z9 u
(EDMA3_RM_EventQueue)0,
+ }* V) u. F. j' Q9 [% r: n# r0 |; z* v) Y
&edma3_isr, NULL);
: c* X' k, E- y ^1 E5 Q D @% F
}
4 b( _0 s2 N$ a/ O9 b% ?% d2 r3 u
1 V- Q. u0 r7 F( P1 {
if(result == EDMA3_DRV_SOK)
+ M8 L3 S$ F- i/ B9 `4 U) F
{
4 a" ?0 C- k$ {7 m2 v* B o
paramSet.srcBIdx = 0;
6 C! r# }# ^, j
paramSet.destBIdx = 1;
1 t. H! [+ h( V$ |" r
paramSet.srcCIdx = 0;
8 d5 ? s+ a8 G" D! |
paramSet.destCIdx = 0;
# M% ?" J$ |2 d
paramSet.aCnt = PING_PONG_ACNT;
1 h( v9 z/ r- K7 C8 ]& S! {
paramSet.bCnt = PING_PONG_BCNT;
; _2 G' F& E. r
paramSet.cCnt = PING_PONG_CCNT;
& P/ X' `( @, L
' d+ @( k; y) ^. K: R6 [( N$ }' @
/* For AB-synchronized transfers, BCNTRLD is not used. */
8 Z% M0 I% y* t$ G& p: y
paramSet.bCntReload = PING_PONG_BCNT;
1 x7 [2 H. t7 ~
3 m+ C6 C, T! c( T2 R
/* Src in constant mode Dest in INCR modes */
3 I8 l6 ]( ?% ^* o. B
paramSet.opt &= 0xFFFFFFFDu;
D/ C; s1 j" |$ ` d# i5 Z
//paramSet.opt &= 0xFFFFFFFCu;
+ T( E# C+ j" L
2 |- a3 K# w) V& e
/* Program the TCC */
$ e% t% u7 J; A9 _
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
$ h7 l0 x7 j. _6 g( _7 {) ]
/ Q( S1 R5 B# g6 r4 j# o
/* Enable Intermediate & Final transfer completion interrupt */
6 r [9 S7 |2 p% [4 h; M
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
: h+ n m. c! n
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
7 a5 m& M! S$ m& N2 U( k ~, k) i
% ]( W7 z1 Y# }3 w% U# `
/* AB Sync Transfer Mode */
: d9 s* @: E* d; |: i: _1 q
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
; u0 J9 g; P7 W2 H: K$ w9 ^0 ^
; x; p9 j8 }9 H% |( @4 f/ u
/* Program the source and dest addresses for master DMA channel */
/ n8 R( o* ^. }; X- L: {8 c Q+ P
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
6 q% J+ ?: Q* w
paramSet.destAddr = (uint32_t)(ping_buffer);
3 X+ f& k$ h, ]1 M
8 B! t3 s2 U8 N
/* Write to the master DMA channel first. */
/ H' _$ j2 }' S4 [# M" S6 j; i
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
7 @. G6 N/ \; @- p
}
" f0 U5 A6 f6 Q B, o# `
/ Z) S3 T P) }2 Q
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
0 N/ H) k, U9 }! k. }- H! P
4 Q; H+ @. ]$ b8 R" l; v+ F
if(result == EDMA3_DRV_SOK)
! J6 \, c) h! Q, i$ s" r
{
`- E. U$ M& h2 e
print2arm("edma3 driver init success.",0);
7 N) u% \! m f( P
}
9 G9 g( m. m, `' R7 u& l
}
: }2 @/ Y6 a$ i& p# t+ B
) _1 n1 a$ M6 i; U+ H
: _: P' h7 S7 \: U$ R1 P
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
\+ f! l5 {+ I
; q1 ?7 L* ?# G2 ~
0 v' I$ R4 V. s6 D% `1 D n
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
; ~' d% F; C' |4 z3 `$ s5 M6 @. z% f P
每次DMA传输完成后都要再次使能传输
' M* Q+ f4 d/ e
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4