嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
, f( Y. w0 ]' X# u
#define PING_PONG_ACNT 1
9 v2 k: q. r3 V: G" S! ]
#define PING_PONG_BCNT 8*32*40
: M! n+ F$ Y! |' w
//#define PING_PONG_BCNT 1
/ J2 b6 f% V: d& x+ [
#define PING_PONG_CCNT 1
. Z* X9 h& r& ]+ g! v/ L4 }
#define MCASP_BASEADDR 0x01D00000
2 k0 m4 b$ M3 D/ x. ?' f
#define Mcasp_RXEVENTQUE (0u)
4 i+ F) B* P! o! L5 z; g2 l
; l- \& V+ A( D7 {# B3 B& a
/* OPT Field specific defines */
, P- g' A' N( C( x- Y6 Y* S
#define OPT_SYNCDIM_SHIFT (0x00000002u)
$ {$ |8 v' x" F9 X
#define OPT_TCC_MASK (0x0003F000u)
) P" }$ h# J7 v$ T; M7 C+ x2 i. \
#define OPT_TCC_SHIFT (0x0000000Cu)
- n2 q. V) L3 [3 L. L4 ^- Q+ t$ ]
#define OPT_ITCINTEN_SHIFT (0x00000015u)
7 u$ `6 P) U3 v: ^& p
#define OPT_TCINTEN_SHIFT (0x00000014u)
4 D+ z# a3 O4 O8 e
' l' C2 A5 B$ J7 v
char ping_buffer[PING_PONG_BCNT];
( n ?) y9 F' o6 c
char pong_buffer[PING_PONG_BCNT];
# S2 V( q: J/ Q0 e
* Q3 e6 L" R4 f; G; E3 t
# k; Q* x% q7 G! i- P [
; E, @+ p0 o% T, P, j& k1 G+ V& n
" A7 O$ {9 I' L. z" @: u8 ]8 s
static void ys_edma3_init()
) D% i1 [! s+ m- h9 {1 J* M( u
{
+ a5 V: z: {0 h! k( w
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
: V' |) S9 P' z; H; u
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
0 X3 \7 R* O0 y l
EDMA3_DRV_Handle hEdma;
6 t) G: m! G& \3 D1 m8 B3 J& |% M
uint32_t chId = 0;
9 H6 v- U9 N# \/ Z! ]
uint32_t tcc = 0;
* w5 w+ L9 ?9 q+ |
, d% v9 [" p2 d' r7 m9 q
print2arm("edma3 driver init...",0);
" Z; e# _. k( O
" T, t% o5 R3 [% x4 u. h+ }2 k
hEdma = edma3init(0,&result);
6 |& R4 ~2 q6 \6 z* k
if(hEdma)
5 ^5 Q, n* \2 j% m
{
" _3 l. b; v) J, G
print2arm("edma3init() Passed.",0);
) f2 y# Z: D) J3 L2 p2 H
}
; k/ J" w) B9 K8 T8 B1 |
else
) ~6 {% ~" y7 F. O L6 f
{
, d+ p+ W4 u3 v% E. [' J
print2arm("edma3init() Failed.",0);
, W; U+ L- w7 n) f# m/ G
}
3 W" k/ a1 u" z% W
3 O! T* n1 b* y6 j
if (result == EDMA3_DRV_SOK)
# ^! V/ k5 }: Z% S, }$ n
{
. k8 m% ?, Z! R. `
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
; ?& T! G- |9 i. R+ j4 m5 ^
(EDMA3_RM_EventQueue)0,
% l8 S0 r2 S& D9 ?% K/ z
&edma3_isr, NULL);
6 n/ w: b* d4 K5 t% h2 d' m# p9 Q
}
, p0 X% F7 ^$ U, E% P8 v
% n, i3 z+ c' _ H
if(result == EDMA3_DRV_SOK)
# e' i. C+ F* y, v5 N V. \) x
{
/ G: [1 C9 e$ Z
paramSet.srcBIdx = 0;
1 X4 `# i+ C7 m6 i; V2 o% _
paramSet.destBIdx = 1;
( T$ ^+ j; n0 n! J; }
paramSet.srcCIdx = 0;
2 q, R ^5 w% k0 v1 L
paramSet.destCIdx = 0;
( H" ^- t3 E; R, B6 j& [! X
paramSet.aCnt = PING_PONG_ACNT;
* E, x5 P* H0 m1 Y5 D% G- t
paramSet.bCnt = PING_PONG_BCNT;
) { ^6 n' n8 u u+ |* ~1 N4 r) `
paramSet.cCnt = PING_PONG_CCNT;
0 [: T" z$ e& q. Z
5 t" x+ Y! r% I% a, v
/* For AB-synchronized transfers, BCNTRLD is not used. */
- @. L) Q$ E; m' q9 V# E
paramSet.bCntReload = PING_PONG_BCNT;
H8 b! v9 ]3 z
$ t5 ], w: A6 L0 G
/* Src in constant mode Dest in INCR modes */
) r5 R c" t9 U, _6 }
paramSet.opt &= 0xFFFFFFFDu;
2 n/ ]! d/ k$ i, c Q
//paramSet.opt &= 0xFFFFFFFCu;
; I% d* i8 _3 r
9 d5 Z# q$ p" \2 s
/* Program the TCC */
' l! S w: ?$ F+ n- E
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
% I- {; g* q7 `; \5 A4 A- C; S
& A5 Q1 b) H2 s* A7 z3 ^
/* Enable Intermediate & Final transfer completion interrupt */
# C8 x) m' V4 e- _& _; [+ W
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
0 B* \5 A+ m. Z1 P$ x+ ~0 T
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
* J1 Z) Q _6 k3 w. y
) m4 O; `7 Z2 _
/* AB Sync Transfer Mode */
3 q2 u3 r% i0 C8 s7 d
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
( U4 J! c7 ]0 U5 g0 _& X T) G
, i2 d9 W+ s/ D
/* Program the source and dest addresses for master DMA channel */
2 u) B$ b4 X, Z, y9 @0 v# Q
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
1 }2 N/ Q* _$ U3 y6 w' M
paramSet.destAddr = (uint32_t)(ping_buffer);
8 |3 K+ @, S4 [: P' d( {' W+ F
! b: u" E8 O* n1 f6 ?$ `6 S B7 v
/* Write to the master DMA channel first. */
: f* o$ k( y$ t. S
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
5 N H( y, O$ S/ r f5 ?
}
) z) t2 e6 Y7 X' M
0 U/ q4 o9 P; ]! u' _$ a
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
/ ~! b8 v: r& Y, V Y2 G5 C
/ x' R3 {/ l3 m8 }
if(result == EDMA3_DRV_SOK)
, J" w0 Y' T4 \* N" O
{
# E# C3 c( F! h: Z0 f+ R( x1 g* e
print2arm("edma3 driver init success.",0);
7 C, t: F- o9 f, R
}
9 Z$ m$ d2 ?* }0 ` n# b/ U
}
; v" N4 z- X+ P5 `0 V
% C- Q. N t/ Z1 ^0 H$ d/ K' t
( b4 x, m0 c( O1 R, \8 p- g
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
$ b$ I* w. s" Y! ~! |2 ~* ], e7 k
+ o; M% P$ T6 o& g7 z
+ `, u" a; _4 C; h1 d) v
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
* R* H2 P y/ ?/ Q) x& b
每次DMA传输完成后都要再次使能传输
& a6 C! ~$ m9 I! k
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4