嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
8 d+ N4 G9 @6 N* j: W# ^1 r8 [+ B. ?
#define PING_PONG_ACNT 1
7 k! m3 w5 B' C; X9 q
#define PING_PONG_BCNT 8*32*40
" O5 `# I$ h, }+ @' ?- v' }: L6 U
//#define PING_PONG_BCNT 1
5 x8 R# B$ q: { z
#define PING_PONG_CCNT 1
# I( _8 a* O; \- ^- L
#define MCASP_BASEADDR 0x01D00000
/ v" c8 ^+ k" K5 H. e% v) [
#define Mcasp_RXEVENTQUE (0u)
0 ^. \4 x. Z) h: O" B' f
4 D* v: S9 G1 G' F' Z
/* OPT Field specific defines */
. P) Y* a+ P6 L3 [6 L! P4 }! Y
#define OPT_SYNCDIM_SHIFT (0x00000002u)
# C! C a/ V5 M2 {/ J
#define OPT_TCC_MASK (0x0003F000u)
9 W' J" E* v# r% d5 ]+ ?2 f
#define OPT_TCC_SHIFT (0x0000000Cu)
. E+ e/ Y6 H( t" V
#define OPT_ITCINTEN_SHIFT (0x00000015u)
; M; F8 ]# ^2 V" Q
#define OPT_TCINTEN_SHIFT (0x00000014u)
. V3 A8 D, V: |1 G8 x
& c: ~6 l6 \+ @5 W# N
char ping_buffer[PING_PONG_BCNT];
j6 i, p+ ^6 J2 D
char pong_buffer[PING_PONG_BCNT];
9 I) C* C' p! e% w# T
/ v' [8 `7 ?5 S5 f0 R
( S" @! u4 z1 B5 S. T5 y
# G7 X6 R8 }8 S" {$ O' m6 p# Y. B
* ^1 }% l9 W1 k3 P! j& }% K/ t
static void ys_edma3_init()
: y2 C/ [' u( L4 l9 \0 R
{
7 R9 L/ Z+ G# \- k1 y ]) Y: M
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
$ V+ Z, Q( j/ u7 ^: t: H
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
* u4 r5 Y6 h0 }+ T u7 v. e
EDMA3_DRV_Handle hEdma;
; B3 p+ F/ ^1 y4 N! I' R O
uint32_t chId = 0;
" D; ^, @1 T7 Y
uint32_t tcc = 0;
3 {& o. |& P/ C4 p
! I4 C# m! v2 E- T0 V
print2arm("edma3 driver init...",0);
6 W* d! E* N( r; g, e
) r- N* d% O) K# E3 Z
hEdma = edma3init(0,&result);
! G n/ v" m& d: j/ z% i5 `" v
if(hEdma)
1 C {* F3 }% @* k% y% z
{
, A' {+ ]9 z N8 C( e7 \7 W
print2arm("edma3init() Passed.",0);
1 E* E \1 W3 q3 [
}
! {9 W; r) S5 f) v0 h
else
7 \8 J6 ~7 B& n% M6 j) r; w
{
( T( a# ?8 o* D0 x$ C
print2arm("edma3init() Failed.",0);
) \" d9 ?9 e C% t+ c& O
}
. L) _2 f8 z9 |2 N7 r, P
) T! o: K; H$ Z8 K
if (result == EDMA3_DRV_SOK)
+ {9 x, b3 |& I7 @4 A
{
+ u& l1 N, P0 k+ J) W9 F, I$ f
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
( d5 [1 F5 b h& `# |. D
(EDMA3_RM_EventQueue)0,
4 F% }# r" \* j7 @! x y n) Y9 e
&edma3_isr, NULL);
) M9 |6 w6 _4 c2 p/ ?
}
9 D4 V4 P; f- }; G8 \
& ~, v5 t. C }% i2 p
if(result == EDMA3_DRV_SOK)
& J% B3 V# j1 Q- O2 n& e$ j
{
x* j; e" Z; C q, N' v: W
paramSet.srcBIdx = 0;
2 R7 h5 c% C- Q3 U" ^
paramSet.destBIdx = 1;
. h+ k& f. H% A4 L% |& P
paramSet.srcCIdx = 0;
* a i% ?" W: V3 ]' P" N5 x5 E! D) ~
paramSet.destCIdx = 0;
" y& P8 f, W- c
paramSet.aCnt = PING_PONG_ACNT;
* R( g7 a, _& g2 q4 w/ q" Q
paramSet.bCnt = PING_PONG_BCNT;
) N- `; h/ p" t/ ]- V# s1 w
paramSet.cCnt = PING_PONG_CCNT;
1 G# o f% Z( k8 L8 p
4 c. L* n4 y& ~; |3 s- q' ~
/* For AB-synchronized transfers, BCNTRLD is not used. */
/ T8 b. W) C7 U" k. H9 S
paramSet.bCntReload = PING_PONG_BCNT;
9 V/ J- T: Q3 [7 r4 r
0 \! j) P4 |$ ]0 f
/* Src in constant mode Dest in INCR modes */
D. S0 c! f: N9 s4 ]
paramSet.opt &= 0xFFFFFFFDu;
5 ?4 G5 Q4 Q& w3 Q2 y$ o
//paramSet.opt &= 0xFFFFFFFCu;
+ ^, D# o% c/ R9 U1 I4 N5 k @% R4 i
& {4 m; f# o X5 W# H6 {
/* Program the TCC */
' \, u% \! x/ R/ v8 P' L
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
- V3 c x/ n4 L/ j" `
# ?8 d2 c0 h) `; S' t1 L' m
/* Enable Intermediate & Final transfer completion interrupt */
# `9 ?! s( B- i8 F3 j+ k
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
- F: x$ x% [! Y Q
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
7 {% I6 j1 j7 g- ]3 m" \) S1 c
$ U( X* e2 A* f- ?! p. J
/* AB Sync Transfer Mode */
5 T. X: \* N% V8 l
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
6 q# s% B5 q U$ l
" U) [/ f! A) `7 J! W2 Z
/* Program the source and dest addresses for master DMA channel */
) \% B; G- q) ?, M& Y
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
6 y* S s7 }" R7 l/ U, D
paramSet.destAddr = (uint32_t)(ping_buffer);
4 b2 i5 i0 p) V! z9 m" Y9 d
n* K/ v$ e! x9 ~( g. {$ ^' g
/* Write to the master DMA channel first. */
$ D5 `& |* o3 l: T- \6 }2 w+ i
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
( r% h2 f0 _0 e6 g
}
$ P7 C1 k1 f4 Y5 \7 W: r
x; u& D8 O" P9 ~6 S7 z* J
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
/ |5 g& F! D! F% ~0 A
* n U% M# R# I4 @: s' E
if(result == EDMA3_DRV_SOK)
1 J+ @* e: `: m% N! \0 A! e
{
+ L/ @! S4 P2 [6 p: c( Z4 }: p
print2arm("edma3 driver init success.",0);
2 j" c: K O( d$ h" I) x- T
}
8 J; L" P2 s1 |# y0 C D' I) z2 V
}
' K' G( `4 p# R! i/ @
+ R1 V: X$ T5 {7 O8 S* F& Q
% L( ~& U' U# B
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
; L) `% ?# w9 b/ U
; p* S1 G4 I# k$ |7 f2 p) H# o
" F, R* G8 B8 D5 p& [% y; g9 A
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
0 G1 A, P" T+ H- I) a
每次DMA传输完成后都要再次使能传输
2 u" Q' ~& A! o, _& ]
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4