嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
2 ]. A1 c5 @5 g) Q! K) ?3 B
#define PING_PONG_ACNT 1
' K6 C, q- k: w- ?8 M
#define PING_PONG_BCNT 8*32*40
& \+ k+ E' ?. |! @: u0 w( q
//#define PING_PONG_BCNT 1
2 K/ o( N" K: ?: Q* v& C0 S6 J M
#define PING_PONG_CCNT 1
7 a# }/ _* G. ]; o
#define MCASP_BASEADDR 0x01D00000
4 C, Y3 n7 h8 \6 S6 j
#define Mcasp_RXEVENTQUE (0u)
% H4 G+ h' k u \9 ~4 m. |
5 R# R0 P. s# _, Y
/* OPT Field specific defines */
+ p! J6 L+ Q5 d% M! w7 y+ i
#define OPT_SYNCDIM_SHIFT (0x00000002u)
, A( x7 a. d5 H W1 B7 z
#define OPT_TCC_MASK (0x0003F000u)
/ h- A! T' ]; j) L; P& T8 R
#define OPT_TCC_SHIFT (0x0000000Cu)
9 {7 m+ r! H5 V" X5 U# L
#define OPT_ITCINTEN_SHIFT (0x00000015u)
; G' s* C4 k2 x+ ^: z/ O( [9 w
#define OPT_TCINTEN_SHIFT (0x00000014u)
& q. S( ?/ h4 T; l6 N
7 i: h% i/ h7 U( Q
char ping_buffer[PING_PONG_BCNT];
/ q9 q1 r0 Z0 p* N( H7 k; R: O, g. v. A
char pong_buffer[PING_PONG_BCNT];
) o4 ^: h; b# _( Q2 a! n
* F0 F7 X# a. ]
, o; ]* h1 ?, i1 P# U) y
$ W1 b9 e" N$ B! ~
. A9 c( H J, g+ t
static void ys_edma3_init()
5 y5 r* P' g$ ^7 k- H; ?
{
3 D9 x9 h0 p5 [
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
! o8 l! m: H( ^ d1 ]
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
5 [! @ |: w5 ~( k* C% g
EDMA3_DRV_Handle hEdma;
@* _6 G: o# [! o& {
uint32_t chId = 0;
/ f/ R) m5 a9 b% k
uint32_t tcc = 0;
, B" W( v( z/ \4 y5 q
0 n8 k+ p( X" ?! A9 O
print2arm("edma3 driver init...",0);
8 d! I2 K; z; I' i! f9 C
5 [3 Z- K* K9 b/ m6 `5 @; |
hEdma = edma3init(0,&result);
0 Q X' d% `5 p: h; d" K+ h: I
if(hEdma)
1 Y7 e3 m. p& n5 x1 \$ k
{
8 U8 Z6 {+ y+ X( `. U
print2arm("edma3init() Passed.",0);
) M. M) B2 T7 J9 v
}
x2 t2 Q9 y8 F7 f2 [8 `8 J4 d
else
) W5 v: @, u7 z( }
{
9 X% T) b- r' ^# b2 P
print2arm("edma3init() Failed.",0);
; {: T. X, y/ C& h% A2 k
}
! b2 W ]) e) B3 P1 ^8 s4 {8 F C
3 r9 i+ U8 |' y# O4 t
if (result == EDMA3_DRV_SOK)
) Z( x9 H0 D1 a
{
C0 N8 C+ s$ h
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
; v+ Z6 |( t, z# ]; b1 ]" i1 B
(EDMA3_RM_EventQueue)0,
5 ]& f/ o/ j# k4 W6 n' B
&edma3_isr, NULL);
' u# ?2 c6 b: C7 `) I
}
/ k7 V- N/ O; `) R7 l/ m# _
* U+ y$ n$ w' r
if(result == EDMA3_DRV_SOK)
8 k# p4 T/ d# W5 W- \
{
+ M1 h0 g) M4 N& O
paramSet.srcBIdx = 0;
7 E: `& ~8 b0 n( X
paramSet.destBIdx = 1;
( X4 g3 z, l$ t! a% b+ S9 t
paramSet.srcCIdx = 0;
5 k" [( O" |* ^1 R) s" r
paramSet.destCIdx = 0;
& X" z8 t1 Z# _* r) s" l: i
paramSet.aCnt = PING_PONG_ACNT;
. I5 L. j. C+ K5 |
paramSet.bCnt = PING_PONG_BCNT;
9 l- c5 {6 y# N* Y( u t& x$ p
paramSet.cCnt = PING_PONG_CCNT;
4 i1 [4 a S9 Y) b0 {
# h1 C$ \4 H; L& Z
/* For AB-synchronized transfers, BCNTRLD is not used. */
3 ~* G0 _( R" O5 p/ V* t
paramSet.bCntReload = PING_PONG_BCNT;
: z) ]! |6 J$ V# N& s
2 o# u/ {/ N/ A/ L* H+ i1 l. T! w. a, U; \0 _
/* Src in constant mode Dest in INCR modes */
* w& E- d* }* I
paramSet.opt &= 0xFFFFFFFDu;
2 {$ S5 ^4 D2 e7 r
//paramSet.opt &= 0xFFFFFFFCu;
, ]) g: G3 y# J2 g
+ d f# p2 N( l5 G" c
/* Program the TCC */
+ R, G w9 y7 j: c# [" T3 E
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
+ w6 Y: O$ A# B0 T; S3 G. d3 @
. f8 }9 G/ T8 ?. Q& F- u
/* Enable Intermediate & Final transfer completion interrupt */
5 {/ t# Z4 k3 a' \3 {' C8 N5 Z
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
# j0 t2 f/ R z8 C& ^1 B
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
7 }7 P, C2 L: o: E5 Q; F# ]
7 j+ m: A; P* \; R, s% s9 n( }6 R
/* AB Sync Transfer Mode */
! x0 d9 `( V& s( X P+ q7 E
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
" h/ i0 Q% E6 N D
2 t! x4 f6 c" p4 c; f& v
/* Program the source and dest addresses for master DMA channel */
; j# V g7 i# P1 t$ `9 `7 I
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
( U) h. P5 \5 N# }# y
paramSet.destAddr = (uint32_t)(ping_buffer);
' ~/ r5 @3 ]! X$ I
$ z/ t2 o4 c* y/ C" |/ [
/* Write to the master DMA channel first. */
% T1 q- w! j+ s
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
. [2 \, e! d, B2 B
}
; K x: `& D7 o, y
. |; b4 J3 I+ Z' b5 F$ I" Y
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
/ h6 r! L( M3 s G0 J+ [
3 `" y9 J9 P9 Q" R$ h0 Z
if(result == EDMA3_DRV_SOK)
k3 ^4 B# W8 l6 N1 N! i4 x# }
{
0 L8 A, C M2 E, |/ i. \/ v
print2arm("edma3 driver init success.",0);
7 |! ^$ D9 Y) `* t. s! U
}
6 a- t u3 @- Z. a1 a+ f
}
* _, e/ k# i7 G7 s: g# A, P W O
/ t( `) x/ {" O% T9 ]6 z( W
( c' D) d. g' y! }* U
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
. X1 K' u4 W& r: d
- S3 _: @6 P; |. B
0 g. C6 m) s' K' w0 y5 i" w
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
8 H. C- J/ }: r% z \
每次DMA传输完成后都要再次使能传输
# z! G- E$ N& _4 r6 y( s3 R- b& t
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4