嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
; K8 ~9 \) g# Y$ T1 N* K# g3 W
#define PING_PONG_ACNT 1
7 W9 z) U7 k7 [9 |( g0 X2 o& e1 h& P
#define PING_PONG_BCNT 8*32*40
* r$ a+ E) u7 U: P/ `
//#define PING_PONG_BCNT 1
% k& ^7 E* f# o1 @
#define PING_PONG_CCNT 1
5 v* o4 |5 }7 n& ~. l3 a8 Z
#define MCASP_BASEADDR 0x01D00000
- D- e1 a+ y4 H5 T. }- `
#define Mcasp_RXEVENTQUE (0u)
& x8 {2 q9 ^1 z% h7 ]) F/ X# \
! v2 e/ L- E4 P5 j
/* OPT Field specific defines */
/ k1 i# t/ p! C# g; h' F5 ~: S
#define OPT_SYNCDIM_SHIFT (0x00000002u)
) \4 O: @' c* q" I, z/ }
#define OPT_TCC_MASK (0x0003F000u)
& s0 Y* r& r0 V5 n. Q5 q" ]" N
#define OPT_TCC_SHIFT (0x0000000Cu)
) r: h4 L/ }& L
#define OPT_ITCINTEN_SHIFT (0x00000015u)
$ P1 H3 \1 b: n5 N) Q" K. L' ]
#define OPT_TCINTEN_SHIFT (0x00000014u)
6 C) o3 @- z' R% e# T
9 s9 z& R8 {. c& e3 {, ]
char ping_buffer[PING_PONG_BCNT];
# c% j1 Y v, W% ^
char pong_buffer[PING_PONG_BCNT];
7 v# N- ~* b+ L; ~
& i0 b7 W- r- X( z& c3 m2 ~
x% U5 Z6 o* ]9 [1 {1 Y2 R. @( ?
3 R9 B7 a$ P Q. h1 K8 O0 s" @
( G/ I: P& K+ q7 {$ D
static void ys_edma3_init()
9 z N0 O1 S# C
{
& {2 Y# G% a# h, t
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
/ M1 }( }3 @+ q2 S, @. S4 a! E
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
" ?* `( x3 Z( Y, U: B* r# E) s6 U, D
EDMA3_DRV_Handle hEdma;
3 {( e% N+ t: l/ ^9 ~& T
uint32_t chId = 0;
( \* Y) @; K* _( `1 F) S8 p. e' Z
uint32_t tcc = 0;
: C; S( T4 I6 g1 H
; T4 d0 u, t- b8 R3 Z
print2arm("edma3 driver init...",0);
/ U% \0 k1 e \2 Z
R" [+ O" z. Y8 Y
hEdma = edma3init(0,&result);
: L" i4 ?. \: u
if(hEdma)
' d; M$ A; o5 L: Q6 \
{
0 M: O9 d9 T6 H( ~$ e1 [( }9 {
print2arm("edma3init() Passed.",0);
; F- R( k7 V( Y5 d
}
8 R; N( o, j. {6 R. P, T. s) G
else
9 n' p$ V: P% X6 g( Q
{
: C7 r" \( f& d: x. o8 h6 h' b# U
print2arm("edma3init() Failed.",0);
5 x& y* d" Q% W7 I+ F
}
4 O& b# ^6 p, T* M% w
1 t. V3 e3 q3 q$ U2 @$ [
if (result == EDMA3_DRV_SOK)
/ y- X y1 T7 }" t& N
{
o# d+ w- g3 U% ]; e! k" @0 l
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
& g9 g. \% b2 V$ v4 D) Z3 v* C' I
(EDMA3_RM_EventQueue)0,
/ @! [" L) R6 w( G- j4 m5 {
&edma3_isr, NULL);
* \9 b, E2 z" A5 Y
}
8 A/ x0 @& y( B' B* e
5 A! {$ F& G& l
if(result == EDMA3_DRV_SOK)
1 W0 u M& G. g1 g1 o
{
/ F9 D5 o/ d3 |2 \3 a+ h
paramSet.srcBIdx = 0;
7 P1 U% ?1 E, h- B
paramSet.destBIdx = 1;
% j: w( P" W. f5 p7 Q2 H
paramSet.srcCIdx = 0;
3 M* E: m) }4 X/ ]9 q0 C
paramSet.destCIdx = 0;
# g* {. ~/ t3 J, W+ m
paramSet.aCnt = PING_PONG_ACNT;
) }3 K9 p) J, o* D% M$ b3 g) C; Q
paramSet.bCnt = PING_PONG_BCNT;
' g) ?+ d- P( x9 e$ E H* b# z
paramSet.cCnt = PING_PONG_CCNT;
% z+ r( e+ z' U+ i+ |8 C! Z& A0 e
, a1 ^4 a. a4 F0 B' a& W4 j
/* For AB-synchronized transfers, BCNTRLD is not used. */
* ~9 H- x$ H, e: g5 S
paramSet.bCntReload = PING_PONG_BCNT;
) C! F& l# k: r) u5 }1 V- f
* x2 m5 ~" Q, X% x4 e8 X
/* Src in constant mode Dest in INCR modes */
" d9 f1 w! r: t) s! q9 S
paramSet.opt &= 0xFFFFFFFDu;
% s% N& o- i' i
//paramSet.opt &= 0xFFFFFFFCu;
8 u: O( U$ N6 U" a) @9 \" A
) x9 ?( B) W+ U$ p w- C S2 `
/* Program the TCC */
) f" F( H- x! ^3 x. A4 [9 @2 j# R
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
! z8 L, M% h0 Q6 Q* |7 ]4 M9 ~
" I7 k& o' w) T! Q( F( w
/* Enable Intermediate & Final transfer completion interrupt */
$ X" E# ^7 A2 O; s7 W+ Z$ J
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
, O5 O+ O, Y; Z) R
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
& f# C! x- Y: w; J
' U; m6 R4 x$ d
/* AB Sync Transfer Mode */
: W: I, K/ g, s% T4 I
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
% }1 {& [1 O' r; x) g" T
+ w: {" D4 Y+ W. ?
/* Program the source and dest addresses for master DMA channel */
N* s( Z3 Q% h5 R% f9 ?
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
1 ^1 o" q; l3 C& }: Y& o
paramSet.destAddr = (uint32_t)(ping_buffer);
" l8 v9 W3 D1 b$ H/ n
, D# @* G. ~+ x
/* Write to the master DMA channel first. */
& t3 J- e# t- S* i! t" t0 U, n
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
+ X& ]' @$ S. p' _% @& Y- g0 B
}
* N% N( X. V6 F6 k9 ~/ x$ U
4 M0 D/ `/ D2 t- U4 E9 M* W9 E
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
/ Q) d* y6 `4 H
: Z S& |6 B% \# A* {( i2 ]
if(result == EDMA3_DRV_SOK)
& A0 V0 V. a0 G u! {/ j$ i
{
: h* u: E, X$ E
print2arm("edma3 driver init success.",0);
$ p: I) Q4 W( |; u- v
}
5 {! Y+ k5 r" [/ S6 V
}
& ^% h& @4 h1 ^4 V
2 |' y" P9 |) e5 Z
8 ~ X9 y* Y; q1 }: C
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
: C! p! H8 M; `" p# k+ C
6 ]7 Z: U9 U P2 g& B' J! @
# T( g H, Q3 A2 e- f9 T5 i: Y
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
, x Z$ }$ h+ Q
每次DMA传输完成后都要再次使能传输
: d. f* n$ [8 J/ N+ F4 K; ]0 T
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4