嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
: @1 `0 F2 ]3 y; v t
#define PING_PONG_ACNT 1
5 l) l+ z: q7 W j2 q k
#define PING_PONG_BCNT 8*32*40
/ m4 s- \9 ?& s. s, Q
//#define PING_PONG_BCNT 1
% B0 I% P3 S& s
#define PING_PONG_CCNT 1
- O) G" e* W, n2 e# R% }5 V
#define MCASP_BASEADDR 0x01D00000
A$ E. }! [' g) J3 {
#define Mcasp_RXEVENTQUE (0u)
; c: ?0 D: v7 A7 N( Z
* F$ \3 I. C4 m, a1 K$ n1 J
/* OPT Field specific defines */
$ s F5 K' m @* _; b2 t- l; Z
#define OPT_SYNCDIM_SHIFT (0x00000002u)
) `% v* i5 C3 a/ I5 K) d
#define OPT_TCC_MASK (0x0003F000u)
* j) j! q" x$ y8 P6 ?
#define OPT_TCC_SHIFT (0x0000000Cu)
% L% V7 ]3 T- |: k5 b: o% n
#define OPT_ITCINTEN_SHIFT (0x00000015u)
: @' s9 c0 q3 A; t
#define OPT_TCINTEN_SHIFT (0x00000014u)
8 r6 B: f/ K: s2 V: X$ U/ }
) @) E/ D5 J% W) y
char ping_buffer[PING_PONG_BCNT];
4 w4 `+ J" J J/ J
char pong_buffer[PING_PONG_BCNT];
; K+ S9 Q3 _* `7 x" v5 B
. }9 Z" e$ v0 Z V% P) y* k7 j
$ U. u# g3 c- Y; _4 ?$ B( ~
6 f3 X6 J, H- i1 a$ I- z) u3 y
, t, `1 g! ?( i7 j/ ~) Y! u+ N1 B
static void ys_edma3_init()
0 {* G, _& F5 T1 A. {
{
/ t* g- {. D& u7 X
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
# ?% z% |& d" Q5 @' _6 s- X
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
4 f$ G4 N* Z1 W) ]: z% O
EDMA3_DRV_Handle hEdma;
' n2 t# k2 u2 U+ C
uint32_t chId = 0;
6 |: b& C( e: e' T" e6 i0 }
uint32_t tcc = 0;
8 l7 H" B- R, L0 H+ L5 [
/ o* W& q, p" P- m! ~9 C3 m
print2arm("edma3 driver init...",0);
% I' U- e9 k, m
+ L/ Z# a3 t6 h7 d1 p8 F
hEdma = edma3init(0,&result);
# ^! q3 s: {$ N4 f R! i1 ^& T
if(hEdma)
1 d- T# Q4 P* f [3 W+ q
{
9 K f9 P T' \& X) J
print2arm("edma3init() Passed.",0);
6 E2 l6 Y6 h* L8 x
}
5 \: |2 O9 Q( r4 I, Q! _ F% b
else
! V$ {! C! g, u/ b" O8 `1 i) Q1 l
{
0 x2 w( T# F- L2 D) a
print2arm("edma3init() Failed.",0);
" l; Z+ D6 K# h1 M3 r+ n
}
$ W) r! n% q; Z5 T2 o. y
+ l4 R" k2 m) [' q( x! _
if (result == EDMA3_DRV_SOK)
, I7 B0 ~9 ^' U3 [7 W: I" c" n' Y0 D
{
) \. [, P* l5 B( F( S
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
9 Y8 F# p/ M0 N
(EDMA3_RM_EventQueue)0,
- w& L9 n3 O7 }* o. J' W
&edma3_isr, NULL);
- ^/ p% G9 l" f, z( o) d7 g
}
( @1 K! B& \) H5 U3 a* K
7 Z& G& { r8 d3 |) |8 |0 [; V
if(result == EDMA3_DRV_SOK)
" u' I S7 [" ^, W1 C
{
: D! I# t( E- ?
paramSet.srcBIdx = 0;
/ y* O; G: m: a! f4 Y2 U- Q
paramSet.destBIdx = 1;
0 Z: P* ~, E0 t& m4 V! u
paramSet.srcCIdx = 0;
6 Q: @0 y& s% V- u$ ?* v
paramSet.destCIdx = 0;
2 ], d. L+ d4 x$ M
paramSet.aCnt = PING_PONG_ACNT;
( ^# [+ ?; Z2 P% N$ m4 A$ D c
paramSet.bCnt = PING_PONG_BCNT;
5 F1 `# F O) e: z: H O! O( J
paramSet.cCnt = PING_PONG_CCNT;
' [4 H' `2 k6 k" R) d; D
( c% l- O# l( J1 \
/* For AB-synchronized transfers, BCNTRLD is not used. */
- F! N. d! Y' }8 y
paramSet.bCntReload = PING_PONG_BCNT;
) @( F5 j: j$ R
1 H- k( z; {' S& o9 C* j! ^
/* Src in constant mode Dest in INCR modes */
4 ^# T+ m4 u- t- n) j) @
paramSet.opt &= 0xFFFFFFFDu;
3 e/ I# G' G% ]# Y- y J
//paramSet.opt &= 0xFFFFFFFCu;
* m1 W. |$ i" P# ^! {
* }0 `. d% D, z9 w: K
/* Program the TCC */
" \0 F& d3 U N$ \' ]
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
; b, L' L! X* {( p% Q6 B* V
- G# V8 ]: L2 V1 V' M
/* Enable Intermediate & Final transfer completion interrupt */
% Y) F% A" C; P t5 l( r, h6 Z
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
4 ]# H. q n& W. \8 I0 I7 l
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
7 M& @0 v3 k& \% w+ l* B k2 ]- g2 C8 v
( ~! g1 [! Q& P9 B: r) n
/* AB Sync Transfer Mode */
P% X+ V: W" R
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
' B8 C4 Z8 {4 c7 Q! t9 M N! V
6 @* ~! w+ P' i1 m
/* Program the source and dest addresses for master DMA channel */
5 B! R% u) P2 K; }
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
( z: b. z8 o3 l7 h# C7 U V, A
paramSet.destAddr = (uint32_t)(ping_buffer);
. Y2 ?, V0 T+ Z
W. P9 E; ]4 B' G6 M' G3 k
/* Write to the master DMA channel first. */
% y7 @) p3 q f8 I
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
+ P5 e" w% Z' A5 ^
}
% }# _4 N0 K/ T
o2 c0 ~% Z! k# m8 V- F
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
$ w k/ Z: J+ Q5 b
* O" P" w- S( v
if(result == EDMA3_DRV_SOK)
; f% k1 O3 _7 P4 d
{
# J- h( D9 K; r, {+ x' V/ v$ J- q. `
print2arm("edma3 driver init success.",0);
# J6 [ e! c/ l4 h1 n
}
/ W* R0 g' V" w, I- X. P9 N3 g, ^
}
: M/ x, G" T; w, W( B0 ^! T
+ Y+ \& a) `4 I8 f
$ T. T- _) i- t5 ~7 l
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
( M% u" e. i- y! w5 L$ X8 b
! X" z- k5 m8 q2 |
# F/ Z) O) A" c. j0 D2 g; N" _
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
* }2 d2 i! M9 x3 p, Q0 t( A
每次DMA传输完成后都要再次使能传输
3 m2 u8 o3 m8 A' f& z0 J; {5 `2 t8 ~
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4