嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
~9 ^3 p1 o2 r% S# {
#define PING_PONG_ACNT 1
8 }. ^$ K; y2 U( ~: W4 q
#define PING_PONG_BCNT 8*32*40
2 D! \ J* E. i2 _( B# G# ^5 f
//#define PING_PONG_BCNT 1
9 }/ R/ O4 t* Z( R1 L
#define PING_PONG_CCNT 1
+ |1 s$ d0 j! h7 y
#define MCASP_BASEADDR 0x01D00000
# S7 ?- @5 ^$ c2 X; G+ Z
#define Mcasp_RXEVENTQUE (0u)
+ d# ]" Y0 F F) I2 u/ Y# B; ]
9 t, D- d# G; J' K8 J9 o, {& e' J
/* OPT Field specific defines */
4 c" P2 Y- a& f# p( @
#define OPT_SYNCDIM_SHIFT (0x00000002u)
& X9 ]2 B3 V! S1 t9 a8 ~
#define OPT_TCC_MASK (0x0003F000u)
! P: g/ |$ q, s* c, T
#define OPT_TCC_SHIFT (0x0000000Cu)
! g5 ^4 m7 ^' q: @% C4 k: B/ B
#define OPT_ITCINTEN_SHIFT (0x00000015u)
3 ` r5 \, f* {) j. \) [
#define OPT_TCINTEN_SHIFT (0x00000014u)
$ C! O ~; G8 \9 w
' w, f0 _ X' @- J
char ping_buffer[PING_PONG_BCNT];
# q# P I- c, v" d$ P _
char pong_buffer[PING_PONG_BCNT];
0 U3 @9 j% L7 }! E: O
( @3 V8 }9 Y4 C4 S; t
J6 a+ Q8 _" D( n5 ]1 V: D6 D
- x' Y% ^1 `6 Y% M Q
# ?% G! ^- H9 i
static void ys_edma3_init()
& v! @) a, x5 U6 ^' y* B; D
{
0 b3 a- E! `( @* r9 q1 Z
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
- s/ k% p8 N2 G4 G2 C( n% y- E
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
( K& q) Q/ H: I, m
EDMA3_DRV_Handle hEdma;
4 k6 c7 v4 A. f8 l
uint32_t chId = 0;
6 R7 V0 k$ ^3 h) u
uint32_t tcc = 0;
- G7 A/ T- S& N3 o! S
! m# R2 }- B0 \8 M# S" H
print2arm("edma3 driver init...",0);
/ N& Y0 K: q K* u3 W
- h! c' O0 R/ d" o. K
hEdma = edma3init(0,&result);
: z$ c0 d, Z* P
if(hEdma)
( K9 s' W! Q k; i+ |
{
; v! N& h! ]3 Y% w
print2arm("edma3init() Passed.",0);
* F. b& N; E2 z" b1 [5 @( |) z. b
}
|" A2 G5 O# _6 P: t, b$ i: x, o
else
9 i B9 L2 Z' E
{
) E1 z, W/ s/ k' |) o+ r- ~7 X
print2arm("edma3init() Failed.",0);
" v. R: h) ~; s- q% N
}
/ D1 h5 i( d$ O. t7 {
0 O* t z" ~6 C( I' Z' q$ [; K
if (result == EDMA3_DRV_SOK)
4 O7 N, v$ A: \9 ?. N
{
5 L. S# X q( L& \5 q* ^' z
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
& w" g; h) R- t& N( }: b
(EDMA3_RM_EventQueue)0,
0 s1 s- O3 h; W) H2 c
&edma3_isr, NULL);
) c4 h: a! M P- u; W, _% e
}
, k$ C8 {$ K* M% L2 i6 {
: s" u$ g* T$ j2 g6 y- n
if(result == EDMA3_DRV_SOK)
3 _/ r5 Z, x j9 l
{
" u. n* a7 w, d8 Y' G3 n
paramSet.srcBIdx = 0;
) w: a9 Q4 D8 f3 q; ?
paramSet.destBIdx = 1;
; S u+ x; e, | h# }
paramSet.srcCIdx = 0;
( N% T" C% a# ?; H( u( h0 U" M+ @
paramSet.destCIdx = 0;
/ V* M/ H3 L7 C
paramSet.aCnt = PING_PONG_ACNT;
4 M% ^. I2 P1 e/ ~' X: ~) s) Q
paramSet.bCnt = PING_PONG_BCNT;
, a) V1 U" n% S- T( y
paramSet.cCnt = PING_PONG_CCNT;
9 F$ f( p% V* u5 q, d7 E' P
4 U4 S8 L+ O- D$ X- c
/* For AB-synchronized transfers, BCNTRLD is not used. */
4 o0 B, ]4 s! J1 N
paramSet.bCntReload = PING_PONG_BCNT;
, k8 f" s6 u2 n! O' }" ]
V% n3 x! _( W; L
/* Src in constant mode Dest in INCR modes */
) d3 k& g' h1 D8 H; |
paramSet.opt &= 0xFFFFFFFDu;
& I3 ], X$ u* G
//paramSet.opt &= 0xFFFFFFFCu;
4 B+ c2 E) o0 W _5 B
% l- ]0 q* t0 @. z
/* Program the TCC */
' e2 ^9 s5 ?/ G! h, h ?) |: {
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
+ Y# ?3 B; \: d) G
+ X' C" J k$ O* c" G$ |
/* Enable Intermediate & Final transfer completion interrupt */
/ O6 r+ ^( D% P# z; s& f
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
, B* r1 _6 v$ [1 j5 @ R1 b/ _
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
0 b* T4 v4 t2 V3 X
- v2 l3 Q( o/ ?- j5 U6 v8 n5 B
/* AB Sync Transfer Mode */
+ ~. X2 e1 B3 n P
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
6 ^3 V5 h( {' K$ ^$ h9 Z/ |: [0 X
- P% t t) `, F3 t
/* Program the source and dest addresses for master DMA channel */
9 Z$ g0 P z: V
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
/ I0 n5 f8 i; M6 v2 X0 V' U
paramSet.destAddr = (uint32_t)(ping_buffer);
7 j; [- V" V6 `9 `
/ w% T# u$ A) D# g: j* S2 j
/* Write to the master DMA channel first. */
3 \: {6 G) s8 E1 R4 J
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
2 N7 q# Q! U$ k
}
8 c) l2 K9 d! k& O
# D5 H: ?% e- H; S) u
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. t1 O1 _9 n% n
4 T7 d. R% h4 b8 v8 f# A/ R
if(result == EDMA3_DRV_SOK)
& R* i* l3 C! y9 p7 [6 }' D* U
{
: y1 P, h* V- B1 j' \3 `" K
print2arm("edma3 driver init success.",0);
6 K' L5 A: W2 l0 H0 W# G
}
( x3 T+ @' N! W% d
}
6 {& j3 p; |, a. x" \ t
! \8 \9 p4 Z) Z9 ]9 B; s
. f0 o* y0 I( e/ I7 z) @& A
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
! m8 G; f" t! G. O; |0 y/ E
$ l8 x0 {" [# y( H$ r- L" B
A* @. L/ F& N: Q' y+ p0 y# }
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
' X y- N# W4 N. r
每次DMA传输完成后都要再次使能传输
: C3 q) Q$ g W$ ]
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4