嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
' u0 G3 S8 j( o
#define PING_PONG_ACNT 1
9 _1 y( P Y. _* |
#define PING_PONG_BCNT 8*32*40
' k$ y% T! M4 t& b
//#define PING_PONG_BCNT 1
7 f' g* n- o H) d/ W. L- u% C& j
#define PING_PONG_CCNT 1
# ~* N) m7 e1 f# A% w
#define MCASP_BASEADDR 0x01D00000
& \& I/ u! E, I# Z4 i! |
#define Mcasp_RXEVENTQUE (0u)
/ r6 \% g6 c+ A D
& ?( d( H6 s& s1 L* o
/* OPT Field specific defines */
! ~* J9 ~& l& n4 q8 d7 Y8 J) \
#define OPT_SYNCDIM_SHIFT (0x00000002u)
" m, B4 ?: h) D
#define OPT_TCC_MASK (0x0003F000u)
- f2 W+ I7 p- P
#define OPT_TCC_SHIFT (0x0000000Cu)
~! F! }1 x' m' S9 D
#define OPT_ITCINTEN_SHIFT (0x00000015u)
9 y( ~0 I2 E# j0 f# }! E6 K2 f
#define OPT_TCINTEN_SHIFT (0x00000014u)
6 M2 G+ Q6 K4 n) X% M9 B' h6 H
# x% m- w1 `7 Z; f8 ]8 S! L$ e' T
char ping_buffer[PING_PONG_BCNT];
# T* i% ^! ^1 z, q
char pong_buffer[PING_PONG_BCNT];
9 l( H, d. }8 k; l* C
0 v' F' r: g' S
% }. ~) y; L$ N0 {2 r+ L: W
, E4 n4 [8 H! x. }; P* P7 e& h
- W2 \" s9 v& n6 f
static void ys_edma3_init()
; T- T- e# H4 C
{
& k! \. q8 \+ M0 d! N1 Q) R
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
0 J2 g2 T* N" l% I1 E
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
3 E- ] a. q3 \2 d# k
EDMA3_DRV_Handle hEdma;
. A1 U' F6 u& Y, _! d
uint32_t chId = 0;
6 J+ \' S: x. h5 @8 U
uint32_t tcc = 0;
/ M$ x9 t, Y; O9 D: [/ |8 N
( F* P* ?( u$ b) b0 |3 y
print2arm("edma3 driver init...",0);
6 d* ^# m1 J* G* H# T
5 n1 {- E. {2 F3 p6 t# Q* M
hEdma = edma3init(0,&result);
& J1 \, ^$ K* d8 x [$ c) Z
if(hEdma)
; j# L" A4 w' L7 ~& o+ B' d4 x. S
{
8 X$ ]" G V% D P1 A- H
print2arm("edma3init() Passed.",0);
$ h. f) j, a8 `: e7 s0 c
}
/ y' A2 L: k! z$ G
else
E d% b0 W* ^
{
, ^# D7 J" j: w* M+ t+ z S
print2arm("edma3init() Failed.",0);
6 s/ D. R0 q1 _6 k, `
}
. E6 a% r$ z- M2 p
. Z$ F7 Y( N4 [7 P8 [& C! r
if (result == EDMA3_DRV_SOK)
4 ?: i) z2 i% N1 |: S) d8 J
{
% a- _4 m' E% n$ j! [
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
' K8 L8 q; U% e( i/ c1 F
(EDMA3_RM_EventQueue)0,
6 p5 [3 z, d w- X" ^6 v
&edma3_isr, NULL);
) A3 q( @7 ^- \' b: L+ B$ g! Y! A
}
- Q- \: h- ?9 ~. W
: R! |8 a/ E' B W7 d( r. l
if(result == EDMA3_DRV_SOK)
# Z. b) t" L& L9 ?. _" W! a
{
% p3 }0 J3 O4 w
paramSet.srcBIdx = 0;
5 _' l @7 S1 h. n4 ?( i
paramSet.destBIdx = 1;
" s- a% w! p' h0 E: M, B
paramSet.srcCIdx = 0;
* i& V+ e) S3 O9 u
paramSet.destCIdx = 0;
3 U( b3 p6 g% X$ M% |( f
paramSet.aCnt = PING_PONG_ACNT;
3 t' U& E' o$ G8 |, q2 e' O
paramSet.bCnt = PING_PONG_BCNT;
% q+ o) `; }" U+ a3 [
paramSet.cCnt = PING_PONG_CCNT;
% l# O7 [( ?) M* ?# P) n
6 F" Z9 y1 J5 ]2 r0 T7 ?& z
/* For AB-synchronized transfers, BCNTRLD is not used. */
1 u( L. {. P( W3 m
paramSet.bCntReload = PING_PONG_BCNT;
# b* o( Y6 C6 r4 B! J
0 e0 @, u4 Y. q% m
/* Src in constant mode Dest in INCR modes */
: M' {8 C: I) ?* A! }/ S' \
paramSet.opt &= 0xFFFFFFFDu;
- K0 v+ ?0 G$ |5 i; R$ t
//paramSet.opt &= 0xFFFFFFFCu;
) c l/ o% H8 R( W" k# t: T2 Z7 ^
; J; e& t( k7 Q/ c) n4 V" d" d
/* Program the TCC */
5 Z3 t' d# F D- X2 A7 d `* k
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
6 e" p; W5 p; F1 k0 ?
" ^8 b6 W! I: s" J' K8 X, z5 r; O( }
/* Enable Intermediate & Final transfer completion interrupt */
1 A$ l F5 ^# o: I' z0 Q; i
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
" z6 L: G+ l& A5 w
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
0 H; r: s! b6 b8 d. V- G8 j
- _" ^; H7 @: \/ T x
/* AB Sync Transfer Mode */
( K! n) z# o7 x
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
# W3 `" I4 q7 E: r. H
- h2 E( D* f; j/ {4 i4 _- G% J
/* Program the source and dest addresses for master DMA channel */
' v) o) A8 n1 c
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
- ?' m# O& M: _. [5 q6 r/ v6 J4 @
paramSet.destAddr = (uint32_t)(ping_buffer);
6 h# _2 ~/ {5 J6 g6 u% B3 ]1 v
! s- D7 [" L( ]
/* Write to the master DMA channel first. */
8 R+ c4 |4 `4 [+ p; {! R) t" }
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
: |! z* q/ @; L5 v6 J! d2 N/ S
}
' g% _. J. o* L0 ?
8 }7 A$ X% R$ V) d3 v
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
7 b0 T ]! v6 ?# v, y+ z+ s0 }
# p% b& R7 ?* |
if(result == EDMA3_DRV_SOK)
" h& F! A* g. U* N5 w5 N* @
{
1 l% e' R) j; a
print2arm("edma3 driver init success.",0);
: J4 y/ C0 J: L: f
}
n+ d# A- O3 r; }$ u. X
}
' N3 L+ n4 l4 b% H
4 Z7 x3 C2 l# B% a P! \" u# t2 s
9 w! Q1 u3 w/ g
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
; L) f1 P G% C7 }7 k
5 P% n( E' U% G( d; w8 X
" i* O+ d! d6 n! w6 b( N, b
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
6 S! m7 W9 o: u! E
每次DMA传输完成后都要再次使能传输
4 U6 b) l" V* V6 j. p7 Q @
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4