嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
% |3 h. R- @% ?! m. c; x5 j. @6 p
#define PING_PONG_ACNT 1
5 i9 H& V8 P/ [4 V# x( `% m
#define PING_PONG_BCNT 8*32*40
" |( u0 E1 H+ a Y9 O
//#define PING_PONG_BCNT 1
/ c/ N0 H- ^- |5 m$ R
#define PING_PONG_CCNT 1
/ {1 h6 p! `+ z+ m+ E; q4 C/ U6 K
#define MCASP_BASEADDR 0x01D00000
+ {5 {) @3 b* D4 r: h/ ]: ]
#define Mcasp_RXEVENTQUE (0u)
5 `) R' I3 i7 n6 G" t/ P& X! e
- [' \$ q2 Q* w
/* OPT Field specific defines */
3 _0 ^5 g2 e& @
#define OPT_SYNCDIM_SHIFT (0x00000002u)
9 J" V' }; P, t S7 O: q+ }
#define OPT_TCC_MASK (0x0003F000u)
& G% Q: ^& }6 W! [% i0 D! q' @
#define OPT_TCC_SHIFT (0x0000000Cu)
3 b- z' q: T3 k N6 r
#define OPT_ITCINTEN_SHIFT (0x00000015u)
& n* p8 |: o' q4 V2 p: a! E# J
#define OPT_TCINTEN_SHIFT (0x00000014u)
5 E2 R) S, }, i
' N2 ^: V# h/ R2 ?
char ping_buffer[PING_PONG_BCNT];
5 ^# H8 v+ B4 M
char pong_buffer[PING_PONG_BCNT];
6 D0 @& R* ^. C/ o
& K' K3 q+ e1 L2 l8 W1 I* {0 w
3 w5 Z; Y5 X1 b9 t* e2 o# {3 v
* n) `# q, ^, X8 T1 u- U; Q1 a
1 `4 T# a5 z8 k& x
static void ys_edma3_init()
- x6 S, A' ~, u" H9 I0 A
{
H. X3 s' N. m( N! b! M
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
6 j: u l* V& G6 H0 n6 R* ^7 W, F- {
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
) i0 T( y0 h$ c) N- w, b) |2 h s
EDMA3_DRV_Handle hEdma;
) y/ f7 ~) l+ \2 Y
uint32_t chId = 0;
. U5 v* H: n$ O" b
uint32_t tcc = 0;
* F6 L, [: r8 x
( t z0 v# ?* [$ X! M
print2arm("edma3 driver init...",0);
, V$ e% a* F$ s" _% p. y
/ r0 f% B6 m5 B! S% K1 m, E+ A' l
hEdma = edma3init(0,&result);
% q0 {( {" H/ C+ M/ ?7 }# S8 _
if(hEdma)
( l& ]" P, y! [2 H8 N, ?& K5 L; y$ c+ K
{
4 Q4 c, v2 j: s! L2 E
print2arm("edma3init() Passed.",0);
* Z2 k& S* r! y$ j! ]
}
, ^# T/ ~- K* ?% R) V7 z3 @! Q
else
0 W' M: A, p6 Y) \. H3 N. b
{
, r/ m* H5 l4 O3 R6 w
print2arm("edma3init() Failed.",0);
" ^0 J, P4 ?! I& _: q9 g5 ~
}
8 m7 n5 A6 L) c' [$ [( W
' G8 I9 l, F4 \& ~
if (result == EDMA3_DRV_SOK)
$ t0 W3 `" K- H4 J! [
{
- d* S# h' e! }+ ?
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
8 v# g- ?% X. F8 t. }* m# p, U" S
(EDMA3_RM_EventQueue)0,
7 `! f8 X$ A# D9 U! Q, L+ B
&edma3_isr, NULL);
6 _0 }6 k5 C; U, }
}
" E) x/ q* F9 e1 a
+ \8 X0 b; z: O" m I
if(result == EDMA3_DRV_SOK)
* f" J, }- n5 s5 U2 W# w% [, h
{
m: s! `# _8 h- c" Z5 A; g
paramSet.srcBIdx = 0;
* ?# _, l1 H; Z# F' i3 ?5 Z
paramSet.destBIdx = 1;
7 ] Z) }' O- m7 v
paramSet.srcCIdx = 0;
8 Y! Y. z+ c5 Z, L, t; K! C
paramSet.destCIdx = 0;
$ Y( y4 Y; A, M' z
paramSet.aCnt = PING_PONG_ACNT;
) m2 T% }* R; `+ d
paramSet.bCnt = PING_PONG_BCNT;
; q i. ` m: @: u. f, d
paramSet.cCnt = PING_PONG_CCNT;
, ~. q: { i, R$ n4 w4 [7 z& G+ O( R* w
' L# S2 `+ f/ ~ C7 V- V9 y: Z
/* For AB-synchronized transfers, BCNTRLD is not used. */
9 a4 `- }+ `! V8 n3 Z5 W8 y
paramSet.bCntReload = PING_PONG_BCNT;
& {/ R$ i, G, t
6 F/ \- Z, {/ ]6 d# K: Z' _
/* Src in constant mode Dest in INCR modes */
8 R8 ?/ X& h& @7 `! M
paramSet.opt &= 0xFFFFFFFDu;
) g2 Y" ]& R! D5 P* b4 J2 t* M
//paramSet.opt &= 0xFFFFFFFCu;
: n' k @2 w7 g. O I
- T X9 M$ O7 i6 l2 H7 R6 i6 V
/* Program the TCC */
( y( J2 J' t2 Y% L5 A
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
& J; M7 B" g+ ^4 e$ {
. {. K0 J/ z# h' K2 c! {2 g
/* Enable Intermediate & Final transfer completion interrupt */
# |* f/ z6 r" P8 O- s$ ]
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
5 s# L* K+ i6 M
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
: j) b- ~1 k4 n% f4 j" N: l$ v
3 C& B W2 U' [- A2 `$ ]3 u
/* AB Sync Transfer Mode */
6 {5 I, C3 B$ S9 v9 L; Z
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
" ^4 L" R5 P- Y) v
/ m$ V6 A& q, C) z3 R( X
/* Program the source and dest addresses for master DMA channel */
: \+ F+ A2 O% s( o+ {* V( D
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
. k& U" H4 C) s0 ~* I9 G
paramSet.destAddr = (uint32_t)(ping_buffer);
. p% }" l& c2 M: ]9 O! v& K: ^
* c1 M# _' z# e( @
/* Write to the master DMA channel first. */
; b; j/ R' k, j. B {4 Y4 L7 t# D
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
) ~8 ?& @# J! A, I6 q/ Q: i. \
}
" m: c9 I" _. B8 i# I' T* K( W2 N [
9 P" L9 \& }7 M1 `* }8 }6 [
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
$ w, ?3 T& l' D* _$ g& J
! ~* s J7 |% u% p/ s$ y/ Y& i
if(result == EDMA3_DRV_SOK)
+ O( d! Y5 w9 l( M# F. _
{
2 e2 l* l: D( U% h0 s% B# f
print2arm("edma3 driver init success.",0);
b# k3 K" L! K: I% ]& `8 @
}
+ H6 x! a* o7 P% ^
}
- u: V2 c7 z8 H2 j- `
& `- h: v$ D# [ x* Y+ _. m7 C$ t
) U5 q0 C5 `- d/ E6 N: {
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
1 ^. B8 U5 p3 q, g) Y
( c- x. z3 |: e% X3 U
5 @* Q5 Z( D+ R% q/ M9 q( R
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
2 ?& G9 q' v% H/ ?, m, z) x0 {
每次DMA传输完成后都要再次使能传输
, V: H2 g% l1 L Q- b9 T9 b* U1 C2 \
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4