嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
" _' O% {3 U. [
#define PING_PONG_ACNT 1
% a6 k/ @ @- e
#define PING_PONG_BCNT 8*32*40
+ C3 ]! o! `( S
//#define PING_PONG_BCNT 1
% h; H( k8 |6 ]2 l8 Q
#define PING_PONG_CCNT 1
% M" e z6 g b( k& Q2 N# I( o
#define MCASP_BASEADDR 0x01D00000
9 J9 m; s" e+ m8 G" _9 p
#define Mcasp_RXEVENTQUE (0u)
( W' s( U$ f) A' _! W& F+ W
0 @ h. W6 P8 T G9 Q8 X
/* OPT Field specific defines */
3 p j% c- W0 w
#define OPT_SYNCDIM_SHIFT (0x00000002u)
* ^2 P' t u$ r* j, z$ h3 H
#define OPT_TCC_MASK (0x0003F000u)
2 S. b" f; u. Y8 p4 ^8 G
#define OPT_TCC_SHIFT (0x0000000Cu)
% I! l1 L4 ]. q* K3 \
#define OPT_ITCINTEN_SHIFT (0x00000015u)
" h" q1 d. I f( M0 ^
#define OPT_TCINTEN_SHIFT (0x00000014u)
1 {& d' }9 L2 s' u) |
! w5 G% ]8 }0 c t0 ~! h7 L
char ping_buffer[PING_PONG_BCNT];
. s& R) t) C9 R" L
char pong_buffer[PING_PONG_BCNT];
! t0 V9 Y l( t0 g) G
k. J$ R5 Y$ T9 Q! @2 i$ b( x
0 C3 X3 F: s1 m& F
" ~% g0 K" W( J* G9 p; M6 _, {
+ w2 f) O) T2 f- H- o- C
static void ys_edma3_init()
9 ~' F2 l* x+ O, w
{
; e3 A" Y9 r! C
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
' C5 }: x% c$ ]6 }
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
# r( O7 E7 c; ]% [& Q/ K# e
EDMA3_DRV_Handle hEdma;
, c9 n# q9 R/ \) e
uint32_t chId = 0;
) c) `! ?/ z: F4 [8 m
uint32_t tcc = 0;
' o: [' V4 x8 F+ |. m
3 g/ ~$ U, V# v' P9 A+ }( o. K/ i
print2arm("edma3 driver init...",0);
. P( i4 ]( `& \- p6 Y
' ^/ w: H, i/ o: d7 X
hEdma = edma3init(0,&result);
2 ~2 |! p: O* s4 |9 o$ e
if(hEdma)
7 S/ U, | t& u' O T# X/ e
{
! b, d) i- C8 w
print2arm("edma3init() Passed.",0);
; q v/ N9 }- b$ X! s* p
}
_- P: J J" M- _! g
else
/ F$ ]9 I7 g/ ?1 E
{
" G, v1 C3 F- g8 y% Z$ E
print2arm("edma3init() Failed.",0);
6 w/ g+ h$ ?0 H% K% V
}
1 A3 Z( H' |+ a# H
: N+ K+ n1 m3 h
if (result == EDMA3_DRV_SOK)
) x" V; m8 ^0 V q; g
{
: e# X$ ~' O* a# r/ X, S
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
$ A3 f4 h3 J' W% z/ d3 I! H* I0 I
(EDMA3_RM_EventQueue)0,
: e4 U8 H* C$ ^7 q! w/ L0 B
&edma3_isr, NULL);
) t. W4 A: h( K# _
}
9 L/ M1 y$ K/ {+ |& t1 I3 o
C# f" s' I* G4 V. P
if(result == EDMA3_DRV_SOK)
1 f0 D, I d( ~/ E1 f) h+ |3 f+ \
{
- l: w+ m) V3 ]
paramSet.srcBIdx = 0;
# k3 q0 s2 j( Z/ W
paramSet.destBIdx = 1;
3 ^% k" T% b0 z; m6 ?
paramSet.srcCIdx = 0;
( M0 o, ~' {0 n% V( ? X7 O7 I0 D
paramSet.destCIdx = 0;
% n6 x* d# w4 c c) I T
paramSet.aCnt = PING_PONG_ACNT;
; x7 n, _6 p9 I$ E
paramSet.bCnt = PING_PONG_BCNT;
+ p1 W. L9 k. L6 Q
paramSet.cCnt = PING_PONG_CCNT;
1 F* q# V. A! i/ B
* K; h0 y4 j5 ~0 A$ \- W, c
/* For AB-synchronized transfers, BCNTRLD is not used. */
/ m6 e3 @* U9 Q. E
paramSet.bCntReload = PING_PONG_BCNT;
: b6 |3 n& ~, S: y6 l* R
1 p1 F1 `. v; u) D/ W* S/ O8 c
/* Src in constant mode Dest in INCR modes */
5 L2 A# M" i, E3 g
paramSet.opt &= 0xFFFFFFFDu;
' C( F) ^9 ~7 a5 A8 N# k, W7 N! W
//paramSet.opt &= 0xFFFFFFFCu;
, F* G2 E6 F+ M) M# ?
' t2 F5 g _1 P+ m7 w# l2 }
/* Program the TCC */
4 G, u( q/ I0 C' L; Y. x) A' h) N
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
; K C! [6 A; y# J# R7 r
/ c% Q6 e" @3 g& _" B, J ?- _
/* Enable Intermediate & Final transfer completion interrupt */
' r3 X& B- V+ H: |6 f
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
( ] }3 R } L+ V/ j/ s
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
8 Z( d! u7 X6 j h
; {, x. c' J+ `5 l
/* AB Sync Transfer Mode */
/ M. p0 ^7 _% E( D% I) z
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
5 O& o* j7 [1 z/ F: A1 A
# u9 R. ^6 b9 Y. T# i4 ^
/* Program the source and dest addresses for master DMA channel */
; h: v2 i6 Z" W& h% w) o9 `/ o- |4 O
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
) s2 F( B: `9 t
paramSet.destAddr = (uint32_t)(ping_buffer);
" T0 J$ \5 C9 m) f C; j, V
z- L$ S" p& d, i- X
/* Write to the master DMA channel first. */
4 y. k9 K8 P9 b' ~" g( {
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
- T% a/ J8 p" E+ c
}
4 O8 p$ K" c9 e" X& S1 A5 z, F
8 h' @2 D2 {0 n% K' i: s
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
1 `: J5 }( i1 q: a9 D* H. ]0 ^6 r
. X4 J3 g( W1 @
if(result == EDMA3_DRV_SOK)
' `* n6 d @& Q1 A2 F. U
{
+ g% Z( D: S; N, q- `/ q* {
print2arm("edma3 driver init success.",0);
; e1 }" V+ `, b6 y$ N5 e
}
9 I( k! N: {! q+ `
}
. r0 Q0 {+ j1 X5 A. v( u/ F9 \( O
6 n1 \* ?0 J$ p( y: S8 }2 M. I3 ~
; ~5 Q2 f( t' E7 F. g$ R
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
# u- T/ ` r+ F8 _7 N9 K( |
& B" u2 j% [ J: p; c0 q
3 u) V9 k5 x+ ?) ?- X, G- C
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
2 d# i; Y& p& o2 f
每次DMA传输完成后都要再次使能传输
( k8 y8 H2 [: [3 O3 |# f* ~, k" N
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4