嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
& `5 {* a+ ~' O! Z: y" w& d* j
#define PING_PONG_ACNT 1
' h. }4 t. [3 d0 M) N
#define PING_PONG_BCNT 8*32*40
/ l6 E& [! B* ]
//#define PING_PONG_BCNT 1
3 I) N3 `* j% q7 V ?2 H
#define PING_PONG_CCNT 1
) Q' D- ?9 F' F4 \! \' ~0 j4 }
#define MCASP_BASEADDR 0x01D00000
$ m+ G# ?4 x8 j- Y& T
#define Mcasp_RXEVENTQUE (0u)
7 q% S* d A- z7 h6 g0 f' w W
; w& `3 T# L# r
/* OPT Field specific defines */
. S7 U* y' i6 {3 |) G
#define OPT_SYNCDIM_SHIFT (0x00000002u)
2 L9 c6 o+ e8 e( ]8 p( u
#define OPT_TCC_MASK (0x0003F000u)
; b! Z. R, E1 f S
#define OPT_TCC_SHIFT (0x0000000Cu)
1 H3 O, r: T2 |; w6 z
#define OPT_ITCINTEN_SHIFT (0x00000015u)
1 x& M$ J& n" z2 t+ Y
#define OPT_TCINTEN_SHIFT (0x00000014u)
& j- \& K4 | o
+ w. ]% y1 ]2 w: z O
char ping_buffer[PING_PONG_BCNT];
- a6 ^* T) y% N( y, ~6 G; l
char pong_buffer[PING_PONG_BCNT];
, N$ j. m6 k/ w- H; q% a, t1 u E
! e( e) `+ N7 M* c0 y
; L" \5 c, n& o' [
3 B. b/ f( [3 H1 e
+ @+ `/ k& S9 |5 B' S# x
static void ys_edma3_init()
+ t0 B$ S n! P1 |0 ]! \$ P7 Z
{
0 {/ @3 H! C- _0 v9 J$ L
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
4 @" F0 z: J3 R: T# D( m Y2 K
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
: _! x* F- J9 U5 D/ @0 k
EDMA3_DRV_Handle hEdma;
. G3 d4 }- n1 Z
uint32_t chId = 0;
/ l4 _0 b( Y! E* m+ M8 W, |
uint32_t tcc = 0;
9 X# l' G" e4 x5 G+ ^. ~4 I
- M5 m& d5 t3 S8 G8 F
print2arm("edma3 driver init...",0);
. T, F: r1 w- X! z- ]& b4 t* V9 P3 I
; `2 T3 m, R& e. j% m' _ P
hEdma = edma3init(0,&result);
# I( S: z9 N" T* \: n$ i
if(hEdma)
! n3 h4 w9 x' w3 r" I7 u3 `: z
{
8 P( |1 O7 n* n- ~
print2arm("edma3init() Passed.",0);
% D5 {. X: K. W7 D, W; {3 e9 }
}
j8 Q) a* d$ ?5 k1 m2 _
else
; A; q/ G6 Q2 [/ j" _, P
{
3 B5 F9 z8 ?: G9 J
print2arm("edma3init() Failed.",0);
8 A7 ?8 r) H8 Z& b& T, s! [8 Q9 h
}
4 i, I: h9 G" Y& u& ^
6 x$ K6 i3 `: F$ L' z
if (result == EDMA3_DRV_SOK)
" S4 G9 R" u( D$ ?4 \
{
% x) v& p- B% K3 T
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
& R" j! {! H( K( F2 R
(EDMA3_RM_EventQueue)0,
) y6 c4 s5 x3 ?7 G2 Z
&edma3_isr, NULL);
# `+ _3 t# V- G" A* l
}
" Y* J1 Y; Q! g6 O, `0 v) ]
: R* W) y3 H- ], g5 F# F+ s
if(result == EDMA3_DRV_SOK)
- m# K6 a; ?8 ^0 e# N
{
+ F6 M6 T6 W! d: O. T# Y% P
paramSet.srcBIdx = 0;
; A4 E, ^# P0 B; G6 t/ N- l
paramSet.destBIdx = 1;
. D2 K( r# @6 [4 @# M/ f
paramSet.srcCIdx = 0;
- g1 @: `7 k* y9 z
paramSet.destCIdx = 0;
1 l: G4 ~ l7 Q3 B+ F ^4 N
paramSet.aCnt = PING_PONG_ACNT;
4 u& S! Q2 x$ M& c0 O+ U; |, s
paramSet.bCnt = PING_PONG_BCNT;
1 X7 q* I' A1 N; _7 x/ [1 _3 s
paramSet.cCnt = PING_PONG_CCNT;
6 h2 a3 j( K' C3 i/ E9 _
/ R2 r {! [; c, y
/* For AB-synchronized transfers, BCNTRLD is not used. */
4 N. N+ n& O6 N5 W5 }# C
paramSet.bCntReload = PING_PONG_BCNT;
! k4 l( ~1 C6 I: r9 Q
" [# V! b' y; L' d1 r- u
/* Src in constant mode Dest in INCR modes */
+ G! a9 W' ^4 Q' u8 u
paramSet.opt &= 0xFFFFFFFDu;
8 s; k+ T8 @& J; I" d
//paramSet.opt &= 0xFFFFFFFCu;
* b' t7 \/ j& M, e( v1 a+ k
: `- z# v: R8 G# l5 H( W$ m$ Q
/* Program the TCC */
+ ?8 ^% p% c0 j! m3 b
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
4 p" e ?) G5 A+ Z
+ l% W$ l( h, i0 D0 J! o; i/ B
/* Enable Intermediate & Final transfer completion interrupt */
3 E6 ?- Q0 C7 U: Y! R) f0 c8 n
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
" }, {$ m1 |. z/ G. e2 Z
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
$ E. W5 M9 k8 I$ E9 ~6 }
; n! H1 R! X; h9 r
/* AB Sync Transfer Mode */
4 L( k4 j3 A0 U# C' r- b1 u6 W
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
5 P0 U1 @& Z! J( d: w8 K4 x
& @8 m1 m! P9 x
/* Program the source and dest addresses for master DMA channel */
+ X0 M9 B* j, @8 f( a4 U
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
, t. h7 D9 J S: ~; K8 J
paramSet.destAddr = (uint32_t)(ping_buffer);
- |; } v3 h' O! {
n1 n o# ^% ^8 w
/* Write to the master DMA channel first. */
- [8 C, F2 A* @0 q- T3 K
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
) T) M0 k9 [# D5 H7 K
}
4 E6 [) b5 h3 q9 n4 m
V" q; m( C; x& T
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
2 I+ f2 F! v8 G: \! q
! G v1 j+ o& m; B5 _5 Q9 f' x
if(result == EDMA3_DRV_SOK)
: k& P& F) _/ F4 F7 k( i- {
{
! {$ Z$ X9 s; v. C
print2arm("edma3 driver init success.",0);
% F" a& M, r, R6 X% K5 } e
}
& v- d7 n& B/ l$ B$ K% u7 @; U
}
7 F6 |* D) {) Z+ Z: d& d8 P: _" o' V
" D2 L5 g/ ~! Z' s* w
) J o3 u+ A! L& ?
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
! L7 ` V4 H- l" z* {
$ o* B: [/ k3 v. T1 z
& x {& j1 ]5 f) q* o
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
0 m( }+ K# V; h N& u' j- d6 `
每次DMA传输完成后都要再次使能传输
+ L7 M. r! ?6 M: F
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4