嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
+ m6 ~* @" Y5 _4 h! X: P+ R7 S' i
#define PING_PONG_ACNT 1
2 h: g/ L: B+ M! R( p
#define PING_PONG_BCNT 8*32*40
. G7 ^0 z! \+ X. c. E
//#define PING_PONG_BCNT 1
D2 A( Q1 v* e3 x* D& i
#define PING_PONG_CCNT 1
( l* ^' e0 }3 E, o9 R X; E/ F' Q
#define MCASP_BASEADDR 0x01D00000
* L3 V0 x3 W* w8 t
#define Mcasp_RXEVENTQUE (0u)
3 z$ }# ?- E( S4 @
! L2 K0 [( C" Y% G7 c7 p
/* OPT Field specific defines */
; N2 c8 y( K0 v1 b2 S
#define OPT_SYNCDIM_SHIFT (0x00000002u)
* a, \" j. @0 F& L1 Z. K+ P5 Z
#define OPT_TCC_MASK (0x0003F000u)
) O3 V. \1 l6 d8 B7 w3 w
#define OPT_TCC_SHIFT (0x0000000Cu)
7 O0 }& d% S a2 ?$ l+ `1 F* y
#define OPT_ITCINTEN_SHIFT (0x00000015u)
6 w5 P0 J; ^5 w: q, G* W, H1 h
#define OPT_TCINTEN_SHIFT (0x00000014u)
7 S e- ~- ^! h, K& ^. G
) @3 U; {+ g# m/ W3 m# |3 ]1 P7 |
char ping_buffer[PING_PONG_BCNT];
$ h. [0 n) p4 D" D6 f* |5 s9 l; e
char pong_buffer[PING_PONG_BCNT];
5 K2 Z& ^7 o" P2 E* \
0 D# `8 W) d6 k8 w' e$ T' E
. f$ z+ R/ r1 N) U
( O6 ]1 r( f6 g; G# m
0 c! S t5 x' K# @3 ~
static void ys_edma3_init()
& G+ d5 m, p3 L R& N2 `- |
{
+ L: F( x Q. K/ |% ~3 D9 A
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
. D' m4 R& g0 B3 X# A7 q: O
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
2 U$ h6 ^( ^4 W1 ?
EDMA3_DRV_Handle hEdma;
- o* q- ?! m4 {! c8 ~
uint32_t chId = 0;
* x3 G+ W# I9 ]1 ~3 J- w
uint32_t tcc = 0;
4 N6 E7 ], K- M/ E1 N+ S. x1 e
7 j6 P) M/ o! F# x8 k! c0 @0 w
print2arm("edma3 driver init...",0);
& C6 f/ I# P: r. R4 n/ B
3 J* D8 O7 O4 T: m3 Z: C# G9 S
hEdma = edma3init(0,&result);
; d! r" h$ O6 I1 M0 |! o& C
if(hEdma)
+ B& V5 P& k$ F& _
{
4 X. @' R8 i: t9 l0 ~
print2arm("edma3init() Passed.",0);
9 P* [6 n1 O9 \! b- u
}
9 O! `" K* A. |
else
# l, V& ^6 o/ x" _
{
) L" I2 [4 f" m, m1 c/ ~5 @
print2arm("edma3init() Failed.",0);
* w) c3 t7 E4 z! h; G9 z" k
}
+ T1 b! L2 c. w4 P
) A, j& Y8 m9 a
if (result == EDMA3_DRV_SOK)
5 O# T- f# }) \3 W3 [5 R$ b
{
9 v! d! T$ s& L0 r, e
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
" [) M* F4 w& y- I3 f+ z$ E
(EDMA3_RM_EventQueue)0,
& P* |4 |3 G' q/ E
&edma3_isr, NULL);
' i- a- o; R7 v9 U* ^+ y( ~% T2 H
}
( j5 Z* E6 e3 W* D
# y1 c3 s& B* F X- v; B
if(result == EDMA3_DRV_SOK)
4 ~* i: u: H4 I# }
{
9 E* ] m! f4 ]" p' S/ `9 }
paramSet.srcBIdx = 0;
! m1 N9 _5 C7 G# V6 [
paramSet.destBIdx = 1;
+ d/ R1 W1 q( T/ z) E3 N0 E
paramSet.srcCIdx = 0;
9 {% E0 [( u! j. Q- b
paramSet.destCIdx = 0;
N. p' s' q0 Z2 V z8 R
paramSet.aCnt = PING_PONG_ACNT;
9 t' Q* {+ ^3 C
paramSet.bCnt = PING_PONG_BCNT;
+ g; O% k5 X6 }' L% g1 M/ Q
paramSet.cCnt = PING_PONG_CCNT;
# O* D# q4 E0 D n6 K5 O* g% @
6 p/ a3 Z% i1 I8 Z
/* For AB-synchronized transfers, BCNTRLD is not used. */
& j; Q+ }; V) g
paramSet.bCntReload = PING_PONG_BCNT;
' z7 G# [! r: u# O
7 V# L7 w% o- N& s! X) {
/* Src in constant mode Dest in INCR modes */
0 I& g |8 w6 E
paramSet.opt &= 0xFFFFFFFDu;
n: R+ }1 V0 Q6 ]
//paramSet.opt &= 0xFFFFFFFCu;
9 j9 a$ R6 m; `& ]6 b
% O% R+ {2 j Q `( G6 u
/* Program the TCC */
' T) `6 n3 ^/ x! t+ P
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
/ o% |, A. ?$ Q: f
9 F( |0 y% |$ u
/* Enable Intermediate & Final transfer completion interrupt */
9 e, i7 f8 l' a0 b
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
# i# e$ q w6 |0 b3 Q3 r
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
1 T3 Q) q) H. V6 K
* a/ v" |8 {& B* H, z0 V
/* AB Sync Transfer Mode */
$ q' F( l# }( n( w0 X7 v
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
t6 l) Z8 y' {6 [' w4 r' g
* g Z1 p4 C7 F! b. [
/* Program the source and dest addresses for master DMA channel */
, H4 h, }2 r: G. [) j; {0 i; T
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
* M/ H9 [; N. B2 V9 E
paramSet.destAddr = (uint32_t)(ping_buffer);
3 n* ?7 r: h7 d; L- e- C
: j# ^) s7 }* x1 a: A. ~
/* Write to the master DMA channel first. */
/ H' n0 ^& G- _; U
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
; L" U3 m# q. l6 R* w" l" {
}
+ ~6 O0 w& |: O- W; M. W" u! {
7 d J3 p6 [; V
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
2 ]7 J! I! l; ~0 J3 T/ ?
. f. O- d5 x' @) W6 S" c0 `7 D' k
if(result == EDMA3_DRV_SOK)
( Y' A% x7 N, M' ~ @: T# C
{
# |1 r; L2 b+ O* d+ {- I7 `
print2arm("edma3 driver init success.",0);
( Z4 r T7 Q8 Q! I$ y: K
}
* d: L" n0 k, ^) X. S& O$ }3 B9 f# b
}
8 w; p" ^% b. S
! s& k& R) [) U; j5 M% f2 z
. I, I$ v. l; R" A# I& q
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
1 M& b3 d- }4 Y
y0 K6 E9 z) f9 {4 P
8 i! b: ~% A o. J: j% o, |
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
- a2 F( G$ v0 w" w" G- Q% Y" V1 O
每次DMA传输完成后都要再次使能传输
" I* G8 S- S$ a/ ?" M
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4