嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
% M g# f, m. }! j0 f0 W& m" j
#define PING_PONG_ACNT 1
N/ n) n7 ]3 ~
#define PING_PONG_BCNT 8*32*40
' d6 E* Q6 L$ V( J
//#define PING_PONG_BCNT 1
- z5 }/ e, r: e& |
#define PING_PONG_CCNT 1
* u' i P6 Z2 Z4 d+ f0 |
#define MCASP_BASEADDR 0x01D00000
' ~* L G9 j; f. m
#define Mcasp_RXEVENTQUE (0u)
( J; i* l+ [% t
& l# y" @- ?. U7 \
/* OPT Field specific defines */
7 L% o5 s9 Z5 V6 y2 B
#define OPT_SYNCDIM_SHIFT (0x00000002u)
0 M& \' Y; F7 a4 }" W+ S
#define OPT_TCC_MASK (0x0003F000u)
* i; f2 O: n( _2 D3 v' T( M
#define OPT_TCC_SHIFT (0x0000000Cu)
& q" `; `+ L. Y( f( C
#define OPT_ITCINTEN_SHIFT (0x00000015u)
/ J, f6 |0 A8 Y, Q
#define OPT_TCINTEN_SHIFT (0x00000014u)
$ C( n t$ @6 ]! x0 \4 l3 a
/ n. J- \ u- c) \; F' l4 q
char ping_buffer[PING_PONG_BCNT];
7 H$ `2 i8 _6 }9 Q6 ^
char pong_buffer[PING_PONG_BCNT];
+ R! d3 L, A/ X- @. s" x* ^
+ c& ^/ g2 }7 S9 J0 u7 l
O7 }' K. q. t( S X
4 v6 ?% X* e/ L0 d/ ^ h
3 F( v! b; d. N. Z* X6 l- s
static void ys_edma3_init()
; K! u3 W1 n7 s9 @! \" _# c! A7 _
{
8 `6 t7 r" e! t O+ J
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
1 G$ r: ^) W" ~4 b# y1 {% g% P' n# s
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
$ l' A% ]& f2 a: E4 I- r( z$ h
EDMA3_DRV_Handle hEdma;
5 ?6 k, T) g1 I8 ~4 H D1 y1 [
uint32_t chId = 0;
, }: G) O/ ~0 D3 c& H
uint32_t tcc = 0;
# S- W- c/ @& K! F
7 D7 P u" g3 ?# ]: t0 K
print2arm("edma3 driver init...",0);
1 h8 {+ d- w' B; L
9 h* R& ]9 u) |4 @( C+ Y _7 K; u3 n
hEdma = edma3init(0,&result);
/ e5 m: Z# {7 Y# M1 s$ x4 M- T* q9 H
if(hEdma)
! f, ?* J# [. I
{
) q! \6 g" T- O: n. U9 y
print2arm("edma3init() Passed.",0);
4 y* e1 d$ r, j n+ @1 A
}
% W. P# \+ u- N r* @5 |
else
* ^7 Q& X0 ~9 a
{
0 r8 }2 U" ` y$ h) }$ A9 Z
print2arm("edma3init() Failed.",0);
- l- C/ I' K( W8 I* t- _. M! r
}
1 p* E; e% z8 r5 @
! h: D; G' ^) o8 j c
if (result == EDMA3_DRV_SOK)
6 t$ K! X1 Q( L' Q$ ^
{
2 f# V) q. n$ [7 O
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
& B- l; O- W8 j
(EDMA3_RM_EventQueue)0,
* J, F8 p" A/ }6 t( F) W+ ~; F
&edma3_isr, NULL);
" G; w( G3 {: q. d- o6 U/ E2 y
}
) M% P) O: v; f9 ~7 R
( w! u7 I; k: E1 T9 J- g
if(result == EDMA3_DRV_SOK)
* L, O7 K! V+ j5 C6 v" d
{
& s. }5 ?" Z& |" q/ M$ t2 S% C8 V
paramSet.srcBIdx = 0;
2 S0 ~5 U9 T) a6 q: U+ s! y+ y9 n
paramSet.destBIdx = 1;
* W! d1 i3 L0 \. ]% Q! {
paramSet.srcCIdx = 0;
1 \( i2 q" J% Z. K6 x
paramSet.destCIdx = 0;
8 S) b2 ~/ |' [. q) T3 B
paramSet.aCnt = PING_PONG_ACNT;
l& |0 \9 l6 C3 T- o3 L$ F( g
paramSet.bCnt = PING_PONG_BCNT;
, | B$ m; U. \
paramSet.cCnt = PING_PONG_CCNT;
( p( R0 |0 f! T6 g0 _4 j1 m
1 d& s$ G" \1 T
/* For AB-synchronized transfers, BCNTRLD is not used. */
; u- C4 @4 b E+ p
paramSet.bCntReload = PING_PONG_BCNT;
$ {6 |/ I6 K* l
- D/ S9 k" W4 P- F
/* Src in constant mode Dest in INCR modes */
6 ?7 O" N) W, B
paramSet.opt &= 0xFFFFFFFDu;
/ l' G( O; `- {, u$ e
//paramSet.opt &= 0xFFFFFFFCu;
: e6 x! x) I* Y% O1 G+ [4 ?: r
& ^3 d, [! }+ p! x; U
/* Program the TCC */
' t# J9 ?8 I4 z% Q2 A
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
4 e5 E9 r, `8 C7 i
8 V# F9 {4 m4 s; R+ z+ f1 |
/* Enable Intermediate & Final transfer completion interrupt */
4 T9 e0 t/ c) n% o4 \
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
# y! Q( J0 {0 J
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
, ~" C" m9 E7 X# I+ Z; W7 G
* d6 ^, K) D7 C8 H |0 w
/* AB Sync Transfer Mode */
1 t& C Z6 }( ^# {% Q% c# M( R, u8 @! U
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
' j# u$ Y8 N% b7 [& F+ x0 g% Y( S
4 v& [4 n! `. }- e# k
/* Program the source and dest addresses for master DMA channel */
3 K( X2 [; `8 x! a' T8 u+ G
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
% c+ k6 h# M' i6 I( H
paramSet.destAddr = (uint32_t)(ping_buffer);
: b- ?( {3 t! O
1 f3 G! ^2 w2 A/ }9 i
/* Write to the master DMA channel first. */
$ W& ]; `7 O( s! J c4 u% G! U7 b
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
8 J; n) t+ v, S4 ]' ?+ y$ q1 A" r
}
! _3 o* l/ ^9 F* D- r6 |
" J5 R; d' q- ]1 x
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
% C6 c5 c* F* v o
: T5 S. {) x! Z) v5 l o
if(result == EDMA3_DRV_SOK)
5 ^) y0 E; R, ~/ z
{
# O/ u2 X# }& O2 P
print2arm("edma3 driver init success.",0);
% _% k. J# a( R) G) }" @& m D
}
1 T: J) \5 y2 ^4 m' Q
}
# L" \, C& H" e6 e8 o
8 B% A! @/ I. {6 Y) M& m
' E# l3 i1 o2 _7 V( w- k1 L
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
- E) k) [3 t. r% m+ i
# c3 G# O- n1 `
& u5 ~2 u- H0 P- k: t4 k! ~, B
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
5 a$ H1 _) K" j- J* A
每次DMA传输完成后都要再次使能传输
/ u+ V/ _# F" x2 U
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4