嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
; j8 M9 d! n! c- {+ b
#define PING_PONG_ACNT 1
1 b9 y0 w* S! l- i
#define PING_PONG_BCNT 8*32*40
" i& ]' X/ `. J0 T$ U; x# I# J( n
//#define PING_PONG_BCNT 1
0 R( U# v. C& G4 [. f
#define PING_PONG_CCNT 1
% n) V% v6 n2 ?$ E' e
#define MCASP_BASEADDR 0x01D00000
i3 o* Y! u3 C+ S1 r
#define Mcasp_RXEVENTQUE (0u)
. r/ b/ T+ _3 }$ M/ A! v% b
% m% ^+ b, v. G6 w4 @' ]
/* OPT Field specific defines */
3 `6 R( S/ O# u3 i
#define OPT_SYNCDIM_SHIFT (0x00000002u)
, u8 k3 a5 b/ F* W
#define OPT_TCC_MASK (0x0003F000u)
7 s3 E W) o; _
#define OPT_TCC_SHIFT (0x0000000Cu)
% Y$ @5 H" _" \9 w) V/ d
#define OPT_ITCINTEN_SHIFT (0x00000015u)
: p5 S8 {. I) e2 ]$ ^, j7 T
#define OPT_TCINTEN_SHIFT (0x00000014u)
* D' J$ T2 _: L* a) H2 i* E' R2 B
% Y3 y! x" L2 R
char ping_buffer[PING_PONG_BCNT];
0 b2 f Y! f1 F8 ~2 y3 m. I
char pong_buffer[PING_PONG_BCNT];
' {* i `3 C- N4 ]
6 c$ |3 ^6 k' N$ m& \
. b0 l: Y0 M: s2 E: Z
, b& m4 N$ f4 E6 G# c
5 _2 I! j" p; s, A0 D0 B
static void ys_edma3_init()
$ i- N1 a- L" x7 O
{
/ p6 _( \: V7 ~0 @4 V
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
: {+ \' B' p& r. T
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
1 i: G# C" l7 T- k1 W e
EDMA3_DRV_Handle hEdma;
, u+ V4 i' ` e, E2 [
uint32_t chId = 0;
3 }' L" [% O/ w( N
uint32_t tcc = 0;
) p* l/ B6 N r9 C
8 K- v7 r( H! ~4 a$ ]' {
print2arm("edma3 driver init...",0);
% M* y. |3 _+ O; s
8 M2 V3 n# z+ a2 F* G6 H) }
hEdma = edma3init(0,&result);
5 w+ Q2 K% J0 l5 G/ ^9 V. z
if(hEdma)
2 T3 f) h: {/ P5 ?6 }) @$ R$ _+ V' Y/ F
{
% a4 U$ e' W5 \+ g. M4 m1 a
print2arm("edma3init() Passed.",0);
( M) Q( @( j. | c1 M
}
2 N7 B6 z$ v) [: P8 `' N
else
; ?5 G2 P6 _ x( k* H; C
{
$ D% O1 B# A1 e' T9 F: S
print2arm("edma3init() Failed.",0);
7 F% a5 F5 V" n8 r3 \( l, x
}
! f+ H( X1 ~) u
7 E/ m- j6 h r5 U( ]2 V
if (result == EDMA3_DRV_SOK)
; c+ Y2 C4 Q3 g3 w* s
{
3 P" P3 ^6 E% Q2 D
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
0 {5 T! ^8 \4 x' P0 F" f
(EDMA3_RM_EventQueue)0,
% O: R9 N0 O4 Q9 v
&edma3_isr, NULL);
9 c1 }) r- U# X) n
}
z: @: k3 ~! _( e( a
% a; s, u& r, `. G& `
if(result == EDMA3_DRV_SOK)
/ ]* e, D( @/ I0 i8 J# d2 s2 ^
{
) r$ x/ r% N" I8 f6 u
paramSet.srcBIdx = 0;
8 m# }, b6 R8 W' J, y2 X5 p
paramSet.destBIdx = 1;
2 g! W$ Z) b# R
paramSet.srcCIdx = 0;
1 W0 o8 a3 Q8 ?& o! T
paramSet.destCIdx = 0;
% R r Q8 M6 T7 ]
paramSet.aCnt = PING_PONG_ACNT;
# A* F+ ^! \1 A7 |! x' ^
paramSet.bCnt = PING_PONG_BCNT;
- r2 M5 ^4 i3 ?: Q& x* t1 o
paramSet.cCnt = PING_PONG_CCNT;
k3 t- |7 ]) w4 I3 u% f
3 a/ T9 a6 k$ `
/* For AB-synchronized transfers, BCNTRLD is not used. */
5 y/ g- S6 P% d: I9 K. D
paramSet.bCntReload = PING_PONG_BCNT;
* X; [( k8 m$ f& b( h, {
# D) _6 Y, i5 I/ {/ J
/* Src in constant mode Dest in INCR modes */
/ V( ]: Q: c& e( {' j2 e M+ W6 n
paramSet.opt &= 0xFFFFFFFDu;
. j+ Z! ~4 _5 o, [( J& s
//paramSet.opt &= 0xFFFFFFFCu;
1 U: {* j5 w0 {; I- W
. E- d- B7 \1 s1 P
/* Program the TCC */
9 a( i/ Z6 h* ]0 W/ c9 b R
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
* V4 F$ [6 e7 J K
# u1 U# e" K8 g% l" q) g
/* Enable Intermediate & Final transfer completion interrupt */
2 o" c" \+ u( a; ~/ k& [
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
$ Q" n; H5 d0 e. i( l
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
! f. r5 e: Y6 {+ H
% I0 `! ]" C+ [: ]+ Z
/* AB Sync Transfer Mode */
. G0 ]1 F" l4 E8 {& s1 L' V6 a
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
7 t0 r; A+ V# v0 q# i8 Y3 V6 r9 A
& ^1 Z9 p* a* }+ q
/* Program the source and dest addresses for master DMA channel */
/ C. z9 r; H0 L1 ~
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
: n; y. d6 R6 t: a7 q) U- e
paramSet.destAddr = (uint32_t)(ping_buffer);
) ]% T/ _! W b* M
; t6 e$ z1 ]! N" i9 g0 O
/* Write to the master DMA channel first. */
; } C7 K( ?4 V4 K. P7 P
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
( H$ j N- u Q9 p0 G A. ^" `
}
9 j( {+ I2 @# Q4 p6 c& U2 Z
5 I+ }' Q- D+ H% |
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
& g/ i0 j, G H5 @ Y0 n! X
q2 u3 P+ L" \0 q' n5 @
if(result == EDMA3_DRV_SOK)
+ z3 ~+ ~, X' ~. S+ n
{
d7 ]* h* r | P6 ^
print2arm("edma3 driver init success.",0);
, v/ V$ ~6 ~* p# @6 X
}
% m) I4 k" ~* O
}
% L4 w% {3 ^# a$ o% l
$ \7 z5 L5 J: O$ P# m' q* o% Y
3 f* O! C( B* R; b, @
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
0 x/ \9 I, f! Z* V; ?
0 G; ]; V1 H$ r, p' P; ~- X
, k% S; d3 E2 | I' z( j7 M
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
6 X" M& l( P+ l0 N1 a1 \, n' [2 N" a
每次DMA传输完成后都要再次使能传输
& x" N* Y. X0 e, x5 b( q
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4