嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
* y; e- n/ a' J6 k1 _
#define PING_PONG_ACNT 1
$ K0 O1 v& a" `: A
#define PING_PONG_BCNT 8*32*40
! F; v8 ~$ T0 X5 m* v+ q
//#define PING_PONG_BCNT 1
$ [2 ]' P/ q/ ?
#define PING_PONG_CCNT 1
( o$ T: ]7 N, v+ m! Q; h
#define MCASP_BASEADDR 0x01D00000
# N1 W$ _/ p% M: D! S
#define Mcasp_RXEVENTQUE (0u)
+ H. A+ b# _4 H$ t( v& I
5 U S) \1 k& A* X
/* OPT Field specific defines */
6 J' K0 t# s Q" M7 R" y$ N
#define OPT_SYNCDIM_SHIFT (0x00000002u)
4 B" Y9 y s0 [1 U, z( K6 q7 V
#define OPT_TCC_MASK (0x0003F000u)
' G* n( }4 P, p+ ~
#define OPT_TCC_SHIFT (0x0000000Cu)
! t# f9 y2 }, l3 x: ~
#define OPT_ITCINTEN_SHIFT (0x00000015u)
9 z- A: c) A) a4 m5 M$ \
#define OPT_TCINTEN_SHIFT (0x00000014u)
5 j4 q( Y* Q3 Y3 J! N
3 H! t. X/ K; n3 d T/ P5 ~8 t
char ping_buffer[PING_PONG_BCNT];
* l( b" R/ z8 |' P/ [$ }
char pong_buffer[PING_PONG_BCNT];
7 Z8 v1 m, C* Y$ H, c
" L1 k0 x' a3 C+ r6 k" e
/ G5 y$ P% t) _3 z0 p# Z' ~4 b
6 ~( ]# H3 z" ~- |5 W6 H
6 C" b- y* s( J3 f: H" d: p
static void ys_edma3_init()
* k$ c( m+ Z" D* M8 W; v, K$ o
{
3 `9 Y" m5 ~8 T1 L1 m: X
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
/ H$ d- W* K i, X& k' z
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
5 p: }1 G( l/ G
EDMA3_DRV_Handle hEdma;
1 C$ z& X, |# F; Q: B
uint32_t chId = 0;
6 e! A" Z" G- N: e: `
uint32_t tcc = 0;
5 L) o9 l1 a& I" H5 X6 _1 Y
3 n' _, O3 B* i
print2arm("edma3 driver init...",0);
2 |4 A3 e4 r" b* k4 A) v
d) e+ Z0 s( r
hEdma = edma3init(0,&result);
' R- P8 s" @1 }( Y E' H& x% t
if(hEdma)
A; Y, |( \* X. S: b6 L6 E
{
& I* D' C5 g) X5 }+ W
print2arm("edma3init() Passed.",0);
' q _8 K1 b4 U$ z& m$ s
}
- k. F5 W8 B2 K
else
4 Q2 K! S; d' L7 I
{
) E' t) S" n6 j0 Q; v. f
print2arm("edma3init() Failed.",0);
. A6 Y+ p2 Z1 o* I% H
}
/ F8 i8 \( m7 O
7 \- b) r) d) O
if (result == EDMA3_DRV_SOK)
: c2 X& ~$ a& F% ?3 y0 V
{
* c% R ~- P) k, W* \) U
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
3 I: o$ S# P% o/ c
(EDMA3_RM_EventQueue)0,
$ \: n1 |6 d. m) W1 E/ S
&edma3_isr, NULL);
0 v" H. M: U# K- F1 S4 p8 ~$ ]! q) j
}
% S+ G6 Y* J( |! V! q
' b, G: A' C& _ R# Y
if(result == EDMA3_DRV_SOK)
1 c; D5 M* k! N) e# ~; X4 i
{
9 y, m l3 K$ q8 z) u$ [8 U# y
paramSet.srcBIdx = 0;
1 H3 K7 `1 I1 n* D9 H
paramSet.destBIdx = 1;
; A$ l. M- \ E, y; z V7 A6 I. j
paramSet.srcCIdx = 0;
: Q2 i: c$ [& B+ c t5 S
paramSet.destCIdx = 0;
4 L& G4 {2 Y/ P- a
paramSet.aCnt = PING_PONG_ACNT;
) I7 B% s1 D( T' {) S
paramSet.bCnt = PING_PONG_BCNT;
/ `0 @: X4 |. Z1 W0 X- W V. Q
paramSet.cCnt = PING_PONG_CCNT;
- m/ g# c2 h# v/ Z" z& E
& a5 u7 L3 F! `# F; @
/* For AB-synchronized transfers, BCNTRLD is not used. */
+ h9 V2 G) e- ]; L4 i* [
paramSet.bCntReload = PING_PONG_BCNT;
4 s1 a9 \8 h, l4 v' M8 w
4 X3 a1 b7 j5 p- Y; z1 m
/* Src in constant mode Dest in INCR modes */
9 F) b* ^) z/ z" y" r
paramSet.opt &= 0xFFFFFFFDu;
# b0 c+ u, v9 M! ?% v
//paramSet.opt &= 0xFFFFFFFCu;
/ I8 P8 H! x; z- I% ~
/ [) ~5 v3 E' d8 z) b0 ?
/* Program the TCC */
* s3 Y7 o* ~0 N$ H* [
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
, c7 n! x- f) x' `; p
- D: `% P" z' \' w F3 C; {
/* Enable Intermediate & Final transfer completion interrupt */
& W+ u: J* S; h! S- Y
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
8 e$ F, W. _) s4 K
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
7 S- c# v' G y& s
, v7 h% }, y; Z! m M9 m
/* AB Sync Transfer Mode */
4 }) D( X7 K6 a
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
2 b, B' p4 }3 f0 s* i+ W( @7 ?
) N( Z6 b4 E, h4 M4 `* H a
/* Program the source and dest addresses for master DMA channel */
6 g( I! }0 k* o0 X6 p$ m
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
( `0 y* Z5 S$ \$ u' a9 u+ `9 \) M
paramSet.destAddr = (uint32_t)(ping_buffer);
2 `, {7 E9 I3 z5 g2 m& B! b y
& o. G* |4 }) v$ T$ I, t. K
/* Write to the master DMA channel first. */
% N2 S; F2 o5 A' U D
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
$ y% ~- r4 Y1 H p& y
}
6 U- z' \2 ^& p' J" Z1 Y/ g9 m* x
3 R4 b, ]1 e& t. x
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
, q6 D! H( t% R* G0 W& g
1 j5 a% O# Z% j: S. Y1 }1 {
if(result == EDMA3_DRV_SOK)
" {0 b* Z6 R1 m& D+ K1 P* G. w m
{
$ [" c0 P4 R) E
print2arm("edma3 driver init success.",0);
4 h1 a. l2 j& [# X
}
' Q1 Z) b/ S5 W0 l7 [, ]/ m% k4 {
}
* \5 y) b* x: q' d
7 i% G: z ~* E1 h. A' K
( U: L, l- X1 e/ J7 x
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
3 U4 w7 K8 d. m% A1 b; u
% {1 q' M9 H) \0 k
2 o5 Q& h4 f: I# T
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
- Q5 Z0 u& |$ o8 h; y! a( I/ U
每次DMA传输完成后都要再次使能传输
. P. j. p+ G% o/ W
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4