嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
4 R+ ^ ~% y+ K2 J& B
#define PING_PONG_ACNT 1
3 O5 G. [1 I6 R: n+ z" G$ m9 _# A
#define PING_PONG_BCNT 8*32*40
7 i! d7 ~4 T. c
//#define PING_PONG_BCNT 1
* J, n& J' B0 ^( O0 |! p. g
#define PING_PONG_CCNT 1
9 `9 W" w/ t; h4 l1 r5 c! n
#define MCASP_BASEADDR 0x01D00000
# J# O$ u( I- }# S' @+ k" K( S
#define Mcasp_RXEVENTQUE (0u)
0 ~# G# |- o3 M7 r8 x; j! |, w
. {+ o( H, J6 a# s' F. M
/* OPT Field specific defines */
# s2 F6 n6 W: W. O3 x, Y( }
#define OPT_SYNCDIM_SHIFT (0x00000002u)
. ]1 O: {; S$ }" ]6 U- {. f
#define OPT_TCC_MASK (0x0003F000u)
# n7 `( Z" w. D* x2 h% [
#define OPT_TCC_SHIFT (0x0000000Cu)
. d2 j# U' e# P5 H
#define OPT_ITCINTEN_SHIFT (0x00000015u)
% A2 G& C) w' z X0 G' e8 Q# P' ^
#define OPT_TCINTEN_SHIFT (0x00000014u)
) f' x0 v! D) F
6 A5 w# [, e$ M4 ^. V% t+ k
char ping_buffer[PING_PONG_BCNT];
6 N* O) _2 O9 f, }# ?" e" l
char pong_buffer[PING_PONG_BCNT];
& U A/ n# F/ R( E- A! Z" T
0 W0 V3 ^; l, U; l7 @$ f5 {
9 o7 ~/ d3 G! _& A# I/ D% H
+ @9 O, O9 j. `
( o/ e# p+ H: R7 c2 E! j2 @3 m
static void ys_edma3_init()
- q* C8 J: b: S, n4 n4 h
{
8 M& C) g7 ~+ r' l6 ~
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
4 N/ `* ^8 F. g! Y6 E" |' ~6 k; M8 f2 k
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
! J4 K! o5 Y( D8 W8 b
EDMA3_DRV_Handle hEdma;
/ [0 F) c* u4 A Y: l: Z
uint32_t chId = 0;
! z3 J( P7 n, v& \7 p
uint32_t tcc = 0;
6 I6 s3 e; ^! j; i: B1 q
& a* v. _# R( Z2 I% `' A
print2arm("edma3 driver init...",0);
, {+ Y1 ^7 ~/ Z S0 k6 @; W. ?
1 E! C3 G7 A! X# W: Z2 J# j
hEdma = edma3init(0,&result);
6 a, g6 ^3 S% z3 a$ y) b' h' k
if(hEdma)
$ r- \% J, P3 K; ]$ w+ I0 R
{
5 @* }% W# Y3 [ z, ^, k
print2arm("edma3init() Passed.",0);
+ s$ ~ n$ z5 K1 Y
}
! N6 H& ]; T' `3 A! w2 b7 l4 R
else
7 r( b9 [8 _+ E) s! {. |7 L& v' s; J2 _
{
, q8 v' L3 U2 i. z7 T
print2arm("edma3init() Failed.",0);
4 n" ~, d! A: a' y9 X: b
}
( g# c0 i, f/ g' B9 Z
3 x( n( t% L$ w. N. j
if (result == EDMA3_DRV_SOK)
G3 }" b( c2 h" t" @( C/ l2 M( Q
{
# x" ~/ U) \4 b7 B
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
' j! D$ l& @9 h. L/ {
(EDMA3_RM_EventQueue)0,
0 i) U# ?5 r2 A G" O
&edma3_isr, NULL);
9 |3 J8 T: R ]4 J
}
, l4 X* `5 z7 [; _3 ~: T. c
" q- x! u* T! R6 I
if(result == EDMA3_DRV_SOK)
- l/ T+ m' d! p" W4 e" P7 }& y
{
1 q' ~3 A; N4 b% N/ I$ G
paramSet.srcBIdx = 0;
; ?4 s4 C$ G6 O ~$ M
paramSet.destBIdx = 1;
9 @8 J1 z8 b5 H, S+ w
paramSet.srcCIdx = 0;
% g1 k5 b) d* f/ w7 ]
paramSet.destCIdx = 0;
3 R( p7 _. K. G8 x3 E
paramSet.aCnt = PING_PONG_ACNT;
$ G* Q0 p/ z) c9 _ X% N
paramSet.bCnt = PING_PONG_BCNT;
7 H9 l7 P0 N8 U# M0 \
paramSet.cCnt = PING_PONG_CCNT;
4 f0 s3 x' m; p/ d* Q9 @& \
* |1 L; ]/ o$ t/ R0 d# H7 Z
/* For AB-synchronized transfers, BCNTRLD is not used. */
! g7 X0 h( F5 X5 P
paramSet.bCntReload = PING_PONG_BCNT;
, ], ?9 [7 r3 ?+ Y6 _
5 L2 p6 n& \* ]+ {! X
/* Src in constant mode Dest in INCR modes */
( M( [, D/ `$ x2 A' T* j0 b
paramSet.opt &= 0xFFFFFFFDu;
: D$ {: B: T# r
//paramSet.opt &= 0xFFFFFFFCu;
2 p( n! m0 S9 K! j
" z; x2 ^! s: B5 G! K3 |
/* Program the TCC */
2 r, U4 L& E' [1 J: t
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 o2 v' } V/ M' h& q0 i
: ^7 C2 ~ l. a9 M: A, K
/* Enable Intermediate & Final transfer completion interrupt */
$ z* C& t( J5 z( ?( y, ]9 i \
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
# x1 t7 m6 x, J- F3 N/ u; j" O; U
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
/ V3 U2 r" d' E
9 |- C: p- o3 L7 |( Z( K
/* AB Sync Transfer Mode */
8 I- s$ J# t$ P% I3 q/ { Q! i6 h
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
3 T- e( W& b) ?! a7 o! F
\2 U O% ?/ p, h6 ]2 X
/* Program the source and dest addresses for master DMA channel */
2 R# x# l! F9 \* \ p% d6 }! G c
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
' s$ u' o4 B7 u {# Q, D0 |
paramSet.destAddr = (uint32_t)(ping_buffer);
5 b1 W' N" J6 I- k+ j% v* ?
5 [7 @( K- }. E. \/ _, n& f% d3 O3 P
/* Write to the master DMA channel first. */
6 p: m4 L0 _4 F8 ^4 J. I
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
& l( b0 e* v4 ^
}
+ P! _. ?3 D" l( J8 \6 C0 X8 o
" H: T* C1 \0 ?4 o# e
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
4 H1 T# R( b! ^2 Y
2 ?0 T2 p* [" ]1 F
if(result == EDMA3_DRV_SOK)
! B+ k) i8 P2 a; ]7 l% D! Q6 B' y2 e
{
6 }+ r: G) Q9 H( Z4 V- f
print2arm("edma3 driver init success.",0);
, X8 {2 R$ T: G7 ^" @
}
1 M4 y- T: E* U9 g% F% m5 W2 v0 {
}
6 O# N% L; X6 g( w
( E( K N& ?; Q, h2 f( X3 z
$ n3 Z; L8 j7 Z3 W$ n
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
2 |- N3 @/ j8 ~! i+ `
1 i" X0 {9 J0 n. A
1 b4 y- x9 l: l% i* m: n' }
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
/ g' z% e2 z/ F2 T2 h
每次DMA传输完成后都要再次使能传输
: V8 M, k% G& g# W0 c1 w! L. e& E) T) q
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4