嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
} {8 j- a# D! ] b
#define PING_PONG_ACNT 1
: F# ]3 N0 Z0 m5 f: K: ?
#define PING_PONG_BCNT 8*32*40
- o/ u, n& C( X
//#define PING_PONG_BCNT 1
1 B! D* P3 {! c0 ]
#define PING_PONG_CCNT 1
2 j: P1 S; U0 R" _
#define MCASP_BASEADDR 0x01D00000
9 a, T2 d$ G5 q* ]* B
#define Mcasp_RXEVENTQUE (0u)
5 C r1 F: U/ Y& ~: F* A5 d
" n5 y$ p2 e% E+ n
/* OPT Field specific defines */
0 @: M( c) y% Z$ q4 }4 b" @& U
#define OPT_SYNCDIM_SHIFT (0x00000002u)
& O8 ?3 Y" G3 ^- W3 `8 a6 ]
#define OPT_TCC_MASK (0x0003F000u)
0 M8 V. z: w5 s. b4 g# i! v
#define OPT_TCC_SHIFT (0x0000000Cu)
3 p* u, c, }& ]0 E9 V, L
#define OPT_ITCINTEN_SHIFT (0x00000015u)
% N' I1 y2 n4 N6 V# X! h
#define OPT_TCINTEN_SHIFT (0x00000014u)
+ _4 M$ e+ b; `) E' ?% t; f$ g
" \6 ^3 G1 c4 |, f
char ping_buffer[PING_PONG_BCNT];
. s, G- G" q) C) I5 ]: o5 ^
char pong_buffer[PING_PONG_BCNT];
! {( w% W' X' V, A+ e. X3 J
s t/ _- |4 \. W; L
% U7 U0 K7 W6 t8 z9 F1 n; ^
; S: E, j2 m% y% |
3 s+ k* s. T2 i+ a7 J1 O
static void ys_edma3_init()
0 T7 T& c: `, @. U2 m* r/ Z
{
( T3 w9 l0 B O( j- T8 X
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
" `6 s( T1 n: ^' `" ]" T7 }- r
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
- |0 }7 [# s5 ]9 k( C# P, F0 Z, I
EDMA3_DRV_Handle hEdma;
4 I4 I/ z5 P N1 m8 @
uint32_t chId = 0;
' @/ X4 `7 A7 R4 ?$ m4 l
uint32_t tcc = 0;
: N% w3 g C2 h {4 O
, M/ K. A: J& l
print2arm("edma3 driver init...",0);
+ n- e/ c' ~+ O7 o/ G/ m$ s
5 J4 g7 r& e0 Q) w0 ?4 @0 o) L
hEdma = edma3init(0,&result);
5 l2 t$ m/ h$ V8 {
if(hEdma)
* \' U0 c7 J0 }# m+ A; ]
{
8 l- q' o' j3 w, t+ w! k& G
print2arm("edma3init() Passed.",0);
% B% d2 @8 E4 G5 r& a% s6 Q
}
$ I; a7 J7 k1 C, e) {' K9 c9 o5 B
else
! E/ t# k% U4 M/ y% _9 v" B5 I0 ^" p
{
$ ` X$ ^, E6 h! x6 t3 j' a9 Z; C
print2arm("edma3init() Failed.",0);
: _2 ]* H- H* U5 `; x
}
1 q4 J( \) L7 W: J2 g! D
2 ]$ I; J4 b6 ^
if (result == EDMA3_DRV_SOK)
; Y) H! ?0 a1 G; s8 m( J
{
, J P5 \& }: d$ N0 ~
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
+ ~* ]# U+ {9 M9 ~2 E6 `
(EDMA3_RM_EventQueue)0,
1 V; p) N* A) M8 a `
&edma3_isr, NULL);
/ w* L# h# Y2 S. V) Z* m. Y M
}
0 U- I. }, K3 {: R+ S; c7 W4 w! L
$ Z4 ]1 T0 H, p, v/ e. p! L5 |
if(result == EDMA3_DRV_SOK)
5 o$ |' ~: n8 W" W' _7 b
{
9 n% X. x2 D1 q0 D4 _9 C
paramSet.srcBIdx = 0;
6 k8 m: g& `5 O6 {
paramSet.destBIdx = 1;
2 c. l% W3 M y! }% V9 U
paramSet.srcCIdx = 0;
" c3 J/ ?! K |5 f
paramSet.destCIdx = 0;
3 o8 i4 r' m5 ?; B
paramSet.aCnt = PING_PONG_ACNT;
0 k! y" A6 k, P% p: Y O# R
paramSet.bCnt = PING_PONG_BCNT;
. G# a9 _: U) Z; V( B
paramSet.cCnt = PING_PONG_CCNT;
" A: J- a! ^8 o8 b3 _7 m* D
2 l( i3 n+ k9 Z/ t6 Y) ^' b/ ~
/* For AB-synchronized transfers, BCNTRLD is not used. */
' h; `; x- H; T4 u" T0 u% r. ?
paramSet.bCntReload = PING_PONG_BCNT;
! d$ I; v2 L$ I' c; Q% m U V
% }- `+ h* M( C& G+ b/ j6 Z8 V
/* Src in constant mode Dest in INCR modes */
; t3 e# j0 [8 x0 y6 N4 G$ F
paramSet.opt &= 0xFFFFFFFDu;
7 ?2 C+ o( r8 V" a* R4 @
//paramSet.opt &= 0xFFFFFFFCu;
; d$ M7 | W2 l+ q* O, d- J
. F& ^2 R7 A$ t0 X1 ^$ i6 Z
/* Program the TCC */
; t4 K6 N, v# @6 |! H/ l- Z
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
$ j' Z& c l% ~) |
2 @$ h3 X% z" l. c- e# Q
/* Enable Intermediate & Final transfer completion interrupt */
0 F% q2 {0 }4 d/ h7 A
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
: z9 d, W% v, K! j7 ]5 S
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
4 f K. c6 ] B1 T( z
3 W) O# E0 w( c# L% j- H" _; O
/* AB Sync Transfer Mode */
3 m3 W- t( m4 @: X( B- _+ Q
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
2 i! W" b8 B9 b# U; c7 Q
$ `, F1 t( }- \
/* Program the source and dest addresses for master DMA channel */
" H% e, ~' A( [; } s$ I7 L$ ~' @# {
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
! y* w2 u1 K5 {( X3 V1 {1 w
paramSet.destAddr = (uint32_t)(ping_buffer);
4 @2 k2 T. t% g! ]# L: S
7 V: e8 y. r! {( @1 ?
/* Write to the master DMA channel first. */
4 l8 R$ M: H1 H6 {4 g) O
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
+ v+ \ K( W. R
}
, [) P: k+ u5 j0 K/ f9 C. b" M5 @
, @4 F" {1 u" E7 X
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. V6 ]/ O8 C. T$ X! d: P* b* W2 I& _
- \* _- z' O: B7 h. X0 ]
if(result == EDMA3_DRV_SOK)
7 Y" G; H" m% M, s. D
{
8 R g* [ ?; l9 F; B3 |
print2arm("edma3 driver init success.",0);
; Q5 G; Y5 l: i% Z5 O1 ~( p
}
7 E4 ?' S! W+ }& ~: ^% P i; d% C) f
}
+ K: c" v. p2 r
. {. k O8 t; p9 a
/ A) V* `; |0 l9 E) q0 |
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
% P! ^$ q! \% L! h, i( C
& Q8 n/ W: D; q t
) c( n# ]* v) z, }0 g; `
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
! T, o3 y% e, K8 D4 F
每次DMA传输完成后都要再次使能传输
: G9 C5 Y" L1 s' s$ E
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4