嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
6 v( b; B8 |! D# s2 Z4 \
#define PING_PONG_ACNT 1
. T6 m; K8 a' |. O# N
#define PING_PONG_BCNT 8*32*40
, X% `5 u- f F& j ?5 E4 A
//#define PING_PONG_BCNT 1
: D! N, N* }! Y0 w8 _. s! M" a
#define PING_PONG_CCNT 1
- D3 ~6 V0 L9 N' x* {
#define MCASP_BASEADDR 0x01D00000
2 A1 ^9 Y% H9 q4 p; K# S
#define Mcasp_RXEVENTQUE (0u)
% R6 Q, x# A0 I" W* @- b
6 Y. W- \! @6 a: z
/* OPT Field specific defines */
6 q7 E* n$ s; m1 ^1 }6 H1 W5 {
#define OPT_SYNCDIM_SHIFT (0x00000002u)
9 y0 ~* g6 u' w# r
#define OPT_TCC_MASK (0x0003F000u)
2 o4 A. ]8 f# [" U7 b& Z" Y
#define OPT_TCC_SHIFT (0x0000000Cu)
% l$ Q x- V- G; _, K
#define OPT_ITCINTEN_SHIFT (0x00000015u)
! v# f* t7 u* }: X
#define OPT_TCINTEN_SHIFT (0x00000014u)
" J! j* d/ F/ B8 u: p j5 C2 ^
+ l: y- k; f7 Y- p
char ping_buffer[PING_PONG_BCNT];
" ?4 C9 b4 G! r
char pong_buffer[PING_PONG_BCNT];
8 c8 n h9 R% u- v: ]4 ?6 u' H4 T
) O* c* x7 V! @7 t" c9 y
- @# O, E8 ^4 G- \& |, j
" d7 O% t# }- g" _
2 ` |4 \% n" j- t! h3 k6 K
static void ys_edma3_init()
3 V/ ]5 l$ K5 Y9 v" _; n+ G
{
1 R2 v' j; B C0 i1 z
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
6 y. }; K, x Q
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
; D) }: z! Z; g% b$ v
EDMA3_DRV_Handle hEdma;
`$ \2 ~8 ?! m# B8 N3 }. ^
uint32_t chId = 0;
4 [1 C6 e5 |5 U ^9 |4 q O1 m) ~0 }
uint32_t tcc = 0;
- u' T: {4 z* L* F' Q B. Z7 K4 Z6 b: N
# j5 c/ {; d4 o1 a# U) ?
print2arm("edma3 driver init...",0);
7 }+ ^0 y* N8 H1 v
$ o; V+ n& X" T, g
hEdma = edma3init(0,&result);
# R2 B' F+ i) X; U' r: x: w3 \- r
if(hEdma)
( q; |) I X5 \; c$ K8 R6 z
{
! ^$ a# [% o* N% d$ F
print2arm("edma3init() Passed.",0);
# c. Q8 u6 E5 b+ x8 Z
}
4 i2 }2 b8 I! M7 I3 E- u0 ^
else
; t$ N( P7 f2 t, C( j
{
! f8 z* ~& T+ \
print2arm("edma3init() Failed.",0);
9 l7 x3 a* F- N B5 C) i1 {
}
[' Z( V5 o' ?. p6 _6 x
' I E/ F- C8 K0 [' X. F3 Y: |
if (result == EDMA3_DRV_SOK)
5 ~3 g" g+ t: W1 }" U: G
{
& o/ t" H" M+ \! O
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
, b3 s H! n u
(EDMA3_RM_EventQueue)0,
2 Q ]' f d6 n3 c3 b
&edma3_isr, NULL);
2 T9 b( I4 }5 f1 N2 S8 X$ ^
}
( L' I8 _! @, I# I, w
: a* h6 c: u% P3 ]; E5 t8 w5 N3 Y$ ^
if(result == EDMA3_DRV_SOK)
/ S" I2 |! w) ?4 c C
{
& b) S% x0 a8 E( L
paramSet.srcBIdx = 0;
) ^( y7 v5 M0 P, L% J
paramSet.destBIdx = 1;
) N. o4 f0 n; P5 ^
paramSet.srcCIdx = 0;
# {2 r9 ^. c% Q7 h" s
paramSet.destCIdx = 0;
" A! ?: t' v$ o8 y" A8 t
paramSet.aCnt = PING_PONG_ACNT;
6 j7 G5 @: z7 m( R
paramSet.bCnt = PING_PONG_BCNT;
7 L+ P8 T' N$ t/ `) k% U! r
paramSet.cCnt = PING_PONG_CCNT;
8 i K* d6 p6 e( Y! X# V6 u9 |; H9 n
# I# d2 h+ r! }" E R/ l
/* For AB-synchronized transfers, BCNTRLD is not used. */
9 v S3 A9 j6 B5 y" P9 @9 S, _
paramSet.bCntReload = PING_PONG_BCNT;
9 v1 d; o2 r! l6 ^( S. Q2 Z& k% r
V7 c6 Q" T; E- E, l
/* Src in constant mode Dest in INCR modes */
3 u" m/ g3 `* }6 u0 W
paramSet.opt &= 0xFFFFFFFDu;
. {! b; A1 F$ c; C( y' A( ~# R
//paramSet.opt &= 0xFFFFFFFCu;
: F* P9 @) ]8 \
9 j; H2 I0 S* W: K
/* Program the TCC */
9 _; f( \; n3 P
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
) x" K4 x/ g4 f% Q6 z& k0 J" i( I
/ Q4 G, a) y) H. Q
/* Enable Intermediate & Final transfer completion interrupt */
; x6 R; U- E2 w, q0 i
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
6 c/ @) k v/ ?. l3 y+ E. F
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
% w: E" H6 \- ]: c6 _4 h& [+ J
0 U9 V: m0 I; H3 z
/* AB Sync Transfer Mode */
@0 {1 F- {: Y4 X0 r$ D
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
0 K4 y8 b# X4 I- Z' p9 @
3 x' ?. g* P/ X2 u" E* x3 @
/* Program the source and dest addresses for master DMA channel */
: @* R! g/ x& k! @# T5 b* a
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
* I- z7 A, |# {1 {& u; w; t- F
paramSet.destAddr = (uint32_t)(ping_buffer);
4 K6 M& `# U K" F: M3 v* |
4 m2 e a5 ?5 s; ]6 z. i
/* Write to the master DMA channel first. */
$ ?/ u! p8 G2 F' R' p
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
( q# r& n1 d7 m8 U1 X. T1 G3 n
}
! G3 c/ N7 i8 c8 g5 m3 j
3 W0 g$ }4 L9 M1 u, a+ h3 D
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
* \ a- q/ u% k7 n5 A
- T: M$ N' }6 [) a
if(result == EDMA3_DRV_SOK)
9 a3 R- u/ \& U8 M- N4 W) b
{
5 ~& F4 c5 ~: \; g9 A
print2arm("edma3 driver init success.",0);
( @8 K% X0 O* [# o3 u0 O6 e- x
}
0 _' M0 x3 ^2 t/ b
}
6 S8 Y7 W( L' e5 ^
2 l+ U: B! ~4 I
2 t7 d3 f/ X. H$ O+ x: T5 K7 N( `1 y
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
) m9 f% M: y: `( K. }' B; c
& {; y+ b, Y( D5 o1 Z, M
% G6 N3 w3 H2 h% t: J
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
9 ~4 g3 F& v' D( ?$ \
每次DMA传输完成后都要再次使能传输
0 V2 D7 S4 ?4 u8 R4 y
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4