嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
2 r! y& C2 R4 Q! p3 B. z$ H" m3 T
#define PING_PONG_ACNT 1
, n, Z" e5 ^. ^. v, U
#define PING_PONG_BCNT 8*32*40
. L# n2 x* e0 h& H5 _( \- L r
//#define PING_PONG_BCNT 1
) s$ E7 Z# [. M/ o, ^# f
#define PING_PONG_CCNT 1
! F+ q$ D/ L: F) ]* K* \
#define MCASP_BASEADDR 0x01D00000
: U& Z7 H @$ W
#define Mcasp_RXEVENTQUE (0u)
9 J- |0 U3 X6 H6 @1 w
7 ?1 z. y4 B ?: T& m/ J/ p
/* OPT Field specific defines */
: M0 w4 F5 Q% @, y
#define OPT_SYNCDIM_SHIFT (0x00000002u)
$ n$ h" V5 }3 {6 W
#define OPT_TCC_MASK (0x0003F000u)
. F% W o0 U2 v& W
#define OPT_TCC_SHIFT (0x0000000Cu)
6 Q) D0 I. J( N7 g) K6 D/ q
#define OPT_ITCINTEN_SHIFT (0x00000015u)
- W8 z/ {1 [: U3 N
#define OPT_TCINTEN_SHIFT (0x00000014u)
9 v$ s6 ?$ O$ y% B1 g( @0 }2 j3 Q
+ U- s3 a) q, e) \
char ping_buffer[PING_PONG_BCNT];
# B; q" L2 [, P& T: P
char pong_buffer[PING_PONG_BCNT];
+ L! i2 q# O: F: ~+ y% l" Z
; D0 l. V# P: u8 _& h
1 V: d/ K; k, l# r
- r: u# c( Q5 V) t ^ I; L
% B6 E. p7 d" ]6 f; Z
static void ys_edma3_init()
. m7 }8 {5 l- f1 Y2 _! W
{
7 X/ B. X8 {( K
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
3 ? B8 o+ `4 R
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
# k0 s t( }- a5 L. X
EDMA3_DRV_Handle hEdma;
* \$ U {2 O: `4 y
uint32_t chId = 0;
% W- g! i Y$ p1 y6 v6 w! M
uint32_t tcc = 0;
; X. R; ~( q7 h0 p r8 H7 {
1 s$ ^' }* g& P1 @( V |) c
print2arm("edma3 driver init...",0);
8 k. ?3 _6 M2 d/ g( K7 b. U
/ {- z( C, I, d( r& |' W
hEdma = edma3init(0,&result);
' G( \7 x: C. Q5 r0 h5 B' P; _' M# |
if(hEdma)
4 r9 t% e& D9 v* h$ i
{
2 G k7 g, I" _
print2arm("edma3init() Passed.",0);
! i$ \- n& s4 ~! M9 t) J8 V; P
}
# s' c* B: z( c4 W6 r7 u
else
7 s: q/ M" |) L5 ]# l/ n- i
{
! |: A. P7 u/ f
print2arm("edma3init() Failed.",0);
0 [. ]$ j8 t$ w
}
: x# Z: P' k2 [! A' `( r. ~
- ]' _; @, @& R: e/ H0 m
if (result == EDMA3_DRV_SOK)
. s8 O8 t2 Z' [3 \, v
{
$ z4 q$ ^# x6 |" s+ y$ s& U
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
* W* [/ H; B: ~: I/ a6 j. r1 e
(EDMA3_RM_EventQueue)0,
5 Y5 X2 q6 c3 y+ X& d) m
&edma3_isr, NULL);
) m3 ^- ~: y* W P5 d. p
}
7 @+ ^+ `& ^- F0 G8 k1 N
- ]4 m4 ^1 q2 B) q
if(result == EDMA3_DRV_SOK)
# Z# H1 P% D4 Q. U. g. D
{
! }! R1 }; I- d7 o7 n( F7 z
paramSet.srcBIdx = 0;
9 R% {2 u, Y( @2 l
paramSet.destBIdx = 1;
) O# G. ]3 f1 G# E r- e9 L% G
paramSet.srcCIdx = 0;
5 i0 y- x5 A: k7 c2 b7 F" K1 z
paramSet.destCIdx = 0;
- { X$ t3 K5 t
paramSet.aCnt = PING_PONG_ACNT;
8 P) k6 c: z" q2 V* L
paramSet.bCnt = PING_PONG_BCNT;
( |& L; Z- |2 Y ~
paramSet.cCnt = PING_PONG_CCNT;
: z2 m* z5 U6 u. {2 b
9 H! I v( s4 p5 S
/* For AB-synchronized transfers, BCNTRLD is not used. */
~' E# _) u9 c# `( a# D
paramSet.bCntReload = PING_PONG_BCNT;
9 G8 ?! m- G7 [, |: ? K5 [3 d/ o
! m p* @' t0 r4 e; I% m
/* Src in constant mode Dest in INCR modes */
, Q+ i$ ~$ P- H a- }
paramSet.opt &= 0xFFFFFFFDu;
& ]/ J# ~0 j G5 c3 Q0 s O
//paramSet.opt &= 0xFFFFFFFCu;
* p8 X* x9 ~! K; [2 l" ~( W( c& d
8 _" ~+ B# |) Q- p) q7 S
/* Program the TCC */
, H! e' i' H/ F v$ @
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
( d& R: m* r- a3 i \
/ y+ L) a$ A2 H& i. B3 k; z
/* Enable Intermediate & Final transfer completion interrupt */
6 o D9 F: x! ~! y4 A' Q5 P
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
$ H3 D2 f! _2 q6 ?" P: d
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
5 ^/ J! [, O# M3 U& l
& E$ b; i+ _6 T: W1 h/ _& z
/* AB Sync Transfer Mode */
. ?+ H3 l7 T1 ~( ?. i+ @9 g+ J
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
, Y& C4 t3 P$ X, \( i
x c* Q5 o- B8 W9 Y, R6 x
/* Program the source and dest addresses for master DMA channel */
2 j9 f- n6 O- P. p; B( c
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
! p7 s% v7 p# H i2 O
paramSet.destAddr = (uint32_t)(ping_buffer);
9 i8 w$ g% V' n- A- Q
+ N9 {) R- X- \2 l
/* Write to the master DMA channel first. */
. P8 O. Y5 Z1 g k8 o2 k
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
% M! f' F' G2 J( p
}
: p* ?6 w1 V; m8 ?3 q/ K4 o
' ^" z5 U3 ?7 l8 e6 K2 X6 ^
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
& n" l+ G! Z x# A
8 c- K9 i3 G2 h
if(result == EDMA3_DRV_SOK)
4 Y" P- u1 B7 e" F* ?3 @
{
& h3 r. ]; `. J" { \
print2arm("edma3 driver init success.",0);
* r, N$ I$ n3 |1 L ?/ J
}
7 t: W& E& A; _% n
}
6 R" X5 Z2 u3 u' ]
, `. B8 W0 P9 r" R: e9 _/ G1 ?
. |) _7 A" X) C3 Y. e d- R
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
6 M) L) L% g8 c' i6 ^. B' S
2 b0 _# c1 g- Z6 q( L
7 T; H5 z% R$ j2 k( S3 O
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
0 `% _! P8 p: B. o( J( E; c
每次DMA传输完成后都要再次使能传输
# m5 n7 U- ?- g( [5 o( {0 q( o
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4