嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
$ q: x2 K- d# D4 y
#define PING_PONG_ACNT 1
% ?. K1 u! J% u
#define PING_PONG_BCNT 8*32*40
; i( w; c- N- f* l+ t4 G/ u& u
//#define PING_PONG_BCNT 1
4 A( e/ y/ U! k4 ^" H. R# }
#define PING_PONG_CCNT 1
+ H4 O/ m; z$ M- n t- i& d" p
#define MCASP_BASEADDR 0x01D00000
/ C: N E0 E9 y7 a: s. C
#define Mcasp_RXEVENTQUE (0u)
3 F1 V9 ~9 o: y" r/ J8 w
2 Z# I. l4 ]# U: F% Q' j
/* OPT Field specific defines */
" a" K2 F; g- _- a
#define OPT_SYNCDIM_SHIFT (0x00000002u)
2 \# M) N: H( {9 S! q |8 P! I
#define OPT_TCC_MASK (0x0003F000u)
1 F1 f/ \5 u( g( H; R
#define OPT_TCC_SHIFT (0x0000000Cu)
& Q7 G+ o/ C) V9 }2 a2 O6 e$ T
#define OPT_ITCINTEN_SHIFT (0x00000015u)
7 U) H! U6 p2 B! q5 [, |. e
#define OPT_TCINTEN_SHIFT (0x00000014u)
$ Q' O* l- O; |) U
* {, G. I2 Q: z
char ping_buffer[PING_PONG_BCNT];
1 U. [4 L& r0 U! w% H, y. C/ E; b
char pong_buffer[PING_PONG_BCNT];
; F7 @5 o' _ m9 q. `" D8 {. ~
! s3 p) Z& y! A" \# c
) o% M0 k( n7 ?$ n
8 X4 w" y/ ~: B7 G D# V& A
$ j: v' F0 \9 x3 m
static void ys_edma3_init()
! X3 z7 O/ H% w5 `# s J7 v3 V) \
{
* X4 h u, j2 v" u% \
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
/ i" q( `4 }' U: t8 C
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
- f$ X+ M0 N1 Z( x
EDMA3_DRV_Handle hEdma;
# T% {/ {2 J9 f9 O6 D5 ~
uint32_t chId = 0;
0 Q6 |$ i9 i- _3 v
uint32_t tcc = 0;
7 z( k3 s% n4 A, A
7 K4 o, W4 q( M) c
print2arm("edma3 driver init...",0);
5 e' u* s9 l1 z' G; n/ m0 Q v
. R+ z7 N) u9 E% n! ]# p4 A
hEdma = edma3init(0,&result);
% S, ?9 A; i4 s& Q9 u
if(hEdma)
) y; p" i/ V/ ~2 W5 \6 w3 w
{
i! F Q0 }7 U7 H
print2arm("edma3init() Passed.",0);
. b* G1 M* N4 ~
}
+ D8 f& n, O+ i7 B3 P8 n* \
else
0 `' e9 r9 V0 r& M; E; u- x# _# x
{
( i7 m; c, d7 e8 G/ w* C/ d% I @
print2arm("edma3init() Failed.",0);
, V; I# V& w1 I, G: T% l1 g
}
# e# A1 l' ]/ e1 P3 h6 U8 f2 U: j% i% N
+ r! t2 Z! H$ h6 `1 c
if (result == EDMA3_DRV_SOK)
X+ F! n2 v0 `# a) A
{
6 H! ^& F4 r5 K* j- D/ ~/ D' y
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
0 v p: S& f* L: n5 G6 }
(EDMA3_RM_EventQueue)0,
4 P2 r2 F' n. C0 j1 L
&edma3_isr, NULL);
8 e0 E: K" C. S. }' v" ]
}
' p! I1 Y/ l& s
0 n1 U @' Y- ?, [) }
if(result == EDMA3_DRV_SOK)
& [* Q1 Z" ]; U; M
{
8 n" m+ f. `# V8 B% g4 K; H
paramSet.srcBIdx = 0;
* O9 z* m6 A+ `5 S$ O( ~6 O0 U! d
paramSet.destBIdx = 1;
+ z, d, v+ \- G9 [! X: x
paramSet.srcCIdx = 0;
- ~+ d4 `* p& n6 U0 u. {
paramSet.destCIdx = 0;
. |2 L+ j- e- J
paramSet.aCnt = PING_PONG_ACNT;
& P }) e. ?- D1 c: h: r9 a
paramSet.bCnt = PING_PONG_BCNT;
( x* h: `" w! f, c
paramSet.cCnt = PING_PONG_CCNT;
9 X6 c7 @2 {5 m' i' I: l
& _7 B6 `' W. D$ W
/* For AB-synchronized transfers, BCNTRLD is not used. */
& E) e0 X9 A: f# L, j
paramSet.bCntReload = PING_PONG_BCNT;
( H1 S# t& z0 [2 ^
- l( I4 K" I8 P, k" m
/* Src in constant mode Dest in INCR modes */
; M2 }& F. f* G! N( u( J1 Z6 [4 N
paramSet.opt &= 0xFFFFFFFDu;
, Z) [6 }2 z1 H0 v8 \9 z: S
//paramSet.opt &= 0xFFFFFFFCu;
! o3 T% u* Z# \( L3 l
& j, a* v. K/ x+ e& B4 h
/* Program the TCC */
' h' p( g+ L( j& u% I4 {
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
1 ?5 U. b. Y1 }9 E2 u( J0 f
3 p p0 s' M) |
/* Enable Intermediate & Final transfer completion interrupt */
/ X. m7 v$ J# r
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
7 l- s' W' G: Y
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
$ R8 J/ ^" a/ b+ t8 `
) f8 `$ F4 Q4 z% c0 M" o
/* AB Sync Transfer Mode */
4 D' U& W- q- U( P# P8 X- F
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
) z1 o9 S2 l: ], L
1 d0 M ~$ J5 \4 z
/* Program the source and dest addresses for master DMA channel */
* ~$ G5 F t- S9 m% m+ Q
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
6 A! V. t, y$ ]( g+ a# t
paramSet.destAddr = (uint32_t)(ping_buffer);
5 {$ ]& S+ i5 i# k7 L
! ^- |+ G& b& y- A7 `, c5 z
/* Write to the master DMA channel first. */
0 i' U( d0 s5 ?
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
! V6 Q4 T8 [5 b6 k v
}
" [7 i6 a9 `( e1 ]9 o6 G
5 t/ \4 W6 j% n
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
7 r1 I0 j; X1 M7 {2 D# x% i- a
2 w$ b ?! x7 a
if(result == EDMA3_DRV_SOK)
3 Z0 P7 c& g/ f5 |# [% g
{
" J: m( y( b- g0 U7 A2 B( N2 @
print2arm("edma3 driver init success.",0);
3 w3 x, C1 V: D: K6 E
}
. a, W7 D. L& e& F, \
}
3 \6 k* ~! g% t7 I) d+ z
, r+ E4 \/ d' o1 A! Z) J: {! z
8 d7 t$ i( c: \ V' x1 \: J: R* u) \6 w
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
& |% p: K6 S1 Z2 @& C$ e4 j
. c+ O) w9 @ k$ U! r0 E) [ O8 l: s
9 o. R) V7 E) C: ~$ ]8 b& m
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
0 |0 N$ x0 `. ]; V# X3 f, t+ @
每次DMA传输完成后都要再次使能传输
: K& o% E3 m) v. b. g
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4