嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
5 `& H0 E* a* }* `
#define PING_PONG_ACNT 1
% z [7 o3 j8 `
#define PING_PONG_BCNT 8*32*40
* h+ ?" b9 Q: v( n7 N
//#define PING_PONG_BCNT 1
. w r! S8 I; H1 s$ a9 q- }+ h
#define PING_PONG_CCNT 1
. ~' M* |! Y5 o) Q9 ?' c
#define MCASP_BASEADDR 0x01D00000
8 m3 v" C! [7 U3 @1 W; {
#define Mcasp_RXEVENTQUE (0u)
7 a" c$ t8 W7 M# Y/ G
) ^5 n# z: e! e: w2 I$ ^
/* OPT Field specific defines */
1 Y6 g1 D5 Y( [
#define OPT_SYNCDIM_SHIFT (0x00000002u)
' ^' K, d" ]3 b0 G& T5 r2 x
#define OPT_TCC_MASK (0x0003F000u)
$ s* |# `1 W- e5 b% |) i
#define OPT_TCC_SHIFT (0x0000000Cu)
& X! O3 z$ a, K+ u9 {* n& R
#define OPT_ITCINTEN_SHIFT (0x00000015u)
]# z6 k U9 A. ?7 h, q
#define OPT_TCINTEN_SHIFT (0x00000014u)
6 Z3 R _9 ?/ V$ d% Y0 P
/ ^- [! F/ J& c8 m& L3 q$ ?# P
char ping_buffer[PING_PONG_BCNT];
( f; |. `- k% G: z
char pong_buffer[PING_PONG_BCNT];
2 O) w. A2 b* R* S
/ z" H0 F- ~) |& {$ R
7 K6 @$ y' m' J4 R+ I- c+ U
0 q; U4 c0 m) N3 Y- Z! }+ d# L
0 h( o S& c: @- g( j
static void ys_edma3_init()
) W5 b' M1 ?- l( ~* C o
{
M" Z# I/ H' c( q" f
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& P' {4 G0 f" l4 G0 D
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
+ C0 H* y' C9 L& I4 B5 z
EDMA3_DRV_Handle hEdma;
- Z. U) G$ u& N$ a7 h
uint32_t chId = 0;
4 C1 h. p9 C& p
uint32_t tcc = 0;
, T5 Z" V7 Y$ m- ]) x9 x8 |
, U2 _6 p! u. x- I5 B
print2arm("edma3 driver init...",0);
A6 o, `: ]1 g9 s
0 t) w o$ s* x/ F
hEdma = edma3init(0,&result);
9 H, c' ]1 I7 X- ?# ?4 a( {* p7 F* ~
if(hEdma)
3 L% d' T2 K1 Q1 {
{
2 |8 P! c% l# z( o$ r" i9 }
print2arm("edma3init() Passed.",0);
0 j$ O8 P: [ P5 ]! V8 W. \
}
9 B2 p6 j" k Q/ `1 o8 _
else
5 x' b; Q: n6 U9 Q
{
) K& g& v. x' u1 K: S5 }
print2arm("edma3init() Failed.",0);
, q: @. r* B. U3 X- |5 f9 k8 `1 M
}
' S9 t! i6 Y3 ^' S
" T9 F7 O& g8 H/ X+ Z. T
if (result == EDMA3_DRV_SOK)
( p% F' R1 c7 i- M- |0 l/ f7 t
{
2 i* e9 v" W7 f3 d2 _) i
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
% H+ s5 }% C# s3 K; W) i: R! N# B0 _
(EDMA3_RM_EventQueue)0,
# e7 K; W; E9 i1 B3 a9 Q
&edma3_isr, NULL);
2 X% m8 |( ~ W: |
}
$ T' K! O7 Y0 V+ v; f7 p* }/ x4 N1 _
: [* f j7 k( }/ @8 x; H
if(result == EDMA3_DRV_SOK)
$ A8 W. C& ]+ M, n5 |6 X
{
$ v, m8 f) d1 f# i+ P( D1 b5 W( b
paramSet.srcBIdx = 0;
# x0 o2 s1 v. e; F, e s, S
paramSet.destBIdx = 1;
6 ]. T1 s; N/ I1 e6 F f# A
paramSet.srcCIdx = 0;
. a4 g7 U* o: _% n" @
paramSet.destCIdx = 0;
" Q3 L3 E; B6 i4 }3 D+ N
paramSet.aCnt = PING_PONG_ACNT;
% n6 ^* X' F0 P- V
paramSet.bCnt = PING_PONG_BCNT;
1 \* n+ X; e: I# p! f
paramSet.cCnt = PING_PONG_CCNT;
7 f9 N. ? S+ ]( d. c# s" ?4 U
/ r5 u* k& F! p; Y4 `5 T* d/ r& f
/* For AB-synchronized transfers, BCNTRLD is not used. */
6 H3 c L7 J) S7 ?! A) b
paramSet.bCntReload = PING_PONG_BCNT;
% Y5 E! A0 w" m; c& `
0 K6 W. r% {# A1 [% [1 R: k
/* Src in constant mode Dest in INCR modes */
' A0 Z, a9 H+ u& h& G5 Q. A+ E2 O
paramSet.opt &= 0xFFFFFFFDu;
5 d! q# m/ T8 ^* r k
//paramSet.opt &= 0xFFFFFFFCu;
- ?- [' B& s/ ^2 ?5 g9 Y+ H/ o
3 l: u- X. w+ y+ l/ H" K: v
/* Program the TCC */
* A; b- V9 B% I0 X8 l' g
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
; O1 k0 e9 a9 R9 F8 S* r
' h' |& \7 f8 B% u4 `$ H
/* Enable Intermediate & Final transfer completion interrupt */
& D# Z& E, j( J4 V
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
' K* [3 B$ I6 g4 s% g# l/ ]8 u
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
- O& X2 P+ q1 V
5 S, ?2 k0 z. S6 W2 k% R' e
/* AB Sync Transfer Mode */
5 O/ N8 W) Q7 R2 V
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
2 `& |7 ~. ]: O
$ l. S, k/ m/ I1 |; {- K
/* Program the source and dest addresses for master DMA channel */
4 n1 t0 Z- C# t, A: k% L0 |
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
- W0 j$ n1 M$ s; }+ t$ D
paramSet.destAddr = (uint32_t)(ping_buffer);
1 F$ S8 v8 A7 K" D; W. a, J! J
* J0 k9 q4 ~/ P
/* Write to the master DMA channel first. */
; L6 ?0 O- g4 x5 u: N0 F/ h6 \/ q7 q
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
5 k0 I1 M. S2 R3 c
}
2 z& h T( y: D! G) ?
5 {" a2 P; v8 g$ M5 ]& N/ @/ b
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
* o1 n" f7 t( _5 S0 K5 Q" g
' }2 f- l6 P' s0 |7 U" n7 g! D4 q X
if(result == EDMA3_DRV_SOK)
" ?" y: F& B% U* T
{
9 k/ w! A3 q( O/ i* F: G
print2arm("edma3 driver init success.",0);
- k( [, d k9 W3 }2 w
}
) i k3 \% Q# Y
}
; V6 {7 x2 b, d/ v
8 A& L/ k- D9 ~& x# c, p( f
7 c( u# d: e) s d" s7 M4 D& P" V
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
7 W6 b' }3 S8 j* [; P: d
6 O( u/ W" ^0 ?; U3 Q& G
E/ K/ ~+ j: N$ D$ D2 \2 A
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
# C7 e% G |6 P, W( r9 W# G
每次DMA传输完成后都要再次使能传输
/ O$ Y$ ^' d3 C3 h; |. J; Y
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4