嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
* ], o9 S2 c1 J# P# y; r
#define PING_PONG_ACNT 1
; F8 B, _( e/ M2 [
#define PING_PONG_BCNT 8*32*40
6 Y9 n2 n) u9 L) L" H
//#define PING_PONG_BCNT 1
4 M& q/ C5 |( C6 U( s& r& ?7 v
#define PING_PONG_CCNT 1
+ W+ j+ W$ p: }" @9 t8 o4 y V" y, e
#define MCASP_BASEADDR 0x01D00000
) n. l+ t7 x. }7 G9 Z5 }4 p
#define Mcasp_RXEVENTQUE (0u)
7 G3 O6 H/ n# W0 O8 r
$ e: Q8 }* Y/ e, m# q; r
/* OPT Field specific defines */
# x1 |1 l3 W( x+ W& z6 M( W0 f
#define OPT_SYNCDIM_SHIFT (0x00000002u)
' d! a6 Y9 \8 F \9 G& C
#define OPT_TCC_MASK (0x0003F000u)
7 L/ Z* l+ A) e4 [6 K6 Z7 n
#define OPT_TCC_SHIFT (0x0000000Cu)
/ i6 h0 X, y0 e- p- O
#define OPT_ITCINTEN_SHIFT (0x00000015u)
9 U' |$ S" Y r( a
#define OPT_TCINTEN_SHIFT (0x00000014u)
+ h; L/ Z$ i; O2 u% O* v: i& K
K" c8 v; S- l- a3 l* L
char ping_buffer[PING_PONG_BCNT];
K+ g. J0 N9 B7 n% m3 i
char pong_buffer[PING_PONG_BCNT];
4 ~2 f: ?5 c: g4 m. Q8 p; S
1 `' }% ~0 o& f4 H8 b) [
5 {* n8 q" F9 \
, J/ K' k, T5 u" V7 r& o6 t/ _6 \
+ K. F' t$ l3 t: Y3 a) F- n
static void ys_edma3_init()
8 N. t. G/ ~5 o. f G
{
1 e% S+ Q9 l) i* G9 Y
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
! Y, |, V; j, l9 @- x4 p0 ^
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
3 v- Y& r+ J4 t$ b1 F
EDMA3_DRV_Handle hEdma;
1 u1 M2 v0 Q) T2 F' C4 _! ?
uint32_t chId = 0;
0 P5 C T8 F% u1 B9 A+ @
uint32_t tcc = 0;
) ^8 ]. [- `! ?$ a
+ N* D" x) l" V3 H
print2arm("edma3 driver init...",0);
4 h. J# x; ^0 ]3 |
$ Y e5 e$ A. y% e
hEdma = edma3init(0,&result);
. s0 w& Y5 b ^7 J$ L; I
if(hEdma)
! U/ F V" _. g6 p6 c
{
3 g) Z0 x9 X& }9 W8 o I
print2arm("edma3init() Passed.",0);
9 t& ?- [2 ]$ [/ a9 h0 i
}
( G/ p1 x9 {2 u
else
/ ^/ i& `7 g0 v9 Y e6 x
{
5 o2 T4 {: X5 g
print2arm("edma3init() Failed.",0);
6 W, Y: ]8 r# n9 H( r+ Z# W
}
% s; z ]" }/ x" ? I3 K9 P
; }% g5 B( D% Z7 H" m3 N2 O' l0 Z
if (result == EDMA3_DRV_SOK)
! f& O& X% j8 ?8 E5 X1 n
{
* c/ N& @2 Q: S1 \
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
8 N, F2 ]' t( R4 ^: G
(EDMA3_RM_EventQueue)0,
1 M O( v7 K( U- ^8 K
&edma3_isr, NULL);
2 B- S5 y9 C( V( K
}
$ t" [0 n' S/ L
, h( h7 M% @, b+ r# e# g/ g" l' }$ j
if(result == EDMA3_DRV_SOK)
1 Y: m. |8 b& M( a6 S
{
2 }& b# y f& {$ | \+ L5 Z1 C8 T+ @
paramSet.srcBIdx = 0;
" f( x1 q. z/ B# D. Z, O
paramSet.destBIdx = 1;
2 Z8 f9 w- Y, h% f" N
paramSet.srcCIdx = 0;
. ~5 F6 w; H2 z
paramSet.destCIdx = 0;
3 b L+ Q8 i1 o+ l# E0 C" {
paramSet.aCnt = PING_PONG_ACNT;
% v" B) m. @# L% T6 J1 E
paramSet.bCnt = PING_PONG_BCNT;
3 ^: H- d, y' _: Y0 l0 }8 i! T$ |* F
paramSet.cCnt = PING_PONG_CCNT;
; x- I& c% y/ K! z
6 Z# Q3 v9 S2 E! }# E: I
/* For AB-synchronized transfers, BCNTRLD is not used. */
8 u; }+ S" k/ j: B' k6 z; B
paramSet.bCntReload = PING_PONG_BCNT;
5 f; _8 N. ^* m `# R. o% w
* n1 a6 E+ ]3 f4 b
/* Src in constant mode Dest in INCR modes */
. B& {# L5 T; j. u( X2 z
paramSet.opt &= 0xFFFFFFFDu;
/ G: P: ]: J; N
//paramSet.opt &= 0xFFFFFFFCu;
8 O3 n+ R) D! h: {- V
0 `1 R( {2 Q0 {% @
/* Program the TCC */
3 K8 a3 N! Z9 X3 U" k% w1 {4 `
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
( A" ~! Q% C$ |% ^: D. B
0 c! t- L+ }- _
/* Enable Intermediate & Final transfer completion interrupt */
9 v$ _, p0 l! g5 N8 {6 x8 ?7 O
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
; a# Y' H9 `2 b, ~7 y
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
# ?# |4 n5 M n
& k2 n6 {/ j: f" E9 ^" _* O: A
/* AB Sync Transfer Mode */
( {& p3 R9 D, K2 \2 |0 Y4 U5 G: l
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
# M; ]- w7 {+ o( t3 H$ R
, X' K0 W) E% c6 a- e+ u) O F
/* Program the source and dest addresses for master DMA channel */
$ p- s5 Y4 g* T4 _8 [- A" X1 ]8 {
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
3 A) y, E- A; J
paramSet.destAddr = (uint32_t)(ping_buffer);
v% }: Z( {" i9 p
! e$ W+ [% h4 w3 y V' I9 \8 S
/* Write to the master DMA channel first. */
$ U, m2 M8 c0 q9 E$ ]9 [7 m5 G
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
' O- ]% X5 X7 A4 t
}
; p5 [" N4 `) I: Q
, T; Q+ @/ F% d$ R: j4 t `, G$ ~
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
% c' k; `& t4 D1 h2 P
) `6 e8 r1 k3 N. r, S1 c3 j
if(result == EDMA3_DRV_SOK)
, w( g' r; c, d9 v3 j5 _7 T) T
{
2 V9 x0 p% p T, L% [# j
print2arm("edma3 driver init success.",0);
( ]. r5 c4 f1 J
}
) W+ j/ g- u. J6 Y, O. h
}
! A9 }. g: P0 A1 N
' _ w* P s" r) w9 n; |: q
* j% t+ g4 P" O: k
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
X7 r' u7 J3 y) T+ }* H' }3 d2 p
$ |/ i/ q6 g7 u. ^4 b% J- H- H
; }% [4 I) _ h0 X$ i% g. U5 Q, f
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
' @5 O$ ^6 @" N# H7 O) F
每次DMA传输完成后都要再次使能传输
" n1 I' F4 |: m: i& V2 \* [
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4