嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
( G- v* }/ [6 w$ z8 N5 A. }1 G/ I$ W
#define PING_PONG_ACNT 1
2 u0 n$ I7 q& s
#define PING_PONG_BCNT 8*32*40
l! R- d' }0 Z ]1 r% G9 F/ o8 J
//#define PING_PONG_BCNT 1
7 ]9 a; g* K3 E9 R8 m0 L
#define PING_PONG_CCNT 1
4 d. J4 h" {! C# J1 m
#define MCASP_BASEADDR 0x01D00000
& Z- Y$ i* c z9 [! y8 ]5 v# I3 {
#define Mcasp_RXEVENTQUE (0u)
: @8 {4 M# ^5 W* ~# I( e S Q& s
9 k; s5 o3 w8 q% ^$ p! I
/* OPT Field specific defines */
' A, b8 t' @# `: t+ Q
#define OPT_SYNCDIM_SHIFT (0x00000002u)
3 W2 S; r4 Y+ y/ K
#define OPT_TCC_MASK (0x0003F000u)
$ z7 f$ h8 ~$ a$ u- o* E
#define OPT_TCC_SHIFT (0x0000000Cu)
! q$ I7 \9 I1 f8 T: e' p% P
#define OPT_ITCINTEN_SHIFT (0x00000015u)
' F, ?* F- h+ e- i6 H" _
#define OPT_TCINTEN_SHIFT (0x00000014u)
9 S$ C0 X# X& ]- J8 f
5 B: D. c0 O+ D/ f O% q
char ping_buffer[PING_PONG_BCNT];
0 F( Q9 R% d1 R" I( _% ?% ]4 y* U
char pong_buffer[PING_PONG_BCNT];
& @7 N3 }7 Z2 f! r2 E+ }
/ L; @: W) P! e3 P4 E& Z3 ^/ W
1 D1 b+ r5 V& [$ x; L
/ D9 k2 b# }, t* m! f, F: X
! @+ @/ C8 A! q+ M( V! @
static void ys_edma3_init()
' R. C) o% J; _; ]- m4 C
{
* E( ]2 L. ?5 R' q E
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
+ K% g/ p. q! q# y. \0 h$ C( o6 D
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
; I2 J* }3 `. z: I' q
EDMA3_DRV_Handle hEdma;
4 @& C3 v; w' j& u
uint32_t chId = 0;
; u1 G7 Y. \" u0 W1 c7 ~1 x
uint32_t tcc = 0;
5 I9 }, ]4 p( f9 {+ [+ B2 t+ q
9 \: c- ]0 F& c+ s
print2arm("edma3 driver init...",0);
) x4 K" |. f x1 k* M8 O: M/ l3 x- `
' C% Y8 B2 q! N6 G2 H2 S- q
hEdma = edma3init(0,&result);
# ]# i$ r& B4 I
if(hEdma)
# y h) ~( b9 O1 T4 E+ L, p- T/ p
{
: J2 i8 z) F9 i- o, B
print2arm("edma3init() Passed.",0);
3 J: W/ B$ g6 i4 O
}
" ]% f; [/ ]7 o3 T7 j
else
9 w8 b& V) h4 v0 X% i
{
: T0 y/ a5 l1 e7 J$ f
print2arm("edma3init() Failed.",0);
' M, y' G) a4 Y6 R
}
+ r( u L; k5 H( B9 G$ T7 d
4 p" D& ~2 u7 F F# O0 V5 a8 D
if (result == EDMA3_DRV_SOK)
+ s$ Q, o7 {- l
{
& j# q/ _4 O( H
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
+ `. V: [* `1 {- L5 s
(EDMA3_RM_EventQueue)0,
, d$ M7 s" T( S" G
&edma3_isr, NULL);
& X( m$ _" e' ?5 H* B9 v8 V8 J
}
8 q5 f: Y% a8 j0 V
! w, Q. \0 f$ m* u# o
if(result == EDMA3_DRV_SOK)
}2 d: o- h: f/ j
{
3 P+ n) e- W* ~" V2 q! F/ v
paramSet.srcBIdx = 0;
* O0 V8 q, |4 V& O( V; r
paramSet.destBIdx = 1;
0 W7 R( G: o4 z7 `$ \0 U
paramSet.srcCIdx = 0;
|0 U1 c5 c0 I1 Z) m
paramSet.destCIdx = 0;
: P3 h# e' n; [
paramSet.aCnt = PING_PONG_ACNT;
/ W* K' w4 ]# r3 |$ V
paramSet.bCnt = PING_PONG_BCNT;
I4 O) Q1 U2 ^) u, z; c
paramSet.cCnt = PING_PONG_CCNT;
* |- F! Q' L+ k% H$ |8 n' m
# [: u2 e! Q% m8 e3 f T4 H, m
/* For AB-synchronized transfers, BCNTRLD is not used. */
7 H8 @2 s C, X* i
paramSet.bCntReload = PING_PONG_BCNT;
) |1 K8 P% B2 a5 \& }+ C) K. }
$ u E8 Y" p# z# U' m& d0 ` D6 I+ \1 `
/* Src in constant mode Dest in INCR modes */
% x0 N' v2 ^: N4 V: p6 c5 W* Y; N9 o/ z
paramSet.opt &= 0xFFFFFFFDu;
6 Y- ~6 f3 w0 v9 M! X6 y( {
//paramSet.opt &= 0xFFFFFFFCu;
& A0 s. ^8 ^# ?% c* J
! b2 i4 h, v9 W8 o* i
/* Program the TCC */
1 \3 ?; Q0 k; Y1 Z3 _3 Q0 i* W7 B/ \
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
* r* N% P' v4 A
1 i8 X% Z. j0 a; K- _/ ~: q3 S
/* Enable Intermediate & Final transfer completion interrupt */
~; [ C0 ~0 d4 n" q- w, v
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
% y) k: e" J! U" U* j5 T0 q% C# d
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
' k% V! R( q: w8 p9 j+ @( K
" Z8 F, Y" I: |! P0 S" T- B
/* AB Sync Transfer Mode */
3 ]! k, K# z% e8 f8 K) ~
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
- q! ]- A6 y/ d' C, l' l# o0 T
- x1 z% R! p7 l. K0 q% L% d
/* Program the source and dest addresses for master DMA channel */
) V: |+ ?: V# T- q$ y9 d" u
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
% _. ~/ K% O3 H+ D$ `: x
paramSet.destAddr = (uint32_t)(ping_buffer);
2 {0 G0 Q2 d# b. n# }1 ?4 f& r
+ {' {6 B7 P3 s
/* Write to the master DMA channel first. */
8 c* c' q* u: W% _" A1 G
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
6 U6 T3 q# T0 }- \
}
+ C/ ~* }9 A; J3 O2 V5 e3 x9 S# X
# t3 v2 X% w. v
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
7 ?7 l+ S1 _* E% z2 b
% b4 B( O% v5 C( \6 w# `* W; `& T
if(result == EDMA3_DRV_SOK)
' \# Q: N [6 d. Y! e
{
8 Y0 c; g7 D! S9 n# p
print2arm("edma3 driver init success.",0);
" B" ~+ _& T5 I5 b: c: R, p8 _
}
$ @2 X/ t# H4 D- _( J0 X7 M
}
2 c0 e+ G9 H1 Q1 G. K6 Z% u! g
( X1 [% _- l/ c z3 l+ \
* J; h1 r; g6 s- p) e
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
1 X6 n7 _, ?7 c( J) R
, T& m4 X1 _ i3 j$ ?
8 i- J* d" `/ o, Y" X: s
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
+ b1 H; T% R+ f! I
每次DMA传输完成后都要再次使能传输
; L5 {; G; @0 J4 D
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4