嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
1 M/ ^: ?& m% Z9 V% n
#define PING_PONG_ACNT 1
, L1 p) \ T ~, L L
#define PING_PONG_BCNT 8*32*40
5 W1 `8 J2 q& W; X) \8 b
//#define PING_PONG_BCNT 1
4 ?$ E1 r% n* l8 E
#define PING_PONG_CCNT 1
4 [: J; J8 a9 f/ \; R9 S
#define MCASP_BASEADDR 0x01D00000
+ p: T4 Y( G' W8 M3 |1 `6 J$ v
#define Mcasp_RXEVENTQUE (0u)
; N" \) U3 x0 \
5 u8 A2 [; ~' d2 `+ p% Q
/* OPT Field specific defines */
& M- d4 D2 W9 s; s V
#define OPT_SYNCDIM_SHIFT (0x00000002u)
5 I" u$ S( T% u2 ^2 D
#define OPT_TCC_MASK (0x0003F000u)
* ~" N& ]& Q9 O7 g% g$ g
#define OPT_TCC_SHIFT (0x0000000Cu)
- A u5 A7 f2 }+ W& d0 y
#define OPT_ITCINTEN_SHIFT (0x00000015u)
: a, U4 t; C$ U6 s+ R
#define OPT_TCINTEN_SHIFT (0x00000014u)
$ R) B/ ^9 J; m" `" O, S6 i
: I! N u1 B$ I: S; X
char ping_buffer[PING_PONG_BCNT];
- d0 K. Q `: p# J
char pong_buffer[PING_PONG_BCNT];
" o/ b* d- D% q0 n; R
3 f+ P7 [% W6 \) [- @
6 s! Z# v( B1 N f; X3 M
8 c" X+ J9 U" H) V! k6 v) ]) s
( a- U- J* S. R F6 l9 U8 u
static void ys_edma3_init()
: F* D: _/ ]8 J" y0 c
{
: |& Q% m1 s9 \: I5 l2 Q
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
/ ?5 |9 r& L, Z+ ]- [
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
( K' }" c, J3 W. M" `& r
EDMA3_DRV_Handle hEdma;
8 Q/ b/ i5 l& t+ N. x3 A
uint32_t chId = 0;
9 }/ Z# j3 s! o0 d8 r; L
uint32_t tcc = 0;
( C$ B4 d4 e2 X g# L3 `
9 `. Z4 W8 O' k9 f
print2arm("edma3 driver init...",0);
. T y! U4 z: S
1 T% j2 b- A- p/ [) K. b+ z
hEdma = edma3init(0,&result);
* \6 P' ~1 c" q9 \$ C. ^
if(hEdma)
: a1 K: Z/ [- e4 I: I% H7 Q) f9 l9 @
{
2 k* g, U) ^3 F$ H9 p0 ~# R
print2arm("edma3init() Passed.",0);
5 k! i3 q+ [/ c" ^% P" Y
}
) G8 w. i" Q$ I6 K
else
) [, s/ f7 l9 _7 R1 D
{
( t( e" v8 j; }0 W8 Y
print2arm("edma3init() Failed.",0);
3 {. ?( H% I8 U: B) `. _% r4 t
}
% l+ G$ g M% u5 p) ?5 s% E# I. A
( p% }" x0 g' q5 p
if (result == EDMA3_DRV_SOK)
+ a- `& Z4 T0 E5 T6 [
{
: n$ I7 l5 L6 X# M5 Y
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
& S3 z- i6 S; y5 W' X8 N" i
(EDMA3_RM_EventQueue)0,
: Z p' C0 C# ^
&edma3_isr, NULL);
! E- ?; @' k" ~1 Q5 Z" w
}
7 @( e% M4 t( R# s6 H5 T0 M8 V
& j/ p2 c2 i4 C# z% A
if(result == EDMA3_DRV_SOK)
_. T& W8 J4 W+ ?6 Q: _6 k6 ]' V1 m
{
3 L4 J9 ]' {9 K& T- e, j
paramSet.srcBIdx = 0;
% q' j1 Y0 Y% p% s
paramSet.destBIdx = 1;
& s; ^& g: F6 |; H! Y( M# `% V8 w
paramSet.srcCIdx = 0;
. Y; ^/ i3 m* w! h
paramSet.destCIdx = 0;
. ]. |5 W' T* _, I& ] c3 \# d
paramSet.aCnt = PING_PONG_ACNT;
. B1 C% J& k7 F8 L, m0 z
paramSet.bCnt = PING_PONG_BCNT;
# d6 e$ E$ r- L- O
paramSet.cCnt = PING_PONG_CCNT;
5 D4 E7 X, y: r* [) K' i
B# D7 x3 V) s0 z# S
/* For AB-synchronized transfers, BCNTRLD is not used. */
2 i- M$ ^* ]# N# a" D
paramSet.bCntReload = PING_PONG_BCNT;
) ]/ H8 i [: n& a/ o4 ~; E
: p9 G& m+ U) e
/* Src in constant mode Dest in INCR modes */
" Y, Q4 f: `3 h& G- V; ?
paramSet.opt &= 0xFFFFFFFDu;
" D s3 T" f3 n3 _; j, }2 M$ g, ~
//paramSet.opt &= 0xFFFFFFFCu;
) m/ H% h" }2 |% q" s& A' x
: y' ~( @" l' e% Z1 a
/* Program the TCC */
0 D3 c$ k4 K% o9 n9 L
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
/ d3 W+ c U, D) I7 F
( m! K6 H5 X Z* D. N
/* Enable Intermediate & Final transfer completion interrupt */
" e/ z& F! Y/ ? [* W
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
8 }% I3 t& o4 Y
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
+ Y5 R; K# t- o8 }: P, c
' x5 U/ f3 {' i' ]
/* AB Sync Transfer Mode */
* S, ? {% C$ U2 x/ a
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
T$ x4 C7 G# l1 ?' |6 @) {- M
; U; z, `/ Y/ L X- c4 a" a
/* Program the source and dest addresses for master DMA channel */
/ W4 d0 e% D7 A- w' R" _
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
, l3 t) T. H0 X: C0 Q. [$ Q" F+ X
paramSet.destAddr = (uint32_t)(ping_buffer);
- S/ L3 ~* ~' ?, W9 c k5 [
( K. h$ {# [; {. Q9 n' w
/* Write to the master DMA channel first. */
) U. C o. T, T- M9 o+ j% ]
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
2 S) G2 h9 |' j+ B6 L5 g/ K
}
9 a7 m" g; k7 R- c6 c' y
) n: q( g- P) l& V$ D
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
5 A: A3 V, O9 j, x$ {5 Z M
/ T) e' L6 i* v: ^( x! b/ Y
if(result == EDMA3_DRV_SOK)
$ E5 [7 a, W6 e9 A
{
2 L- |4 A( D0 r4 ~2 r
print2arm("edma3 driver init success.",0);
' ^) l* B- F( h" T6 n# T4 Z
}
) ?8 G% a$ R5 J! D0 C# H0 z) G) K
}
4 h# h, z7 ?5 S s
* f1 q1 V: R/ X! e0 P2 C
2 `$ x% T- @; ?8 E1 `3 h& a: Q
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
0 b- }. ~+ X( v- h+ @: P3 N4 K
2 x1 ?8 x9 B1 m' l- s& x
" \( [- e) Y6 a4 }, P M
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
7 W z) ]$ ]' z, k- d$ N# H
每次DMA传输完成后都要再次使能传输
# ^5 h. n& t6 k- I' S
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4