嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
0 o9 J: k. ? C5 |2 {
#define PING_PONG_ACNT 1
, `' l- r0 P" C R
#define PING_PONG_BCNT 8*32*40
, |) ^( s, y* p! Q4 g. w
//#define PING_PONG_BCNT 1
8 F4 s% }) V* W; H$ J( V
#define PING_PONG_CCNT 1
# H3 ]2 a2 Y/ u; j( s
#define MCASP_BASEADDR 0x01D00000
' K2 P3 e; J |' J* Y
#define Mcasp_RXEVENTQUE (0u)
2 L4 ^0 s) c& j* a4 P& R% c
( u! s9 u$ f1 V5 w
/* OPT Field specific defines */
V* K3 H( O6 a& o
#define OPT_SYNCDIM_SHIFT (0x00000002u)
. _! E: k7 Y! @3 Y3 c( G# |
#define OPT_TCC_MASK (0x0003F000u)
& D2 N+ L T ]; K5 ?- p: L
#define OPT_TCC_SHIFT (0x0000000Cu)
' @+ W9 J+ u0 i- q: C1 I. ~# ]
#define OPT_ITCINTEN_SHIFT (0x00000015u)
! Q1 {6 ]9 c5 ? U C; S
#define OPT_TCINTEN_SHIFT (0x00000014u)
3 W1 ?4 ?/ W; a, f
3 z& M8 ]& z: ]! ^7 m" I' ^% j2 D
char ping_buffer[PING_PONG_BCNT];
: I) z0 D8 V2 }3 }; {4 N
char pong_buffer[PING_PONG_BCNT];
, k( {5 P6 M2 ~. O+ ^' I( K9 T
$ ^3 ?2 _+ K2 s' X3 B- I+ H. E
U" K+ b, E" L: z. ?( f: v* z
% V+ F2 _* F- ~4 P% b5 Z* [$ j
$ b- S$ j& C" Q8 Q. ^$ z
static void ys_edma3_init()
+ G- K& t( r3 p$ K' Z
{
2 J. E7 q+ B; M
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
) [2 s+ _* E& @
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
9 N) j/ f% ^3 m1 ]9 [
EDMA3_DRV_Handle hEdma;
! k9 h+ [6 i+ C) [7 U
uint32_t chId = 0;
3 _" Y' g+ q( I
uint32_t tcc = 0;
# ?! e' ^% `& F s. \
9 n; l4 n7 m$ m: ~8 \, e$ P
print2arm("edma3 driver init...",0);
! f1 P* w( k1 X, r1 x8 A
1 }# i3 Z- Q; X- i
hEdma = edma3init(0,&result);
% h4 c" }2 ~/ t( h, u4 p, g* E
if(hEdma)
6 E# a( v# H% l* }# Q' ^
{
0 R0 k# E& u0 N3 z9 g
print2arm("edma3init() Passed.",0);
7 C+ U% |2 H4 s1 z
}
% m8 L3 z. A& @& C Y
else
' M( b3 q n; N$ l* y. ^
{
4 Z' }9 `( o4 Z5 K o
print2arm("edma3init() Failed.",0);
' G( h/ C, l) T O6 h: c+ \, J
}
$ ]# }" V! K7 c
. _- Z$ i4 z: C5 o: c
if (result == EDMA3_DRV_SOK)
# M0 u4 T! B8 a9 u7 V/ d
{
* x* T, r+ P0 ^0 {
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
) `2 X( R+ j) i
(EDMA3_RM_EventQueue)0,
4 Q% E3 h. N1 E$ B1 V, n9 e
&edma3_isr, NULL);
5 O, _- D7 X* d* M2 y4 x8 F1 ]
}
4 w! v# m6 A4 j c C) n' A2 X
, u2 |. M7 R/ v: \8 k( I- c
if(result == EDMA3_DRV_SOK)
" U2 W* p0 g0 }" v' i2 M
{
( ?4 n, V% z8 U
paramSet.srcBIdx = 0;
' S5 m! n c% x: R% ^/ p' }* k6 v- e, _
paramSet.destBIdx = 1;
" \, ~( \+ q X( r; ]
paramSet.srcCIdx = 0;
! l- x; q; H$ B1 O3 L0 C8 x
paramSet.destCIdx = 0;
, t: o0 `/ s# }1 }0 O; A& L
paramSet.aCnt = PING_PONG_ACNT;
# ~. {# {5 ^; Q! {3 |2 }
paramSet.bCnt = PING_PONG_BCNT;
. m( J5 S. G! C8 ~ r
paramSet.cCnt = PING_PONG_CCNT;
c: e8 E# |8 F. Z! D
5 }: W% Q0 Z# a' q
/* For AB-synchronized transfers, BCNTRLD is not used. */
- g: C9 E9 p" a: Q
paramSet.bCntReload = PING_PONG_BCNT;
6 m5 b, M) Y: C& ^8 ^. i
) `9 Y5 T8 E& k# W0 Q/ i
/* Src in constant mode Dest in INCR modes */
. |" y% Q8 y& h/ P
paramSet.opt &= 0xFFFFFFFDu;
* |: p0 V1 e* J2 e+ J
//paramSet.opt &= 0xFFFFFFFCu;
& x" o _* c" [4 e o4 ~( N
0 ?+ C4 Z' _1 K/ q
/* Program the TCC */
) g: {% ?% q- A& k- A
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
3 n8 c8 l: f- ]7 h- O
S% R6 {6 }" `& v
/* Enable Intermediate & Final transfer completion interrupt */
4 X0 m2 `9 b; {, T5 B5 p
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
( H/ N, n+ Y8 a. o
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
3 T4 s, C( h) s
: [, ^- ^- x3 b [
/* AB Sync Transfer Mode */
+ `. H) j" \; a7 O! R
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ q! \6 H g% a" Z9 z2 B% q
* `' ^# C% p: y4 M5 \
/* Program the source and dest addresses for master DMA channel */
) w7 c+ Y* [0 y
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
3 @4 S p5 `5 F- q
paramSet.destAddr = (uint32_t)(ping_buffer);
; s; A4 t) H Y& X: p7 ]# x0 R
. Z8 }1 ?" c+ R& D* k
/* Write to the master DMA channel first. */
. s) p. w6 h) e
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
9 M& F p$ N5 ]+ S# B) E% o
}
$ g ?% q, z4 M. H/ e# W: ?
0 f; [+ H% U3 u
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
8 f) D- G) {! R' y; U. E. f/ n. o
) i4 e/ X' y" G
if(result == EDMA3_DRV_SOK)
$ }4 h* K7 y1 J
{
6 c: n2 n4 R5 S
print2arm("edma3 driver init success.",0);
y$ `* f- Y0 V3 O8 u
}
, P9 L1 a2 h8 I9 _$ j4 J
}
2 O8 N4 n2 \$ L9 w" y# U# ?
+ u! K, [, o! G) {+ ^# O" ~
" `) q& t) K2 P ]
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
7 p4 s6 ~. S$ E! W+ P9 R
6 z7 c6 S1 K3 M- q1 M( S
2 E- I4 f& F& j! O' h G
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
! e/ [' L, V" u+ y, _0 k5 D9 J9 i! b
每次DMA传输完成后都要再次使能传输
/ _- I1 U! O2 Z7 ]! d$ i, k
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4