嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
7 @% |9 c& ?/ y1 Q
#define PING_PONG_ACNT 1
7 e- |$ g1 _8 H1 L5 N7 B: l- Q
#define PING_PONG_BCNT 8*32*40
' P0 P4 {, L ~9 ]5 q/ k/ W) t
//#define PING_PONG_BCNT 1
( N$ Y4 X4 a6 F( Y% j9 k
#define PING_PONG_CCNT 1
/ k5 Q& O% f2 q" i0 c
#define MCASP_BASEADDR 0x01D00000
/ z: c; j/ f9 `. {+ i4 X2 Y' v
#define Mcasp_RXEVENTQUE (0u)
: C: B2 V' G# c
4 x V( y. [; p' J' A
/* OPT Field specific defines */
8 r; h$ B) _. \% {0 J# ^3 O$ L
#define OPT_SYNCDIM_SHIFT (0x00000002u)
& h4 g1 I/ D% @0 w+ _2 x
#define OPT_TCC_MASK (0x0003F000u)
! ?& \ a; ^) ~3 {6 R a
#define OPT_TCC_SHIFT (0x0000000Cu)
5 W. g0 Y. Q) M3 g/ ~+ A6 [* V
#define OPT_ITCINTEN_SHIFT (0x00000015u)
2 n, H* r! C2 {" |
#define OPT_TCINTEN_SHIFT (0x00000014u)
) ?# K5 z( q: N' b3 p l
/ k" S$ J9 ]( k( M$ Q, ^
char ping_buffer[PING_PONG_BCNT];
% f1 m3 r7 O/ K3 K1 U
char pong_buffer[PING_PONG_BCNT];
/ g. n: J8 \" a0 t' @ X" x7 S+ K
5 j0 X; n2 A' o# e
6 b1 G& ~$ v+ g# Y, `: X
; X6 T9 |! _+ J" Y* }. w" w
. J( G5 u5 Q+ g% p1 i7 a" x$ B
static void ys_edma3_init()
% l% l- n: {: I% L# U. E2 B
{
" I4 n! F" o+ M
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
! s" \! ?8 V+ k* }! K4 R" R
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
' L5 ~! E$ W1 `& G
EDMA3_DRV_Handle hEdma;
: b+ Z/ J0 h3 f% o; U! M8 W7 n
uint32_t chId = 0;
9 Z1 ]8 Z: H ^9 v P# \# r
uint32_t tcc = 0;
7 b3 o& r+ T, l7 n# q4 p
: `8 h7 h/ W! f. y+ j* h
print2arm("edma3 driver init...",0);
( p) P% [: h% W" I
3 }) x2 f7 a3 k
hEdma = edma3init(0,&result);
. l' p# W# d$ Z8 o6 m5 \
if(hEdma)
) [" G" }. R& e/ ^5 d# G* J; x
{
. |- f; [9 m# m" c8 O
print2arm("edma3init() Passed.",0);
/ S* a7 \+ Q- P' q+ \
}
+ H8 M6 w; h3 n5 T' {0 \
else
1 m2 i3 x; k% @* I" J5 f
{
- C6 y' L# |% |! O
print2arm("edma3init() Failed.",0);
& n, w( l6 {- n0 w2 y2 ?# {2 i
}
4 V+ f8 o* S/ z& B/ g; p* u
5 y7 @- T9 ~/ ]) K3 H
if (result == EDMA3_DRV_SOK)
J0 }+ X/ a! G
{
6 ` p4 Q$ ^4 N( b/ ^: a
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
' I, H0 X8 G& F# m0 X) t( R
(EDMA3_RM_EventQueue)0,
9 Y+ }8 ^9 p6 }2 X( y0 `( J$ P
&edma3_isr, NULL);
4 H z! v. D/ }' |% x& @
}
" G# B( Z9 x# I0 x4 c5 s8 G
5 L& ?& i& \" o* W% F( M7 G
if(result == EDMA3_DRV_SOK)
& W7 H' ?6 u/ I& I
{
& T. y9 j" F" b8 S
paramSet.srcBIdx = 0;
" m: x' x/ x0 i4 \: B3 B( R
paramSet.destBIdx = 1;
! V& v2 v, w. U4 ?) Y+ e
paramSet.srcCIdx = 0;
1 l) A2 A5 O5 p" O
paramSet.destCIdx = 0;
. \% y0 j0 x! s8 I
paramSet.aCnt = PING_PONG_ACNT;
/ E8 O$ K% g/ r4 M
paramSet.bCnt = PING_PONG_BCNT;
" J# [0 y! G6 e! m
paramSet.cCnt = PING_PONG_CCNT;
' h, b7 a( |* h- ? `
G$ p3 t' k, G8 L3 h
/* For AB-synchronized transfers, BCNTRLD is not used. */
$ U& L" [' v1 N/ g6 a
paramSet.bCntReload = PING_PONG_BCNT;
, s V; m" X' ^. [; D
8 w8 X) z# y. Y7 r4 t2 w
/* Src in constant mode Dest in INCR modes */
( N/ f7 I# I; _, B' k
paramSet.opt &= 0xFFFFFFFDu;
; V* L7 _6 ^6 j8 M- h
//paramSet.opt &= 0xFFFFFFFCu;
' L% z5 |- U0 W9 v; p( \3 j' d: b g
$ g3 U2 y! ~' @ |! z, @
/* Program the TCC */
* \5 ]3 t# C+ C- G) L0 X8 a- `
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
! k" w: M9 R- S. ?* ]
5 L0 V% ^- S; ~ } [" e
/* Enable Intermediate & Final transfer completion interrupt */
! q- \% P0 Q' }
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
0 w( s7 t2 N8 |1 o9 E' g% ~3 j
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
+ r# F) L6 B7 O( ~
; s# [+ e( k0 O8 Q
/* AB Sync Transfer Mode */
3 F8 `2 V: U7 _; j# l+ e( e
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
- \- E* A& r9 X' `; P4 J4 Y) W' v5 e
% N# C L2 z- w7 A2 y* P: h
/* Program the source and dest addresses for master DMA channel */
6 U5 I$ v6 D) w2 G, @
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
0 w* t7 x( R* n1 D
paramSet.destAddr = (uint32_t)(ping_buffer);
5 S% }% H0 P/ Z$ R
& j, E4 f$ O9 N4 |8 p
/* Write to the master DMA channel first. */
- M( T8 q; N2 Z/ E, q/ p
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
& T/ H% |& m4 M7 y# H0 T% W( A
}
+ c+ M" n* g) }/ y/ n+ `
9 l! H0 V2 C- i. D9 t
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
- k; O$ T. E+ }; l0 J% J" U
" [ e9 d8 W! z, o+ o- D% |6 B! V
if(result == EDMA3_DRV_SOK)
( {' S$ D3 J# ]6 D% _+ C
{
3 ]. w, k; `! N2 `
print2arm("edma3 driver init success.",0);
- @( D3 H4 B, U4 k% K
}
* t7 ]) |* N8 k
}
3 u4 o9 X1 n4 U! ^7 e& m( @
' \# E1 D' Z, i' l
. w0 r5 T# L X) e8 T$ Y
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
! i: S' }9 W. H, h
$ {" R) p+ ?& M% U6 s3 K2 E$ \
6 `9 _0 z# m" U& V, n' N
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
6 f& |) e/ H m/ o0 O8 K1 t
每次DMA传输完成后都要再次使能传输
8 L! M3 I$ `: {: K4 X, p5 [
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4