嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
1 |$ u1 {8 A2 r# T: K
#define PING_PONG_ACNT 1
5 ?: k i: ?, j
#define PING_PONG_BCNT 8*32*40
+ Q7 V) [0 n' Y$ B' {! V
//#define PING_PONG_BCNT 1
6 \' n) \$ E* O1 Q* q8 ^" a
#define PING_PONG_CCNT 1
D( A- f5 @0 k. L7 @
#define MCASP_BASEADDR 0x01D00000
; e: t! c! c, E2 R& J. N
#define Mcasp_RXEVENTQUE (0u)
: R: W) M: G1 |. d- f, g/ m6 D
( @" @) J. R( F3 A- X
/* OPT Field specific defines */
* T: X( j$ b% D0 `
#define OPT_SYNCDIM_SHIFT (0x00000002u)
5 \0 x- p+ q$ r6 a
#define OPT_TCC_MASK (0x0003F000u)
: {6 y: F( V* b
#define OPT_TCC_SHIFT (0x0000000Cu)
1 g0 c7 N0 F' Q! H0 P' g3 k
#define OPT_ITCINTEN_SHIFT (0x00000015u)
8 ~+ k* A5 W# J% G( d3 S0 ^
#define OPT_TCINTEN_SHIFT (0x00000014u)
w8 ^' l2 [ w. z/ k5 W
0 ~0 d" ^8 C# q7 o
char ping_buffer[PING_PONG_BCNT];
- b! R4 L9 L; H( T9 ]5 ^" }
char pong_buffer[PING_PONG_BCNT];
7 V- ^( {4 N7 i- K* M# B
! I3 n" v2 W0 w; j3 v
& @8 n e( l' |- V1 I0 p1 m5 G
3 q; @$ [2 a. B! Z
5 S$ ^ t" M7 G5 N/ o
static void ys_edma3_init()
7 Z" S" o. ~; d& M' ^: ]! ]( O
{
& E4 Q. t0 x' ^7 n
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
: `' t2 b) Y" P% }5 \/ w; V
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
' D/ W/ M6 b9 S! B: K8 U+ O: r. M
EDMA3_DRV_Handle hEdma;
# X; u/ L# {* C0 {7 H0 H$ H! F
uint32_t chId = 0;
' I$ K+ e J; ^0 {
uint32_t tcc = 0;
4 C" d8 ~& o; B$ Z- Y, B( t+ }2 x
% _. V. e( D1 F. m. ]$ p' ]
print2arm("edma3 driver init...",0);
' D6 w: X1 @9 Z/ {- o" Q
- N2 b# u# Z& n
hEdma = edma3init(0,&result);
% ?2 q6 q# H) t: ?# l# k" ^- y1 }
if(hEdma)
* ^. T; ~$ Y7 D7 w; ]& A
{
. e4 m1 n: s) k* P2 |1 j1 {
print2arm("edma3init() Passed.",0);
/ e4 _0 y3 m9 a! w* Y9 `6 e
}
( N+ Y! V3 B- S5 e! v, N
else
, {) v# z, Q5 B
{
5 W6 b- ~* b! J' n$ ~& L( f) E! M
print2arm("edma3init() Failed.",0);
# H3 C$ L; j' l) g) ^7 M6 z2 g n
}
. o1 e x4 O9 }7 b" \3 R! x
$ ^3 @8 Z9 x; Z- R- }- ?
if (result == EDMA3_DRV_SOK)
8 D/ d3 g" B& H3 s' ~
{
, s$ X+ |/ I5 C. B6 [8 m- N
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
3 Z% E j" ]- d: ?( P6 Q
(EDMA3_RM_EventQueue)0,
. j9 I! J" g+ Z( x; U' x
&edma3_isr, NULL);
! |4 U* f. s7 k0 i: ^
}
+ V; J' G5 e; e
8 x' Y) x- {' f8 i# F, a
if(result == EDMA3_DRV_SOK)
1 d( c) T' x2 z) \/ C
{
7 [5 n2 Q7 H5 o3 ]3 r8 F @
paramSet.srcBIdx = 0;
5 H& w- ~2 s# [0 Y+ n1 U
paramSet.destBIdx = 1;
' O- t% d: @$ y- |
paramSet.srcCIdx = 0;
* }! g9 {: f( e3 A D$ e
paramSet.destCIdx = 0;
1 s9 l" j% J6 L9 O6 i
paramSet.aCnt = PING_PONG_ACNT;
; z- o |, A" i
paramSet.bCnt = PING_PONG_BCNT;
$ a6 Z$ o! |: B
paramSet.cCnt = PING_PONG_CCNT;
; F5 g6 E# E; g0 b( A
# m3 z0 c* k' K
/* For AB-synchronized transfers, BCNTRLD is not used. */
5 C% e: v- ?- M" k4 Q. d8 }9 w
paramSet.bCntReload = PING_PONG_BCNT;
2 u6 }9 D H6 M3 O
c& U! ~! C; j7 E: e) k, u
/* Src in constant mode Dest in INCR modes */
/ D5 Y1 e; u5 ~2 d6 F- V5 R
paramSet.opt &= 0xFFFFFFFDu;
5 ]& _! e# t/ e
//paramSet.opt &= 0xFFFFFFFCu;
7 H. w( q( N$ _9 S
8 C+ q% a4 A: Q- j
/* Program the TCC */
0 t' q" |' u- t
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
% e# c$ N0 |5 ^! f# ^
) h: d, d9 m' ?" v2 Z C! i- P( R
/* Enable Intermediate & Final transfer completion interrupt */
- V$ ^5 y) W$ _5 @
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
8 f N* j: x2 g
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
4 }1 p2 _0 W% r; X1 I! V7 c3 [
/ Q* d% m8 C' B- f* D, _9 x
/* AB Sync Transfer Mode */
7 F3 V/ a- K7 J9 I
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
$ ~4 _$ g2 h; m/ g
. k( s: ^& r# | o+ U( I) b' u
/* Program the source and dest addresses for master DMA channel */
5 C; a: k7 W3 J6 `! `
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
( P2 G2 e$ p0 V0 u
paramSet.destAddr = (uint32_t)(ping_buffer);
! V( C4 {) p5 @6 m1 c
0 i: f$ }9 L, `9 d* x6 R
/* Write to the master DMA channel first. */
. n. @ W* M; b+ o8 T
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
. h5 e; n6 [3 p) C4 i- u; Z. z
}
- L0 r# A, T* T% k0 B
' G- ^- l) k( D( j3 j r
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
8 H6 o) d8 D& A# Q
$ _/ @- q3 \$ G0 k6 H+ P3 N
if(result == EDMA3_DRV_SOK)
4 o1 B: a! B4 I7 n0 q- u3 X
{
, @) R( K- v8 [5 M) r$ N+ T, \
print2arm("edma3 driver init success.",0);
0 h) ~, N1 L+ U2 d Y) D4 K N5 c
}
# U/ C! a+ s$ l) [" k, r8 b
}
- F+ P0 M/ E0 E: C! P( u
' J# ?* Q5 H) S. i" \
3 E9 p0 n, F$ I8 Z, y# v
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
, N6 ]; I& t0 ~0 H# M8 Q" Z4 x
' V# |: ^% ?9 F" A- `/ C; X, |/ D
' A( N; \, o+ e8 s$ J. Q* ]! @
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
' c4 F( q) T& K
每次DMA传输完成后都要再次使能传输
# U ^5 k0 W/ O- I
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4