嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
/ Q8 r2 E8 S$ f
#define PING_PONG_ACNT 1
, }5 S! I4 S! f8 d/ {) G
#define PING_PONG_BCNT 8*32*40
* X* U% p( b/ D& x
//#define PING_PONG_BCNT 1
k( {8 w; h! a5 N6 h
#define PING_PONG_CCNT 1
: _' p5 v& N6 T* [: C; [
#define MCASP_BASEADDR 0x01D00000
5 T8 p G- k8 u8 t: C0 \% W
#define Mcasp_RXEVENTQUE (0u)
$ F# r O1 B0 e3 g0 V
( ]2 u3 G+ i5 Y" ]- Q( M
/* OPT Field specific defines */
- S& w+ w0 H7 g4 a% ~0 L* B
#define OPT_SYNCDIM_SHIFT (0x00000002u)
0 G! a. Y- U- n9 M( ?$ C6 n! F" t
#define OPT_TCC_MASK (0x0003F000u)
, h) s, m) U. }5 r/ Q. \, M
#define OPT_TCC_SHIFT (0x0000000Cu)
$ X4 q9 d! | S, f3 I' r
#define OPT_ITCINTEN_SHIFT (0x00000015u)
8 p( T1 e1 K& t& C: Q6 C7 \
#define OPT_TCINTEN_SHIFT (0x00000014u)
9 F5 C7 z0 H5 l8 z; R
9 P. ^% p% O0 ^8 _( K' d
char ping_buffer[PING_PONG_BCNT];
' a- o4 Z% ~; n: x; g3 ]8 z
char pong_buffer[PING_PONG_BCNT];
5 O" [4 e/ I$ f/ T
) B1 ]9 i7 @$ P {
5 `2 g6 n1 Y( @- u* P' x4 P
( _% a3 ^& f* U- ^/ ?5 u
9 A: n# A- j. H: J$ x/ X8 T
static void ys_edma3_init()
# @. d e- f; {3 K
{
7 {0 Z+ q* X5 x# w/ s$ i
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
4 L+ f" W$ G+ P* b
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
! `) m/ z; x& ], c8 R6 u
EDMA3_DRV_Handle hEdma;
, K# _5 R5 l3 _1 W) Z
uint32_t chId = 0;
* L* l! d: X2 E/ ?4 @: E" V
uint32_t tcc = 0;
; j1 m) P! s. m8 H' m
' z3 Z( r- o9 G- |- o( X
print2arm("edma3 driver init...",0);
- _5 R" Z% ]3 V' r4 h+ L
: V0 B# S. N5 ^& ^% d& J. x4 `% v
hEdma = edma3init(0,&result);
& K! `) O( C5 p# J7 R
if(hEdma)
) r/ d- H1 [" M! U
{
0 A! M5 `- X( w
print2arm("edma3init() Passed.",0);
' z/ ?+ p7 t3 a2 c
}
: P" b- a* a6 q, p+ f$ @
else
" p8 N, F! O# q4 V7 K
{
3 ^, Y/ e u2 y# Y& m/ k
print2arm("edma3init() Failed.",0);
0 }2 L8 v. G* b/ }; y2 s
}
?' l( Z. @- T! E4 p% Z
4 v# y' T: m5 G; ]
if (result == EDMA3_DRV_SOK)
" o: ^" r, t% A5 S
{
0 ?7 _2 b+ F j# x% l5 d' w1 W
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
+ v q( T! e% {' C; b4 m$ V& j$ {) g
(EDMA3_RM_EventQueue)0,
3 c- o# C$ z+ j- _/ M& H
&edma3_isr, NULL);
" A; e6 M, c) `3 S" \ Z% O
}
; P5 S1 P; u3 }" \
8 J8 O) k: S2 P
if(result == EDMA3_DRV_SOK)
3 {+ `! k0 o; q$ B# e- k% y
{
- ^# Q: ~8 h. X$ e- |
paramSet.srcBIdx = 0;
5 |; z: c/ \8 ]* b; c
paramSet.destBIdx = 1;
$ X) O7 u- e3 g- b7 \; x
paramSet.srcCIdx = 0;
& r* D9 t2 t+ O0 x4 c6 P* ?
paramSet.destCIdx = 0;
& r8 @8 p7 n. t/ S
paramSet.aCnt = PING_PONG_ACNT;
5 }# \& h9 J$ U( P: C) T5 x
paramSet.bCnt = PING_PONG_BCNT;
( Y. r* E. z: B) g* y* `. b
paramSet.cCnt = PING_PONG_CCNT;
5 N$ k8 B1 j' n
4 d1 c5 d" O% Z3 ]. g
/* For AB-synchronized transfers, BCNTRLD is not used. */
4 A* S3 u$ X* W4 I- U) S
paramSet.bCntReload = PING_PONG_BCNT;
. b7 K; j6 D0 \, }; l
2 X* i9 w" u- q& K
/* Src in constant mode Dest in INCR modes */
- b$ }" G) d; U* i8 P) K
paramSet.opt &= 0xFFFFFFFDu;
9 B$ H. n0 p+ J" I5 F( l; |
//paramSet.opt &= 0xFFFFFFFCu;
9 G; s- ?6 ~. u( A9 N! Q1 P7 [, j8 z6 u
* w; q) q8 W) N. w0 U6 ~
/* Program the TCC */
4 W9 E0 n9 K/ l8 q# V; H
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
% {! S0 r, s- y
% o- V/ L5 Q4 \, L& m
/* Enable Intermediate & Final transfer completion interrupt */
- P; o: f0 A& ?# q' {8 f3 F) L
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
* Q! c. h" v- `' v
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
/ L( z4 S# T4 h# ^3 j; Z r
' n( u( C) P( D9 { B) P
/* AB Sync Transfer Mode */
, a8 C X) E9 v- C" s- J$ V% n
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
! X# P' R$ d& \" {1 \! } P6 E3 ]
; L$ W& J) l+ y. I* {
/* Program the source and dest addresses for master DMA channel */
; o( p/ d+ Y8 C+ f5 {9 T7 y
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
; C; K) [& Q6 F
paramSet.destAddr = (uint32_t)(ping_buffer);
; T0 [$ ?# r: \8 B4 b7 d" x0 J
K! Y' s7 ^8 t, `8 Y0 D3 U
/* Write to the master DMA channel first. */
2 A3 T" p- I) @& a0 i- b
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
5 K7 K# o4 ~# l6 }& S' q
}
' _1 I* l6 |' C3 C! }- Z
+ t0 W' |8 m+ F' Z( p
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
0 Y2 `3 }) F9 P5 r8 @" ?6 e
4 s+ L$ P# m+ L$ e! N% q6 w
if(result == EDMA3_DRV_SOK)
! i& ~( a) [, i; U
{
4 i8 }: p5 ?( w: }6 B
print2arm("edma3 driver init success.",0);
( _; c% h5 [: P( `% B+ O
}
: B8 O9 Q5 C- h$ f- G
}
B9 j [. W. W6 b
# K, u! h0 d1 d6 O- @! a
/ ^- t6 ?" O) S4 h9 h0 l) j/ Y
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
7 {* K% E; f7 Y1 D
3 |/ T4 L+ n9 _& W
4 f. W6 I: i% N, r0 F
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
0 W4 I# y7 o8 ^, C5 u. [
每次DMA传输完成后都要再次使能传输
0 ]; _$ F9 t0 r3 x. `1 ]
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4