嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
0 x5 m: l ^2 W7 b6 E
#define PING_PONG_ACNT 1
5 T& |0 E7 e" f* K0 w4 m
#define PING_PONG_BCNT 8*32*40
3 y* A5 N/ y9 M; F
//#define PING_PONG_BCNT 1
& l( P( m: |% j6 `. P) W* P# w
#define PING_PONG_CCNT 1
: }, V6 e3 y: g8 f
#define MCASP_BASEADDR 0x01D00000
; w4 ]- [/ T9 O
#define Mcasp_RXEVENTQUE (0u)
* o; e: _" F6 m3 |9 ?
: I$ x0 i# G( F3 X1 D" A1 F
/* OPT Field specific defines */
6 }. K: N' U9 a& F; B L2 t7 F
#define OPT_SYNCDIM_SHIFT (0x00000002u)
7 N. l& r; h" ~
#define OPT_TCC_MASK (0x0003F000u)
) r% I& w$ Y' o9 m" ~' p% b/ N, C
#define OPT_TCC_SHIFT (0x0000000Cu)
2 ?- j! s! { ~* u
#define OPT_ITCINTEN_SHIFT (0x00000015u)
9 r. ]) O6 ~3 u
#define OPT_TCINTEN_SHIFT (0x00000014u)
: x. q& U# g7 n5 K" w! R
( t3 h' |* g3 d% ^4 p+ H
char ping_buffer[PING_PONG_BCNT];
. G4 E, z8 }: s: {7 I1 N: U
char pong_buffer[PING_PONG_BCNT];
3 A, \& X4 e7 }; w$ o/ @
: \0 {& H+ h$ Y5 d
' \1 N5 q% G) F- z5 q& p: M% ?
' Y9 T* M4 W& M5 |1 d& D6 S
0 y, r- R7 T, `1 D2 f- w0 ]6 k, d
static void ys_edma3_init()
1 A [( f: m! A
{
8 }6 M/ W7 x* w, H4 d2 P
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
3 M( h; j& k# C$ b# a6 o0 k0 V
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
/ H: u) i' E& M* J* R$ r0 M3 U
EDMA3_DRV_Handle hEdma;
9 x; N1 g' \' ?) U9 t: V
uint32_t chId = 0;
( {+ }* _3 y$ q1 Y( n
uint32_t tcc = 0;
' a% Y/ M2 _. S1 A9 J l) t0 U O
7 W3 p* `/ x5 `6 A
print2arm("edma3 driver init...",0);
% G, p* g9 h$ T2 E2 _
1 |3 ]9 f: ?1 {8 O+ N" P
hEdma = edma3init(0,&result);
; f: \) Z4 G( B: ]
if(hEdma)
& L% O# P5 P8 O3 `
{
- i% F/ [3 e5 e b( k$ [) m0 A
print2arm("edma3init() Passed.",0);
) }& N9 N5 S) [ v
}
( T% ?) F4 Z1 e
else
: s- x. X& ^) K% e& Z7 @
{
* e6 F6 c5 e; o: M, ?6 R R
print2arm("edma3init() Failed.",0);
4 Y$ L- j, x, ~: c
}
% _+ z; U. a4 F e8 |
3 _0 l; Y2 e2 a) a |
if (result == EDMA3_DRV_SOK)
& \1 X7 }' v r: ^
{
3 g- M- J% V J% {4 [ i
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
3 S! C) Q9 h: D9 |3 G9 u
(EDMA3_RM_EventQueue)0,
# z: W# k2 J& X
&edma3_isr, NULL);
4 _2 J& }) x" m8 c# p
}
+ z+ ^' L2 d: T- e! {. G
: {5 w2 v' S! R3 B8 o
if(result == EDMA3_DRV_SOK)
- n1 j8 a6 ~4 O j$ F8 \' J
{
! b' e/ a8 q2 h( o& y1 \9 r9 h
paramSet.srcBIdx = 0;
" i+ {& B$ ?# Q1 V4 _
paramSet.destBIdx = 1;
( Y8 D5 O* O+ x
paramSet.srcCIdx = 0;
8 E& W4 D9 O9 q, ]5 a! s
paramSet.destCIdx = 0;
/ e [/ F; W, t% W) w' M q7 r
paramSet.aCnt = PING_PONG_ACNT;
3 W4 @1 N1 }9 ~) \/ D7 x: e
paramSet.bCnt = PING_PONG_BCNT;
7 K& F% r) n) f5 B. A. a }) T1 ~9 h
paramSet.cCnt = PING_PONG_CCNT;
: a" f! k% e5 w# f$ U% w# k" R
: l2 J5 Y2 w1 T7 p# l" G) z& @: |
/* For AB-synchronized transfers, BCNTRLD is not used. */
2 j! A9 r* J k% A- ]/ v
paramSet.bCntReload = PING_PONG_BCNT;
+ q1 y& T# F4 W3 d3 [
, k, s6 ^, O& J
/* Src in constant mode Dest in INCR modes */
. W* ]) Q8 d6 t$ }) Z( d4 P
paramSet.opt &= 0xFFFFFFFDu;
2 p# m) T) y( ~
//paramSet.opt &= 0xFFFFFFFCu;
g( F1 S) K/ f1 E+ U# a
( Z' u$ _5 {, o! }0 W8 u- S( ^* c
/* Program the TCC */
* E, F0 {& e) x2 ] V* v
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
- f F2 c* d3 Q; Z6 @6 r2 r, N
1 u: H2 P H" O9 N& B$ [
/* Enable Intermediate & Final transfer completion interrupt */
0 ?6 G7 k( O6 t! W9 T& n
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
9 j x% |5 L3 Q1 o5 R5 L
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
; H2 ]) z& r- w* T- _0 }' M e. @
( h6 C# G5 S3 R6 @
/* AB Sync Transfer Mode */
2 ~( @7 O3 g; u+ e* _6 o% a# n- ?
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
$ m) Y% Q* z. A9 |4 i0 b
/ r4 a8 d2 A, ~& i4 [( B! U
/* Program the source and dest addresses for master DMA channel */
! I6 w, Q6 m" m o2 X5 F N
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
! T5 G) Q; y' @' [2 w3 p+ _# }
paramSet.destAddr = (uint32_t)(ping_buffer);
( E U# ?* @; F$ J" \7 M, J
) w) a- D+ y$ x5 u5 F
/* Write to the master DMA channel first. */
$ S# T ?, o% R6 u1 o
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
: m3 O @/ v* |, K3 v
}
/ L# l1 \8 n( s0 r" n. d2 O6 @
2 F+ U) G/ W+ L& b+ J2 M5 I. m
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
4 H _" \' I- j4 ^
7 h. n/ O! z& B* S2 X- k/ V
if(result == EDMA3_DRV_SOK)
( r, y6 w- w9 [6 y( r" U
{
0 F, V/ D% P$ H; d" P9 y+ a
print2arm("edma3 driver init success.",0);
9 H: W" n* q% A' W
}
! Y" G F& Q! [. I+ p& l! ?9 W
}
5 v3 A- t) a- m7 { N" Z
# ^8 t. [* `# B4 \7 L
0 m, q7 H* a# w) O
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
f% G. ~; m3 j2 B
( l, a8 N! v/ u' M. ^
+ o$ J0 }: e, ^8 d( h) O
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
; L5 b' q+ b( _9 t
每次DMA传输完成后都要再次使能传输
8 T3 B: i: j# _* \* p N
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4