嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
* w2 U: w) X5 e9 p1 t+ v/ O" [
#define PING_PONG_ACNT 1
b0 O P# R+ s; B: a$ z& Z
#define PING_PONG_BCNT 8*32*40
% T& l; l* z' }# N2 s
//#define PING_PONG_BCNT 1
$ ~: x. D1 ]/ v+ B5 H3 ?: [( T
#define PING_PONG_CCNT 1
8 d4 c" _3 d* u3 _" V
#define MCASP_BASEADDR 0x01D00000
* H. P7 k( k0 w% o- }6 m' c4 T0 k/ p
#define Mcasp_RXEVENTQUE (0u)
! C+ c1 @: e& w: Z% N2 [
) ~- N; a. [9 }3 s
/* OPT Field specific defines */
0 s7 m& M5 O A) J4 @
#define OPT_SYNCDIM_SHIFT (0x00000002u)
; u, i$ X* |9 {2 @% R# i
#define OPT_TCC_MASK (0x0003F000u)
9 t: W. t- k0 @4 h8 q; f6 I
#define OPT_TCC_SHIFT (0x0000000Cu)
- u/ f5 e6 G8 o" u) W( T. w
#define OPT_ITCINTEN_SHIFT (0x00000015u)
! ]# F2 o7 q6 m7 ?- k& ?
#define OPT_TCINTEN_SHIFT (0x00000014u)
6 Y6 s7 o/ S$ a* `' |3 y
4 @$ ]; v# o! `: i. n" [
char ping_buffer[PING_PONG_BCNT];
" K8 ]4 g8 a8 ^6 u
char pong_buffer[PING_PONG_BCNT];
, ~ i8 Q+ Q1 f0 F0 C& v) H
6 E1 q/ h' c% A* l
% R7 W" e* w# g& V+ _/ t
$ k0 J) p4 [, b; I/ ?* S, ~. y
# n2 G. \& w5 E8 E
static void ys_edma3_init()
. c8 N9 B4 ]: ^- F9 u
{
4 F$ v. F8 q6 c: w
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
5 }/ m; _# @2 @7 N4 w6 Y- e4 [0 ]
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
1 _+ n* r9 A# q1 L% d' m( h
EDMA3_DRV_Handle hEdma;
8 q* ~6 P) V1 L" I* d# M' Z5 _
uint32_t chId = 0;
% P* }3 d8 ^+ }" U
uint32_t tcc = 0;
* d* V+ Q; \4 W$ n/ r
: S( `9 ^+ T# \7 @& Z
print2arm("edma3 driver init...",0);
) ~' ]! P0 R# k( x$ _
$ J0 G$ L. M6 c2 V6 J- k# l
hEdma = edma3init(0,&result);
" P7 Z# `, {0 V: x
if(hEdma)
5 d$ S2 @% P7 @" K5 _4 {7 q
{
t. Q$ c; j! l5 I8 K
print2arm("edma3init() Passed.",0);
/ v% a$ p5 ~, m
}
9 w# n5 B% F% V9 T" N
else
8 ~, B7 P% f8 Y! k; A
{
# x0 P5 [5 d( p5 j
print2arm("edma3init() Failed.",0);
4 k$ Q- h$ v" K, P
}
6 x/ {" d, {' d" T1 M
) D. X# |/ ~6 F/ i: {* W
if (result == EDMA3_DRV_SOK)
7 r7 v/ D8 o7 G2 C$ ]
{
2 N/ o; B, e, u. T8 G
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
: A: S$ X1 |( X, o* Y j
(EDMA3_RM_EventQueue)0,
m- {& N( Q1 E, y' `& f
&edma3_isr, NULL);
% K( {! v/ N4 a$ U: B; E
}
+ f) u! R0 P6 E- A& ]$ q# r
9 p% k) G. I1 k+ O0 R
if(result == EDMA3_DRV_SOK)
4 k8 H U2 J, k+ { L H$ a$ m; c5 x, e& L
{
% Z- Q8 Y& M- q) e! Y0 m
paramSet.srcBIdx = 0;
G7 ^3 D5 G- S
paramSet.destBIdx = 1;
- q6 d# r; R0 L, J: p
paramSet.srcCIdx = 0;
: X; s+ Q3 K( i4 J( O* y9 C
paramSet.destCIdx = 0;
$ R i7 i8 D8 M" \ m. T: k5 R+ h
paramSet.aCnt = PING_PONG_ACNT;
8 [; q% O) M2 b! L7 ] r2 z
paramSet.bCnt = PING_PONG_BCNT;
1 n) ?; F5 v4 y! X6 M0 F7 [
paramSet.cCnt = PING_PONG_CCNT;
5 T4 o) B1 k' T5 J! e) m2 V
?, F! s1 u; U
/* For AB-synchronized transfers, BCNTRLD is not used. */
1 x# p5 F* L% e; R
paramSet.bCntReload = PING_PONG_BCNT;
# ~# Z% B8 |+ p. v" b4 l f0 S
( ?2 T$ ~$ A7 s" t: u- K" y
/* Src in constant mode Dest in INCR modes */
$ j2 I. [# V9 s
paramSet.opt &= 0xFFFFFFFDu;
" L# n' d9 K ~( {
//paramSet.opt &= 0xFFFFFFFCu;
O7 K- n8 G5 {& J
, F& _1 [4 R" l4 ~' h$ _4 c- s
/* Program the TCC */
4 i6 x2 Q, z" d% }+ S
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
0 z) y6 z* u" B3 {* e
& J h1 b j- T* Z% k
/* Enable Intermediate & Final transfer completion interrupt */
) Y% j& c: x" i
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
, R8 }0 A' D6 B
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
$ _, f- ^4 k+ S' g9 a3 X
/ W n8 w9 s8 T
/* AB Sync Transfer Mode */
Q6 l: L- j/ I7 S- c3 R' S/ I4 Z0 [! e D
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
" a2 K3 D8 ~+ U l0 q2 f1 c
) F* a7 `. R( X9 V
/* Program the source and dest addresses for master DMA channel */
* J4 N2 {) b: a9 W# Q) }/ U! Q
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
! |! {# G8 \) f9 f( G5 A" @
paramSet.destAddr = (uint32_t)(ping_buffer);
5 Z6 o) r! [' F& E! T. J
, w d4 [8 B+ w5 `% p- r
/* Write to the master DMA channel first. */
. I. u+ P9 \3 A: Y) ]. J5 N2 E6 E U
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
+ g& t. {5 P. G; `" ~: y
}
2 v$ |- ]( _" {, S
+ v2 d5 @& w4 m8 o% b4 D
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
( J8 P+ {% O9 v; A
3 v ^/ T S% F8 @# i) Y9 W0 X: r) c
if(result == EDMA3_DRV_SOK)
: S# d$ @5 F n, ?- C
{
y5 ^: m. O& Q# r/ z, w
print2arm("edma3 driver init success.",0);
6 r: p; ?. p, T' H9 Y
}
) Q0 o+ C/ @2 P, @: l5 L/ L: m
}
) e% _ d9 M+ L9 ]! r
6 [, m& X0 I7 O" @; o
3 _/ i. X3 o. [7 E- Q# K- N
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
8 i7 d" \6 m5 x6 y3 O' s
" Z. }0 { l3 j t/ {3 a
* p+ J1 ^8 O% D* R2 H+ z0 R7 D
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
5 O, x# E8 Z; T. Q, q; k7 L
每次DMA传输完成后都要再次使能传输
. H( C( j8 N" j y5 S: M
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4