嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
# ~* [/ X, d/ s8 A
#define PING_PONG_ACNT 1
; [! s8 J- A- q* \. ]" c3 S6 Q) n
#define PING_PONG_BCNT 8*32*40
' Y$ [; Y v- h+ u
//#define PING_PONG_BCNT 1
" S4 ?. B! i- Z
#define PING_PONG_CCNT 1
, F: |$ |5 X/ e8 p- m
#define MCASP_BASEADDR 0x01D00000
9 ^' I- _: M6 B# n8 \4 x) R
#define Mcasp_RXEVENTQUE (0u)
0 x7 s" s8 G+ h# ]4 X. n
D5 X) `, Y9 R4 B
/* OPT Field specific defines */
4 O5 Q X) y# I8 l2 M+ d" j4 P
#define OPT_SYNCDIM_SHIFT (0x00000002u)
y9 W! a' C) W
#define OPT_TCC_MASK (0x0003F000u)
4 o+ {/ [% B% y# w: K8 K* L4 ]( ]
#define OPT_TCC_SHIFT (0x0000000Cu)
6 l: p* k: W/ v, C. P/ i
#define OPT_ITCINTEN_SHIFT (0x00000015u)
- |$ ~8 r( N& d9 s4 L
#define OPT_TCINTEN_SHIFT (0x00000014u)
, @7 a7 f1 g; l6 U: ^" S4 G0 v
# y: y. u) X; l+ W* f8 c
char ping_buffer[PING_PONG_BCNT];
! [3 o" T I5 ?! L# e# ~+ k
char pong_buffer[PING_PONG_BCNT];
& Q+ Z+ l* h. i( ]! K
. U: _" T) [8 P) _% P
+ Z5 P* M( V! O0 y# K
6 g8 t) Z6 h6 \3 c- A
5 b3 i0 A: F" H* |3 d, ?& c
static void ys_edma3_init()
1 K* B" I* ^6 d6 A! Q
{
/ Z' x+ b" C+ {5 U% p! U
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
/ m6 G7 ] T. h" E( S' |8 ~* C$ c8 _
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
0 w- |* `4 j. M
EDMA3_DRV_Handle hEdma;
* b9 F; @! i C2 K. r. _- R; p
uint32_t chId = 0;
; |9 l' r" C" Z2 O+ J* v, C
uint32_t tcc = 0;
, h5 v) Q$ W, \: S% L' G; e
5 q( |6 K4 m) U; C
print2arm("edma3 driver init...",0);
( M1 M" D6 g4 R1 w1 w% ~. Q H
7 F# W3 v2 Z* A. i& S3 q7 D5 G
hEdma = edma3init(0,&result);
4 K6 e) V. D4 s# S, j/ i0 K
if(hEdma)
- q4 ~$ h* W% B$ p. j: s1 R0 K
{
, H9 C# w" h/ m2 Q' M
print2arm("edma3init() Passed.",0);
+ h* S- Q# g) E6 R' \0 K
}
" A+ A1 j& }- V' y9 C5 W
else
2 x* k4 b* o' j3 M9 T6 z3 j7 A
{
6 o- Z3 [; \, S. G6 z: ~& O+ `1 m
print2arm("edma3init() Failed.",0);
& j1 r$ R7 P R
}
- f) h: a! F4 ?0 u0 I
; t) b) K+ W( t6 U0 P! |; O; M7 d/ p
if (result == EDMA3_DRV_SOK)
% Y" N% w* z' W( e4 X
{
6 ?* F+ [, c, ?( n6 e0 X
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
1 j5 k- S% b$ f N% _- f
(EDMA3_RM_EventQueue)0,
0 G* d9 }% L2 b6 t% y( W' A" e
&edma3_isr, NULL);
( a0 o0 c) ~8 M' ?7 X
}
- K# f% X7 E0 J% x) l; N1 M
$ G1 J* i1 ?6 t* J5 ^: N
if(result == EDMA3_DRV_SOK)
9 z B- ~0 @& {3 c9 w k
{
" b! Q( I5 A- r4 r7 H
paramSet.srcBIdx = 0;
1 p u: r3 J m, R
paramSet.destBIdx = 1;
& _. g( |4 N% M, F6 k0 _& j
paramSet.srcCIdx = 0;
2 t; U2 a4 o# }: t' [! ~
paramSet.destCIdx = 0;
* ]4 o4 ~& T3 t7 j
paramSet.aCnt = PING_PONG_ACNT;
k& Q$ J2 T: O1 w7 H+ {# x
paramSet.bCnt = PING_PONG_BCNT;
5 F3 p- u+ s; O4 A {
paramSet.cCnt = PING_PONG_CCNT;
: y2 y( ?: J6 o3 h5 Y
/ D' O5 w1 D* p( q
/* For AB-synchronized transfers, BCNTRLD is not used. */
9 m% T5 A* L3 G" z
paramSet.bCntReload = PING_PONG_BCNT;
6 P( I( g8 @9 E
: e9 Q: _+ o2 d$ }% Q
/* Src in constant mode Dest in INCR modes */
) }" {6 f! t# E7 G
paramSet.opt &= 0xFFFFFFFDu;
9 b( t( B- T* V
//paramSet.opt &= 0xFFFFFFFCu;
. }( B& [7 z3 V/ Y5 |9 |
. r+ j& j! t) @/ ?3 s
/* Program the TCC */
( ]; V* D; @+ I4 d* p
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
, i0 n v+ U/ B/ j, \7 Y
0 x: l2 R+ }2 D$ W
/* Enable Intermediate & Final transfer completion interrupt */
1 d* E: u9 {, Z2 B
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
: \; \0 @! H. K- D0 ]0 i# r7 }
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
6 C! P3 t$ Y6 p6 | g3 j
$ W4 Q9 z, w- f$ Z5 R/ `
/* AB Sync Transfer Mode */
( i0 ?2 u6 v! `! x
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
; P4 ~# o- C6 j. S
% v0 H' M- S0 f( r2 ~
/* Program the source and dest addresses for master DMA channel */
- j4 N$ t3 Z& q* N; N. X
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
. j( p. U2 C3 N3 I0 h* ?; B
paramSet.destAddr = (uint32_t)(ping_buffer);
. i3 s6 N! R* r( [" p1 g2 U: S
8 T8 j- }& f& l$ _& D" A: ?2 u
/* Write to the master DMA channel first. */
' H$ t* F9 {9 W1 a& M, T" Z: b( Y
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
/ d, E2 r1 g B( b2 O
}
- Q3 j+ G; J( |% D, t% V M1 F( R
+ e3 x/ z" R! I, O
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
) b" m1 p2 h. g2 ` x
+ U& P* U6 { n* u* @" }" J7 _
if(result == EDMA3_DRV_SOK)
" i6 m* O& t" p. I- o/ v
{
" D( [+ f' Y/ M4 S( d' {$ k) [
print2arm("edma3 driver init success.",0);
- n- x4 Z* Z3 I
}
& Z* C: O$ r6 s+ i
}
( d( @ }: i3 z6 a
+ `& N! l8 D. b2 D5 C6 x2 e
1 g/ ?- D. H0 X5 F8 u; @: M
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
' s; N. ]6 d6 k, g9 X+ {
- a: @" }! U* F0 w, b$ P% Y# \
: o! R" E+ m H# ~. Z
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
$ [' R! U+ ~3 B# E8 p* c3 u% r0 [2 Q/ Y
每次DMA传输完成后都要再次使能传输
1 ]0 i* Y: [$ o
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4