嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
2 N+ v/ j. _+ |, }/ n% l
#define PING_PONG_ACNT 1
3 _; {* m4 j: Z `) t0 p
#define PING_PONG_BCNT 8*32*40
7 C d; d6 d9 {+ j: \
//#define PING_PONG_BCNT 1
0 g4 s4 s; v7 i( T1 A d
#define PING_PONG_CCNT 1
# @/ o+ v+ ?2 S4 Z. Y
#define MCASP_BASEADDR 0x01D00000
! h7 d7 q+ q% E0 i
#define Mcasp_RXEVENTQUE (0u)
6 k" t2 Y2 W& ~& P9 j6 ]' S0 D" z
% O3 R1 s* `) e& l2 P
/* OPT Field specific defines */
. @( `7 L% ~5 E8 |* n2 r
#define OPT_SYNCDIM_SHIFT (0x00000002u)
% `# e" L+ }! D& f* T5 K3 F
#define OPT_TCC_MASK (0x0003F000u)
$ P8 D! W; S$ j+ ^! |8 o
#define OPT_TCC_SHIFT (0x0000000Cu)
5 I4 P% g ~3 g& B: ~8 L
#define OPT_ITCINTEN_SHIFT (0x00000015u)
, C8 r# R3 k2 H! k, L- N
#define OPT_TCINTEN_SHIFT (0x00000014u)
4 }# q5 h# P2 `+ B! _9 c1 x
. G+ _" X0 }. y- a4 `0 w
char ping_buffer[PING_PONG_BCNT];
6 d3 H& p0 v8 g0 A3 \0 A) @
char pong_buffer[PING_PONG_BCNT];
2 b2 s! V. G9 |" p, m4 X
( A& F3 E! F4 ~# }3 q: p, t
4 _. x4 |( `7 M9 y* \' v! g4 U0 ~
; E8 u; S: r3 V
5 v% _" O# f2 B1 B4 @1 V8 u# x
static void ys_edma3_init()
# X% x; k! }" K q) \
{
0 D" v5 b0 B9 w9 j; c8 ~
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
- |2 E, s N/ q G" n* o& T$ _
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
/ Q; Y7 w) z' n
EDMA3_DRV_Handle hEdma;
0 y. J" G% s: F) x9 N9 ]; J: u
uint32_t chId = 0;
8 Z% `# F7 I! E0 R9 d
uint32_t tcc = 0;
\' W2 _# W! E' D+ ?6 W$ `) \
" F& }- f7 n: H0 O3 x3 s
print2arm("edma3 driver init...",0);
3 }- c' |2 e. m1 @
* p4 ]- J% P$ L2 E& @/ D, |
hEdma = edma3init(0,&result);
1 I" o4 j- {: w+ l! ~3 L
if(hEdma)
* K* n2 `+ k3 ~8 ^
{
' Y+ U$ K4 p$ x$ E. }' ?! h0 ^0 w4 ?
print2arm("edma3init() Passed.",0);
6 [: ~2 g8 h+ Q, X: _
}
- x0 B' K' u8 s+ P% ?9 K' F
else
# N, G5 ~9 ?2 | z, M1 w( Z: [
{
3 m0 c% z$ x8 S) q+ A
print2arm("edma3init() Failed.",0);
$ O* x: K; c; f6 s* a
}
" D* t0 R4 l& \) R" K R- I0 ?
p, `* g/ {6 f9 }- F/ z
if (result == EDMA3_DRV_SOK)
! g9 D' L p w$ m, T
{
5 P! E2 E$ S6 _0 {& z; g0 z
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
) Q, [6 U( J: L
(EDMA3_RM_EventQueue)0,
6 h2 G6 q, b3 s
&edma3_isr, NULL);
5 V8 ?/ E* k8 c2 c& f$ P1 x9 S
}
' H$ v; D P R% p1 W+ i
4 K, |) l+ J6 k3 c9 F! V; L
if(result == EDMA3_DRV_SOK)
2 G! ]- F% R. p% z
{
: ^: b8 L. I }% D/ O- ^8 o7 y6 Z
paramSet.srcBIdx = 0;
$ K5 b6 B7 w3 h) p. |( t" M1 z
paramSet.destBIdx = 1;
$ g* h3 E4 V) q) F
paramSet.srcCIdx = 0;
9 c" D" B+ I y9 D5 R
paramSet.destCIdx = 0;
. o; l# R( T) o! ~; l& v0 _) i
paramSet.aCnt = PING_PONG_ACNT;
( E- b) r, h( ]7 Y9 {2 M
paramSet.bCnt = PING_PONG_BCNT;
( w' N& n6 }4 O1 f8 H: [% q# i- G
paramSet.cCnt = PING_PONG_CCNT;
A2 t/ H! u F* t9 ?$ F2 u8 X
s' l: F4 N# \$ {" T
/* For AB-synchronized transfers, BCNTRLD is not used. */
1 s. G$ z7 U# E7 K0 n9 L5 { J1 M+ U
paramSet.bCntReload = PING_PONG_BCNT;
+ @* H5 O" a7 p
2 L1 z& s1 c' w: l: ]0 Q9 z z
/* Src in constant mode Dest in INCR modes */
6 Y2 t7 n6 Q C& G5 W! L. Y
paramSet.opt &= 0xFFFFFFFDu;
2 }) f: h+ r: x
//paramSet.opt &= 0xFFFFFFFCu;
^- A- L& J! ?! x
: D5 ], V! }2 d: S% H
/* Program the TCC */
) r# Q) D. |% a4 P
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 ~( { E4 n! ^9 c4 x4 d# E7 J( k
8 O$ e9 M0 X0 |9 [$ }+ v a8 M8 h
/* Enable Intermediate & Final transfer completion interrupt */
1 I2 R/ y- G1 C" v
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
. N! r' a# S' _- O
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
5 l7 j( X$ P# a1 ~
3 E$ ?, {4 y5 v% \* S; F5 d' b2 U& z
/* AB Sync Transfer Mode */
* R+ r: d# \: k0 X
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
9 `- H i) g$ r. d& T: Z
5 X/ }' ^9 @# m1 X) e. e
/* Program the source and dest addresses for master DMA channel */
|' S: a6 c1 V, _$ V: K- r
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
; b$ _8 ~3 g4 }% d2 {
paramSet.destAddr = (uint32_t)(ping_buffer);
0 d1 N) K$ I5 B! Y4 y6 R& r7 k, |
0 @& L1 P# ~" i
/* Write to the master DMA channel first. */
3 S/ m1 [: P4 z# o! V. ?- i
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
; I) B6 R$ ]0 k0 n
}
8 N4 |9 r: h& H( f
6 Q' Z; S( k9 N6 j4 [0 J9 j+ G
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
; i& q6 T) R/ r3 Y; S* R
! ?$ c& x+ T) P' Q
if(result == EDMA3_DRV_SOK)
& G" Z: @2 |+ b2 r2 L6 X0 ~: I+ l
{
( Z, W/ {% n# O1 m
print2arm("edma3 driver init success.",0);
# V( v) ^! ]# s9 H9 t: c
}
" G* G0 x3 w" s, C
}
5 S5 K9 l' M* |- r
6 F9 g- h1 v5 [
1 G0 z0 u" Q2 x; d+ m( \6 {. q
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
$ J4 E* G$ p/ G" F; i
. o* b# |' S! g& L6 z8 t% r
, [5 {7 J" M! x! T: s7 U. `5 r5 _
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
3 a+ L) l w* M- P+ {) Q
每次DMA传输完成后都要再次使能传输
+ a, y8 Q3 T+ Q- D5 B9 ?/ q
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4