嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
2 b9 W) h( K' a& @& m
#define PING_PONG_ACNT 1
$ J& W: w5 Q7 S4 C
#define PING_PONG_BCNT 8*32*40
+ |5 ]9 O3 X7 m$ K7 s
//#define PING_PONG_BCNT 1
; i) U# C+ ?& N5 I
#define PING_PONG_CCNT 1
. o! @' F l8 a6 \
#define MCASP_BASEADDR 0x01D00000
9 B6 g z- }: b% V# G. j
#define Mcasp_RXEVENTQUE (0u)
5 y! ]* ?1 I5 z! v- _8 K
: |4 n. b+ t" z4 m# S' x- F4 u
/* OPT Field specific defines */
+ u* U0 f) ?: a" d
#define OPT_SYNCDIM_SHIFT (0x00000002u)
" ~5 r% |. R. E
#define OPT_TCC_MASK (0x0003F000u)
! U$ M8 G; A: `7 r1 G7 O, G
#define OPT_TCC_SHIFT (0x0000000Cu)
2 z |2 V8 \0 Q% S# [
#define OPT_ITCINTEN_SHIFT (0x00000015u)
6 [/ w# Y, E0 V6 a
#define OPT_TCINTEN_SHIFT (0x00000014u)
8 @! G! X, [7 z V
) R# S. n3 u. \
char ping_buffer[PING_PONG_BCNT];
" b/ W* @# n3 ^* Y
char pong_buffer[PING_PONG_BCNT];
; ]5 o; J; \5 {' L
: p: ^& J! z" f0 I! E6 b! z+ ?
0 X9 k( P0 [- C$ ] n
% W& T5 H9 _* G' h" a1 v# |
$ Y5 u4 u1 }% k
static void ys_edma3_init()
; t- Q' E* n" k/ V5 R& l% X
{
& \# g. g* A8 W4 K
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
, g" w, N0 z+ X& d. a, G, c* K
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
]2 [- U* c' \. \9 N# L& y
EDMA3_DRV_Handle hEdma;
8 b; j* X' k% ^ l0 f) N1 T
uint32_t chId = 0;
4 s) Q# H m5 H
uint32_t tcc = 0;
5 k7 [( j# L( p! \; K5 W1 d) j: A
! i8 D \- ?. U) T% J" _- _0 ?
print2arm("edma3 driver init...",0);
+ H6 j3 x3 T( t& z0 F X- X. M
0 y4 [1 h8 } S) N4 A' I. x
hEdma = edma3init(0,&result);
( L$ K6 O1 ]5 l7 o
if(hEdma)
0 ~+ F1 Q! E9 Q( B7 m/ F, x2 |
{
8 }' I3 {" Q2 {5 G) K# f. n6 L/ |
print2arm("edma3init() Passed.",0);
( D; J6 B. Q# e1 U, l p1 E
}
% ~" Y& b0 d' S: ~: `* x
else
* ~+ l% ]% }2 u' f3 l7 ^/ J
{
/ J7 ~$ P% \2 ~
print2arm("edma3init() Failed.",0);
7 F$ T) O m* ]; n% G. [8 J
}
- Z* F; V% ^' \$ s6 z8 n7 n
. h t2 |5 n) q- ^5 u
if (result == EDMA3_DRV_SOK)
7 f& u" D0 O0 }2 H5 L6 w
{
/ ~0 f, y) f$ L
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
% n2 f* X' v1 l, }9 p' Z
(EDMA3_RM_EventQueue)0,
& ? z" R; l( C: ~. `& G
&edma3_isr, NULL);
7 U7 ?* {7 x+ s) V4 F
}
6 X& q e- ^$ Z3 ^8 Q
# z x- M. F/ j$ P. [ y
if(result == EDMA3_DRV_SOK)
3 F. e2 R m1 i- Z; e
{
. h- Q1 V) } e) C
paramSet.srcBIdx = 0;
1 N# T P: r$ [+ f! W
paramSet.destBIdx = 1;
+ h1 U( l5 _, o, G6 O5 F$ d
paramSet.srcCIdx = 0;
1 x# w# ^4 x* [& v
paramSet.destCIdx = 0;
2 @4 U8 f9 z/ i2 U
paramSet.aCnt = PING_PONG_ACNT;
; z+ ~$ H( S5 i6 e( u
paramSet.bCnt = PING_PONG_BCNT;
; ]" I8 z" e9 B0 T
paramSet.cCnt = PING_PONG_CCNT;
8 i8 T0 \% P+ O8 s6 k! ?6 X1 c
4 R* V0 u8 m8 p5 B0 Y4 x
/* For AB-synchronized transfers, BCNTRLD is not used. */
0 ^* w* o P. K
paramSet.bCntReload = PING_PONG_BCNT;
- v( v3 o7 C( Q
( ~: s8 X4 J4 Y9 j- ?7 X+ ~0 c
/* Src in constant mode Dest in INCR modes */
' x3 f7 u4 k$ E' e2 }
paramSet.opt &= 0xFFFFFFFDu;
4 d9 N* F# t7 n9 t4 ~
//paramSet.opt &= 0xFFFFFFFCu;
6 l" M- g' [' w7 R0 X) H" e
" ~. E3 F4 r" M- u* |% ]. ]
/* Program the TCC */
: N# M' g1 \% s) j. g3 k
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
# ~8 h/ D8 w& o" N2 l
0 ^% a+ |. H) g2 E1 c7 k5 J6 {
/* Enable Intermediate & Final transfer completion interrupt */
* }) l- h8 E( w5 _
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
9 w; q; s! k7 a8 d' z: K( `
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
; D. b+ ]; S/ U: C o: x" P
$ V' ]; M, Q F. r0 n
/* AB Sync Transfer Mode */
@6 p. Q2 Y! F
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
, ^$ d6 J" `. S# u3 l
5 n! j' I- B8 ^, V
/* Program the source and dest addresses for master DMA channel */
5 K& s% j3 w( ^. G2 X/ Z
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
E8 {) \: R, N. ?' w
paramSet.destAddr = (uint32_t)(ping_buffer);
. V8 J+ M! ~; T, Z7 p
$ N8 s- b" y: b2 ^3 w2 B- \5 ~
/* Write to the master DMA channel first. */
& |) W, q& i+ k2 V! j& m
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
8 Q. w: o! B; V9 Y3 O
}
4 d6 F4 H' b; g3 |
: D; B. {9 c. i4 ]
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
: v* g! v$ N) o" i. P. B+ X4 ^% i
, {" [( ]$ e) k" U9 ]9 Z; N, p
if(result == EDMA3_DRV_SOK)
9 g7 ~$ V2 ^8 j
{
9 M- R; T& I: `' R% V5 V
print2arm("edma3 driver init success.",0);
" y1 m0 V7 U. Y: ~, |- h
}
& ]! L3 y6 {# _( [/ ~2 b( s
}
H: @; @" Z, T. _" P2 D
7 N3 R0 v( ^, p* _5 M' V5 G
. R! f# M: A# r9 B. p* H
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
" l- S# g" F0 U4 y! s, A) p" F
+ T# f7 r5 r/ o; W# o( Y
! J6 L/ @* S) l) `7 p
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
6 I, p5 N+ \1 @! z+ `* F' b$ F, u
每次DMA传输完成后都要再次使能传输
7 \8 e% A2 a: m; n; z7 `* f, G
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4