嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
4 q1 C9 X# Y. [! k
#define PING_PONG_ACNT 1
# y- L: H4 r* z0 H) l+ M$ f
#define PING_PONG_BCNT 8*32*40
2 V; @( z9 e# C3 B# L: ?9 W
//#define PING_PONG_BCNT 1
7 `3 D$ y. J- F5 p0 ^5 u
#define PING_PONG_CCNT 1
% J0 Q: N% Q. i- _1 L0 g
#define MCASP_BASEADDR 0x01D00000
K- g8 y/ r! [* P$ p
#define Mcasp_RXEVENTQUE (0u)
! u* t- g+ ^ H* A4 S9 U& E0 |
# p. O! v8 m! V) U5 n9 F
/* OPT Field specific defines */
* A) N) g5 {& n! a |1 D
#define OPT_SYNCDIM_SHIFT (0x00000002u)
; V! Z. x+ g% V3 b s7 ^+ U
#define OPT_TCC_MASK (0x0003F000u)
L5 x" M. Y4 z
#define OPT_TCC_SHIFT (0x0000000Cu)
% b+ x" T6 h' b) v. [
#define OPT_ITCINTEN_SHIFT (0x00000015u)
& P$ s9 u! O6 l
#define OPT_TCINTEN_SHIFT (0x00000014u)
. r/ N, D6 V# }2 j5 ] i
2 V% @4 p4 q( Z/ O
char ping_buffer[PING_PONG_BCNT];
( U) l6 s3 i( o" X- F, p1 X
char pong_buffer[PING_PONG_BCNT];
. J+ S' c( U! G8 m
+ {2 m" E" V" ]: g- m' V2 Z$ j
+ B. Y/ ^6 X' b6 y8 N+ f/ y
0 P7 F3 Q6 V9 o
2 T% x0 R2 f7 Q! W! U6 e/ q0 Q$ K
static void ys_edma3_init()
, Y& X' r% x5 r9 Z1 M" t: J* M
{
; J# D5 w& n6 R# L; y) O% B5 n0 r
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
) k" i; J6 `+ D2 v+ N& Y! G9 U
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
3 k& }# V4 i! b% r$ s+ l
EDMA3_DRV_Handle hEdma;
0 c$ I6 o f o
uint32_t chId = 0;
2 z3 X( h, O" c2 P# @$ O
uint32_t tcc = 0;
8 i4 a9 W+ ^0 D9 B6 Z
' a8 V* f* ] f [& @2 y
print2arm("edma3 driver init...",0);
h* a r& A& o" b
6 ~6 s! p/ H8 r3 G Q
hEdma = edma3init(0,&result);
4 d) L- W( v: m) L; W
if(hEdma)
$ S" `# g5 T% F: f! n
{
# W: e- M6 D0 h+ r, {; p4 g; L0 t9 q
print2arm("edma3init() Passed.",0);
( t+ I' v- |2 D% t
}
& e9 `/ H! v/ J
else
5 ]& y1 F# o# D
{
( ^! Q5 D x9 G+ O6 v w7 y y
print2arm("edma3init() Failed.",0);
7 s' L; B5 s3 C. o7 a6 T) p, M
}
" z! @/ Z/ h# H" B& B
/ M) a# w6 B9 R) c" M) W
if (result == EDMA3_DRV_SOK)
1 Z$ J/ p0 R1 T
{
$ i$ f( B+ n2 r8 Q# I
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
2 Y5 z- s& v3 i9 r8 e, P/ [
(EDMA3_RM_EventQueue)0,
2 J; o3 }( B# @( G$ c4 D2 W+ r% x
&edma3_isr, NULL);
9 u$ ]" {5 |$ u5 c
}
H/ T& `8 ?& v
6 m o( {4 d6 @& ~
if(result == EDMA3_DRV_SOK)
5 W" K; [9 [$ l. z2 R$ P
{
/ m+ ]( |. W- f; r4 c, e8 H
paramSet.srcBIdx = 0;
0 f2 W9 p5 X- f- b2 v& {& [+ z: J
paramSet.destBIdx = 1;
$ W& G, u8 x/ ?+ q& o
paramSet.srcCIdx = 0;
O% f0 k! p0 O6 k4 d
paramSet.destCIdx = 0;
: l$ }- ?) H. d) e0 f8 ?
paramSet.aCnt = PING_PONG_ACNT;
( j- @! ^+ o9 ~. q2 Y
paramSet.bCnt = PING_PONG_BCNT;
8 _! e+ ?; m* h4 e( ?; T
paramSet.cCnt = PING_PONG_CCNT;
+ h) b, p, ]8 A) C
- a# O5 f2 h% N0 Z2 ]+ M1 c
/* For AB-synchronized transfers, BCNTRLD is not used. */
5 @. D# I8 m" l7 ] j5 X, ?+ A
paramSet.bCntReload = PING_PONG_BCNT;
3 x6 H/ I6 W6 h/ R' w7 q7 ^2 K s
: n) }9 d% S" ~) n
/* Src in constant mode Dest in INCR modes */
8 a$ @& |* Y0 f( X( w
paramSet.opt &= 0xFFFFFFFDu;
" Z" w3 N. l' ]/ k
//paramSet.opt &= 0xFFFFFFFCu;
; Y( o6 r. ^) g( `* C/ K0 r3 F: D
! G0 T- A: P7 X* z8 X
/* Program the TCC */
1 ` l& D9 T, t3 J
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
2 ?- X0 x* x8 C- |# t
- t1 l+ i( _8 |7 y+ S
/* Enable Intermediate & Final transfer completion interrupt */
, u1 C: D+ |, O l: l
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
* V8 {- U/ o+ q4 {
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
& n' ?+ b' {8 F
2 \6 e6 Z& a+ P- S' X
/* AB Sync Transfer Mode */
; B+ D d- a% T3 r
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
5 R6 h1 \7 {; T4 z4 [; `
1 v" m% o3 H: U; h( l
/* Program the source and dest addresses for master DMA channel */
% y: o3 X% T& h
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
0 P0 S1 f. H3 C7 u s* f+ T
paramSet.destAddr = (uint32_t)(ping_buffer);
1 S- e- T# b3 N h. }
" W6 y4 F; B% f2 g" l/ W/ [# M% F$ J
/* Write to the master DMA channel first. */
f2 ?- N8 l6 ]
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
) k( a" E! W, ?: I% } }$ X! K" V
}
1 X& H# f7 H; y2 S
, ~; B2 u4 G5 t1 y! T
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. p2 @0 d; u: k2 M& x
; G" J- q" v7 P
if(result == EDMA3_DRV_SOK)
( r+ Q, S; ~+ p6 i' [( k
{
: K( d2 E3 W( X- R
print2arm("edma3 driver init success.",0);
( K. n- `8 B, O5 T& G9 F7 l5 E: v
}
4 S; X* b! b. d
}
, j- Q; l- L) O [
/ P3 a3 N, z4 w. B
$ v1 L4 U! H V4 _4 Q
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
1 m& n/ H1 M* P8 k6 B2 I9 b
/ @7 C9 R/ o y" l
# N3 |1 H/ k$ y9 F* I' c6 X
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
0 @* B. c% t4 y* X5 c9 t+ l* R
每次DMA传输完成后都要再次使能传输
6 J# E5 d6 }& B0 B$ }3 |) Q- H* B
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4