嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
! Z; m# y- e6 }' V" O
#define PING_PONG_ACNT 1
4 c4 n9 ]: y! C2 v" P4 V
#define PING_PONG_BCNT 8*32*40
, H6 k0 n7 s$ F, Y
//#define PING_PONG_BCNT 1
* O/ c5 T0 o% F# X) }
#define PING_PONG_CCNT 1
; z; B+ ]- p6 f: y0 G# n7 T+ K7 R
#define MCASP_BASEADDR 0x01D00000
! P o* X6 n" [3 N6 ~
#define Mcasp_RXEVENTQUE (0u)
% z+ u" H+ } {6 D: @: N) Y
0 \: Q u1 s4 N4 y
/* OPT Field specific defines */
8 s/ ]. ^( I- A- }5 D
#define OPT_SYNCDIM_SHIFT (0x00000002u)
. c& F' G! s+ X4 z8 z. V
#define OPT_TCC_MASK (0x0003F000u)
+ q6 f( S' p3 l7 i3 C; {! E" u- k/ ~
#define OPT_TCC_SHIFT (0x0000000Cu)
- B9 ?8 y, l7 L
#define OPT_ITCINTEN_SHIFT (0x00000015u)
% m; _6 s! a+ Z: @' ^3 F. O
#define OPT_TCINTEN_SHIFT (0x00000014u)
# _" ~1 X, @% `' ?& J
! Q& J5 N D; J& f. U5 K# W
char ping_buffer[PING_PONG_BCNT];
- s9 D+ D5 h# ]# i; V. b! g
char pong_buffer[PING_PONG_BCNT];
0 Q5 R4 B$ |( D) c2 S$ A* W% S
- J8 B! y/ w" A* {
0 T* `( q* K3 i% D( ^
+ k" l1 {* k: k5 b: D
2 d# |( d' k& l; Q
static void ys_edma3_init()
1 x$ \6 L. y# b7 h& R) r) e
{
8 ~5 ^" Z0 X1 S0 s$ q$ k o
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
) T, u9 B R& L' |/ K# Z/ z# ]# ]# {
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
1 I3 L7 y+ D% Q
EDMA3_DRV_Handle hEdma;
3 l3 {' u7 u. k) R7 \0 H8 q2 c9 m) r
uint32_t chId = 0;
4 ]( h3 m( Q- c& c
uint32_t tcc = 0;
$ N! W/ d+ t5 y8 q
2 b# m) d7 H1 W) }1 z
print2arm("edma3 driver init...",0);
& ?& ^3 r3 t- [; r! k/ n
7 p$ m! {0 o$ Q$ p9 F
hEdma = edma3init(0,&result);
5 U& J5 |6 r ^9 F. s0 N
if(hEdma)
1 Q+ j* y: n n, H. b J0 ?9 p
{
: m; @+ q9 u9 p) C8 ]; C! D3 O+ E
print2arm("edma3init() Passed.",0);
! p5 z* }! v9 W' V3 f$ t
}
- I) v; V2 n4 d8 ^, k
else
8 T3 b* W* w6 \5 m' J
{
2 d& z% U+ W6 M1 g N2 H
print2arm("edma3init() Failed.",0);
7 `# w) Q5 f9 h0 F0 i5 z
}
+ _/ R9 _# a. i
9 Z$ y. {) O/ d' t2 D+ ]3 x+ z/ H8 q! x
if (result == EDMA3_DRV_SOK)
: {7 P2 u- d+ y
{
2 U! l' b: x, l$ U6 T5 [
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
! \6 H' T9 m6 D3 }& _/ K
(EDMA3_RM_EventQueue)0,
1 N2 U% s% s8 d$ C/ B7 ^" c
&edma3_isr, NULL);
; K: c7 F) x4 r/ [
}
6 Z% |$ G( b6 u% |3 m9 u3 Y
\0 R4 w! g# [3 K5 U b' I9 x
if(result == EDMA3_DRV_SOK)
5 R+ Q3 z/ }9 m8 E! |
{
( z) i9 V. z, O k5 ]3 i) p
paramSet.srcBIdx = 0;
, R2 h/ U+ m; y
paramSet.destBIdx = 1;
9 D" y, d7 b) Y0 J0 w* ^4 `
paramSet.srcCIdx = 0;
9 y- y3 |) s) ?5 U5 W0 X
paramSet.destCIdx = 0;
$ D2 N" [5 o; d, f/ c
paramSet.aCnt = PING_PONG_ACNT;
. ] H0 R* b4 y% s. X
paramSet.bCnt = PING_PONG_BCNT;
" v- |/ v0 S# N& C
paramSet.cCnt = PING_PONG_CCNT;
6 z, y1 O5 d% w& y
( H% }1 N: w+ X) B* \
/* For AB-synchronized transfers, BCNTRLD is not used. */
" Q0 ~( H$ f' R, _6 X& Z
paramSet.bCntReload = PING_PONG_BCNT;
: t- j- I; ^7 X! l; ^ t2 ^/ Q2 ^
! J9 P' ]. p% a% {2 T
/* Src in constant mode Dest in INCR modes */
- X, _, N9 M6 ]* r' s
paramSet.opt &= 0xFFFFFFFDu;
( d+ Q% g# R% ^
//paramSet.opt &= 0xFFFFFFFCu;
" L% [" V, N0 L I) r. r; L
+ [$ R4 ^5 l' G$ _: f
/* Program the TCC */
4 C- p3 H! ]" p! y
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
0 s7 v! P; T5 s2 y: j/ ^% F& ?
. z* c" t0 Z! K% l
/* Enable Intermediate & Final transfer completion interrupt */
( k1 \) X/ l8 P3 D6 a$ V* Q
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
2 f: Y* ]. B8 Z# t4 c9 A
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
4 ~1 I' O5 @) G/ A9 N+ d5 u
& g& u; o7 v9 i. ]' M7 Z1 p
/* AB Sync Transfer Mode */
8 f5 a3 }3 V7 N2 T7 |9 M7 A$ ~
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
$ C6 W. X9 x D& o: {
! ~( S, C3 ~# G% W
/* Program the source and dest addresses for master DMA channel */
( e1 S' x3 W! t
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
- A* ~4 G- v0 p4 G' M
paramSet.destAddr = (uint32_t)(ping_buffer);
0 v# U0 Y2 G5 n" T
+ x6 d2 j$ g, N( L* A
/* Write to the master DMA channel first. */
9 J. O# M# U" G$ t9 f) o; l+ F
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
, Z# J, A1 m4 h" d: B2 D
}
3 H3 p4 b( Y( V* P* ?1 O+ Y
# x( p0 I+ I# G6 W' O- p, X
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
: ?. Z( e4 v" i" X
8 l9 q+ o4 o' F" l0 t) x
if(result == EDMA3_DRV_SOK)
! k! J9 r. _$ S+ K6 \) K/ I8 A
{
8 b8 ]+ f' C* k7 a! R( M3 R& |
print2arm("edma3 driver init success.",0);
* v; y3 h" \9 {6 D, @% l( Q# E; u' S
}
/ P0 I7 V) ^5 `" `
}
* w9 C, e5 h: h0 | j; D
1 T7 z1 W9 j5 S5 l) m5 O
1 ~) r |! b( @& @" |! [
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
+ Q# E3 z& }( i* E
$ l2 `2 s) `( ]% K& I9 L9 g7 \. r
) r0 C, G* {2 E: l* Q: w1 F
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
$ b w! g5 X$ F6 u8 q% K
每次DMA传输完成后都要再次使能传输
% ?# K' _7 u4 B5 E( Q3 n& J1 I
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4