嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
1 I" I) i% f& N0 D
#define PING_PONG_ACNT 1
$ a, L, n3 t. s" P) e" o
#define PING_PONG_BCNT 8*32*40
. Y* [) B: y! W- k& R2 [9 @
//#define PING_PONG_BCNT 1
- V& p$ ?( t2 P, d( x8 c
#define PING_PONG_CCNT 1
" i; o( q" d* m3 w& y. T& ?+ `* G
#define MCASP_BASEADDR 0x01D00000
9 v Z* f0 F2 T! K0 w& C
#define Mcasp_RXEVENTQUE (0u)
8 ~0 e, Y8 w' P: n$ c
! z( I8 N0 z% } l
/* OPT Field specific defines */
* K9 ]5 @; x" s! U9 G! D
#define OPT_SYNCDIM_SHIFT (0x00000002u)
; }. U% E4 P0 t9 a8 y* Y( m
#define OPT_TCC_MASK (0x0003F000u)
( {* u" n# ~% b/ W
#define OPT_TCC_SHIFT (0x0000000Cu)
4 e) |1 t7 h7 ?' ~/ u
#define OPT_ITCINTEN_SHIFT (0x00000015u)
7 E5 o7 { b, l% b4 D* l2 W
#define OPT_TCINTEN_SHIFT (0x00000014u)
. {( j- k' h) R- c7 L3 J
* ?( e- ~6 U3 y4 e7 O: Z
char ping_buffer[PING_PONG_BCNT];
N4 V" e( u, S h+ V9 Y
char pong_buffer[PING_PONG_BCNT];
v2 {/ `% U( c# q9 s
7 [1 X- ?, x5 y! S" Q" n! t. C
$ i# n3 T6 P+ s- M H4 n! K
7 v( ]0 O) M( J& i7 c
4 L F4 z1 H9 e, K; @: u7 Z
static void ys_edma3_init()
?: h4 V+ H; q9 R8 b n
{
) D4 P: c/ T* ?
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& l5 h; _: m/ r9 y& f' c
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
7 C1 @6 T. `5 T4 I& K2 k9 F- k
EDMA3_DRV_Handle hEdma;
) v' H% X! ^9 n1 `( J4 [1 O1 l! k
uint32_t chId = 0;
3 ?6 d- u& X9 m1 F6 n; c; ~- m) k
uint32_t tcc = 0;
8 N/ g7 C3 {& Q/ U! M
/ b9 R, h0 N/ W1 U
print2arm("edma3 driver init...",0);
8 P" ^7 @! ~: a2 H
* y, d; z1 o+ o) z+ _
hEdma = edma3init(0,&result);
" x* V+ P+ S9 i- f/ K* j, _& w
if(hEdma)
- T h3 O, H. ~" e
{
* m% ?7 s/ J+ G3 o( l
print2arm("edma3init() Passed.",0);
% H5 f3 ~% n0 K) S
}
2 F7 E# `; r N$ a2 W! h
else
2 @8 i i/ L* Q
{
$ c' R: _& n6 O5 h* E0 U
print2arm("edma3init() Failed.",0);
* r. u/ F5 m8 R
}
) o! r2 I3 g7 t x) L4 N
8 f) V- N5 }( e* z5 v( A( P
if (result == EDMA3_DRV_SOK)
! v b4 l4 b4 v; ~, F* y
{
2 k0 Y6 k, e1 a8 Y% K( @+ N
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
7 G0 _* O! L2 R2 |: u) X! p( j
(EDMA3_RM_EventQueue)0,
- b) B& ^ n1 `* B- A
&edma3_isr, NULL);
/ p- `' C2 Q% N4 W R- m) \5 d
}
: l R/ O- w+ A7 P
) U$ N |; I: B, Z
if(result == EDMA3_DRV_SOK)
& Q. k! `6 V; g: D
{
7 v- d0 W3 B8 }" D; \. o
paramSet.srcBIdx = 0;
/ e- C J/ K3 b5 q8 T. T* o
paramSet.destBIdx = 1;
4 \* j8 S: v" F7 T% ]
paramSet.srcCIdx = 0;
5 @& F5 {- U c" z4 Z
paramSet.destCIdx = 0;
8 j* y# |( H5 w6 ?
paramSet.aCnt = PING_PONG_ACNT;
c6 t# A4 i, w- F5 z/ Q' _
paramSet.bCnt = PING_PONG_BCNT;
$ `9 N6 L! w& t
paramSet.cCnt = PING_PONG_CCNT;
% L, }6 R! o( G; ^
% X* ]1 w- U& [/ Y2 k* \
/* For AB-synchronized transfers, BCNTRLD is not used. */
) O! I0 k) I! I% J9 t
paramSet.bCntReload = PING_PONG_BCNT;
! o8 ?; O. [" b" N6 ]
$ s7 G. y S% T; y, f
/* Src in constant mode Dest in INCR modes */
. ]" P0 D+ s/ _2 Q' _+ {
paramSet.opt &= 0xFFFFFFFDu;
# \3 P% h9 y1 l* S7 a
//paramSet.opt &= 0xFFFFFFFCu;
; W3 X7 f4 a; P; p8 e
3 N% f3 O3 y0 ?2 i7 s' V$ q% \
/* Program the TCC */
/ d3 y1 X% p9 D7 Y
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 X& b! g7 L6 r! M- u
+ Z4 v2 L' Q* ^' I6 I+ G4 i
/* Enable Intermediate & Final transfer completion interrupt */
/ N* \- q/ V c/ S4 b5 i$ p
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
+ N6 L7 F& O5 K+ ^
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
' M- O/ }, Z/ p" S3 T( d! O
, V3 D: P0 J0 e9 O5 u$ p- n
/* AB Sync Transfer Mode */
1 f# [: l; c( R* r# K; @4 o2 n9 q* m4 [
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ m# Z: z* \" V2 f
6 W0 x0 {1 Q# V y* w4 K$ O3 ?
/* Program the source and dest addresses for master DMA channel */
6 b. z$ ^3 a% @0 z+ s
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
6 B! x- B% p- C& K
paramSet.destAddr = (uint32_t)(ping_buffer);
) @' w, s0 B9 c7 z) W8 Y1 \
/ H: A d& r5 a% h0 [1 ^, g
/* Write to the master DMA channel first. */
' \& m4 ]7 c- T) m' P: O" Q
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
; v4 R3 K) \: t9 @1 b
}
% [* @" W" B" ~: w) B3 W
' m) _3 P, Z6 |! z
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
, T$ z N1 ^# @) Q
! y* Q5 R0 o3 f
if(result == EDMA3_DRV_SOK)
3 k. A$ E4 I' T$ ?, U7 H' i
{
$ E% L# J* y$ o4 }
print2arm("edma3 driver init success.",0);
4 j1 v! \$ h) M% o6 d
}
+ t' b+ A$ g9 N/ n1 Z9 ?
}
. u8 ^" }: a1 p, U" s
k: M# t5 G7 b
& j, E' e6 l- c
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
. }: ]: n2 k2 R! @$ `$ d1 F. x- O9 Y
* X$ E2 l# ]9 L% z
% I3 h, {# P) ?* G& B- o
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
0 N, b* e/ o+ O
每次DMA传输完成后都要再次使能传输
" v9 [# i0 o% S6 S4 S$ a
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4