嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
0 x) H6 U4 t, L
#define PING_PONG_ACNT 1
8 \+ E$ A$ Y0 e8 u! o
#define PING_PONG_BCNT 8*32*40
" W" Y- }8 }4 w. ^2 N$ F& g1 }" a
//#define PING_PONG_BCNT 1
" i6 [$ v+ {- |- ]3 E; }# M
#define PING_PONG_CCNT 1
% y. e A& h, u
#define MCASP_BASEADDR 0x01D00000
+ r$ p0 Y* L' W' Y" @* {; E' S% Y
#define Mcasp_RXEVENTQUE (0u)
' @& u$ Z6 Z6 {1 n% G+ Y! F
! e. C1 V2 s6 t$ w2 `
/* OPT Field specific defines */
) x6 b, [5 d+ Q/ W% O6 K, I$ H
#define OPT_SYNCDIM_SHIFT (0x00000002u)
# l: p5 C: F: M8 P1 F
#define OPT_TCC_MASK (0x0003F000u)
4 M, S: s0 Z( z- _! M
#define OPT_TCC_SHIFT (0x0000000Cu)
6 w9 g1 r2 P, c
#define OPT_ITCINTEN_SHIFT (0x00000015u)
, J+ f! P' L. P& I4 ]
#define OPT_TCINTEN_SHIFT (0x00000014u)
1 }* ~8 D: C8 I6 Z" g4 R( d
" z6 |6 [1 t( {# c) R
char ping_buffer[PING_PONG_BCNT];
! J- X+ n6 e8 Q: V% r) l
char pong_buffer[PING_PONG_BCNT];
; I' q, ^! j; d
+ ]7 m' [' w% n
: W) l$ f" v# K: `2 M& v
) i1 t1 i3 W# D) }- x6 F
9 b- G; `8 }5 g
static void ys_edma3_init()
) X/ K( q* Y5 d
{
, w" N9 W+ |& [; Y
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
! a3 R& y) f# J6 O( y. E; r* O
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
% J0 w8 f* c" D' R' h6 u
EDMA3_DRV_Handle hEdma;
; x4 c* ?! t/ e# u6 ]/ b0 h
uint32_t chId = 0;
! F ^# v% F1 P2 b
uint32_t tcc = 0;
/ Y7 O/ U+ }) I2 a: R% w& l+ m) c5 X
" N! [) X1 D( Y; U4 Z+ k
print2arm("edma3 driver init...",0);
) `" a8 m# m! r6 q
# [( @# i9 H4 O! _% m
hEdma = edma3init(0,&result);
/ ^+ g" C, I8 s7 ?
if(hEdma)
0 K9 P* W; z0 g
{
B9 T7 d u7 d. [# F
print2arm("edma3init() Passed.",0);
- ?* |" v+ r" Y8 I! R# i; v7 U
}
* v0 }2 Y& q1 c& n. Q& i
else
' C5 d A: K5 k; f4 t% K
{
# u/ O2 \) ~/ k, c
print2arm("edma3init() Failed.",0);
4 H8 z- r0 @# _4 }
}
* w2 {1 n- ^0 x. D2 D b
% c$ [# ~1 m+ E a! |' B) h/ a
if (result == EDMA3_DRV_SOK)
" q& S) l q2 p4 Q9 f
{
7 u) j- E0 z7 u# S- _( g
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
/ n2 i5 S& d2 M) ]$ g
(EDMA3_RM_EventQueue)0,
$ i7 o- W- H+ j: ?3 ]. O
&edma3_isr, NULL);
& a, m! u: U& V
}
, W) ~8 [& V4 z
7 y; i" i% w" g3 ~& C$ w
if(result == EDMA3_DRV_SOK)
* ^% [+ S7 O: h2 l2 ~) m/ v
{
( n( L( k4 Q! u' Y; d
paramSet.srcBIdx = 0;
0 S# v5 U4 i. j" F8 ^
paramSet.destBIdx = 1;
! D* Q" C0 Q6 b0 m6 H
paramSet.srcCIdx = 0;
( K! i. X9 o6 L% U) }
paramSet.destCIdx = 0;
0 t$ L6 k+ t. D# U9 X
paramSet.aCnt = PING_PONG_ACNT;
^, ^2 J6 ?& K% W3 v7 ~+ z
paramSet.bCnt = PING_PONG_BCNT;
$ [% P, b- c4 t' ]4 p/ j
paramSet.cCnt = PING_PONG_CCNT;
% ^3 r) ?" [! y3 z2 T+ N: t
5 H( j4 {. Z. y
/* For AB-synchronized transfers, BCNTRLD is not used. */
8 e* q" S; q4 w7 j' i% v Z+ r+ r
paramSet.bCntReload = PING_PONG_BCNT;
8 j$ x: P8 P3 u0 ^3 L
! h8 ~7 c& a9 s$ S; b2 N- f9 `
/* Src in constant mode Dest in INCR modes */
R8 ~; ^0 b' M, @" L- u. T' P$ k
paramSet.opt &= 0xFFFFFFFDu;
" a! \) ~* }# t" b$ l) K% q
//paramSet.opt &= 0xFFFFFFFCu;
3 p3 c- {; F# t/ F. B' `0 \. A
. [ J9 \9 K4 @5 E5 r3 s
/* Program the TCC */
) \( Y1 i8 ^) Y5 ]' T
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
) u# R4 J$ F- j
5 y! N. J* v7 x. [
/* Enable Intermediate & Final transfer completion interrupt */
* u) X/ x6 s! M, B4 C2 |' G) D
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
- ^$ E+ W1 e) T( l+ K
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
( w, Z1 R0 w1 F. _6 T- Y# W
9 b% I# P6 ~. B- n$ {" y L
/* AB Sync Transfer Mode */
) v# ~. M/ r, q/ W3 x
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ V7 r. h/ O/ U, H) e& O; m
3 w- K0 `' [' g* t& J
/* Program the source and dest addresses for master DMA channel */
5 u; {# W, F0 \0 @* _2 G& f
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
: R2 r9 X+ Z& i; Z1 E L
paramSet.destAddr = (uint32_t)(ping_buffer);
. ]1 Z: c1 m0 X8 o$ @
) f4 c5 X; c& m E# y1 k' {3 A
/* Write to the master DMA channel first. */
2 o: q& D( J3 Z# g
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
- _! R) ~' B# \# I" u& C7 i
}
0 |( T& F9 i1 v4 U
0 m) C/ w* ^/ r0 w- e" e$ v" h
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
( Z" h' M7 D- w. J
; b# z8 y2 P3 e2 z6 s% a
if(result == EDMA3_DRV_SOK)
- ^- ?# |5 |* ?- k, {
{
. N: I; m: x$ q" ^
print2arm("edma3 driver init success.",0);
" \8 p9 d4 h& N, p
}
6 K0 [8 k. H* R h0 k% f% S
}
- e7 U: f9 H- ]! n# y" j' w
$ a% J- N: ?, D5 M1 P: g4 {
$ o+ O& ^1 l* P5 a' c& o" {
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
# P) x5 x( H2 J" Z) n6 [+ d: T
- T# B# f4 m% `, }/ _8 q7 [! w2 n
4 E$ P4 W7 Z F' K: B/ ?0 T
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
- M, u3 ]3 W0 y* k4 e
每次DMA传输完成后都要再次使能传输
+ z7 A* z* U% ]; f% d/ H) Z! p
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4