嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
$ A }% H+ v, f
#define PING_PONG_ACNT 1
; E! y7 w! e+ y
#define PING_PONG_BCNT 8*32*40
6 M. p \6 I- j2 k2 P- w
//#define PING_PONG_BCNT 1
' J, n- B7 g- Q/ B3 R6 Z
#define PING_PONG_CCNT 1
6 O* V8 \% _+ a6 q
#define MCASP_BASEADDR 0x01D00000
0 f- [1 Y% K) q
#define Mcasp_RXEVENTQUE (0u)
: ~/ k1 Q' a" n* d
0 e# u! ]$ o" }+ J
/* OPT Field specific defines */
- E8 C# E# F. G9 T$ |+ A
#define OPT_SYNCDIM_SHIFT (0x00000002u)
, Z" o3 d) C- W0 v1 y" g/ ?+ o
#define OPT_TCC_MASK (0x0003F000u)
3 b/ w$ p. E) q* A" l0 i. ^
#define OPT_TCC_SHIFT (0x0000000Cu)
& }8 ]3 h' r/ a$ [$ U
#define OPT_ITCINTEN_SHIFT (0x00000015u)
7 n8 U& [/ o2 a" [0 |
#define OPT_TCINTEN_SHIFT (0x00000014u)
; v4 G3 @4 `0 l0 _
' S* P4 a" V0 x2 {: c" [8 Z$ p
char ping_buffer[PING_PONG_BCNT];
4 a0 t) {: E$ @ ^
char pong_buffer[PING_PONG_BCNT];
! s0 g" @ B- f5 [9 D! @
# E* v& c" n) w
# |8 c# o% j; k0 D' Z
P* H( C( y9 s$ \ k! f( l
9 x9 P( v b0 y% [: T. X8 N
static void ys_edma3_init()
0 B/ N6 _8 Z: P3 }- ?) q
{
! y, F. W" f8 E8 A' T# B
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
9 c; I; m% p, t! P0 W; g
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
1 G& H" K* \5 E; B+ G* a, t
EDMA3_DRV_Handle hEdma;
7 a+ s, D7 A' _3 O& W5 N
uint32_t chId = 0;
4 V3 u* Z) z& O$ o
uint32_t tcc = 0;
+ b9 s3 \4 Y* P) t! Z* b
3 `8 ]+ c/ \- Z: k6 [; _& I
print2arm("edma3 driver init...",0);
- `: ^" ] a: a8 T
. B* H1 S! O3 p* e/ J5 S( l
hEdma = edma3init(0,&result);
# H" G* ?( u( m& g2 n) _8 {
if(hEdma)
7 y3 R' K1 S2 N9 @+ c
{
/ c9 P+ q9 F* N! D% x! U& O
print2arm("edma3init() Passed.",0);
. [: Q' w) Z2 X
}
* g# ^4 G6 l' _
else
* `* V3 S" q5 _$ B) H* k* x1 _$ I
{
+ H+ q7 @( I! t# M
print2arm("edma3init() Failed.",0);
8 k6 Y# W6 B" K0 N. o
}
6 p F& ~2 F& e
) p& B% ^! C; }% p! |# T8 _6 t: B
if (result == EDMA3_DRV_SOK)
5 A# I. g: [& q2 d8 F7 g4 x
{
5 }* B; I' c- _4 i0 _
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
0 t/ U6 ^" G: ]) {
(EDMA3_RM_EventQueue)0,
_* Z- G# T2 F6 n- q8 S4 B
&edma3_isr, NULL);
+ s* J1 G& E4 w3 Q- T, O1 y
}
( K$ X$ B2 E6 i
' D: Z$ G) k4 i9 ^. U7 O" N2 P
if(result == EDMA3_DRV_SOK)
$ w8 ~+ R9 l) p% c6 n, _
{
, r' I2 }( `5 n3 U: e
paramSet.srcBIdx = 0;
0 Y% L i) i( G4 U+ z! v4 u' r
paramSet.destBIdx = 1;
! A+ [4 y0 h; c- G* E
paramSet.srcCIdx = 0;
; y) x' ]& s' U- w. [
paramSet.destCIdx = 0;
, Z" O1 t7 K& j
paramSet.aCnt = PING_PONG_ACNT;
# z# y4 L8 ]8 ~8 [9 D
paramSet.bCnt = PING_PONG_BCNT;
5 ^' ?: u! |2 c* Y9 T5 p
paramSet.cCnt = PING_PONG_CCNT;
- |" i* l9 J7 D( P8 x6 Y7 A3 ]
( W) L, Q: z: v/ u; {' r4 V
/* For AB-synchronized transfers, BCNTRLD is not used. */
( T; R. z+ \, w* r/ ^: x
paramSet.bCntReload = PING_PONG_BCNT;
1 R6 G+ U0 n; t8 S# v
1 n8 q2 n7 R# d7 L) v2 o
/* Src in constant mode Dest in INCR modes */
, |' k3 `2 h. e% _& a- `+ M
paramSet.opt &= 0xFFFFFFFDu;
( x5 ?4 \$ ~1 l# h" \5 g
//paramSet.opt &= 0xFFFFFFFCu;
f, n% D9 w( c" K
1 |# a" G' _, ~" r8 L* `$ ^! H X1 _
/* Program the TCC */
/ |% Y; C0 s* z" M) c3 E
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
, n3 C$ a8 w* I5 h
* v/ ?5 h, A3 L- F5 s/ ]. h/ d9 ]3 a: [0 M
/* Enable Intermediate & Final transfer completion interrupt */
# e N8 |( y5 L
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
2 n, n( e# [. Y: p" d
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
- c: _% B0 K7 j( {' N/ w
# V+ n! F0 K5 L. w4 G6 o* g1 P
/* AB Sync Transfer Mode */
: w' U4 h) |, S
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
\3 k$ e @3 T: y+ `
" J: T3 k3 C' {; l0 ?
/* Program the source and dest addresses for master DMA channel */
) ?4 ^" t7 n; _7 u+ I4 b1 v
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
! L! J& R; O/ _" \7 g
paramSet.destAddr = (uint32_t)(ping_buffer);
% ~5 o6 g) k( z m3 J7 n2 I
, K/ m& T6 q4 N7 L( Q4 v1 T
/* Write to the master DMA channel first. */
6 t+ _7 u# |. L, o3 ^7 q
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
' p" L) i, _% A
}
+ |* }6 I4 U* w
& I; o! g1 W5 h' A a3 {2 a6 I
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
8 c* r' k6 h a! a
J a' o1 I/ Z0 G
if(result == EDMA3_DRV_SOK)
4 f1 d# Y* {$ x! q! Q
{
5 h! `3 P8 U1 i
print2arm("edma3 driver init success.",0);
6 v1 c+ R% X( [
}
0 D/ B! z( }+ G; Y+ ?3 U* C
}
; @. r3 H, C9 P* k- k _
" \% b8 y( }. W0 V7 Y5 g
0 }4 i$ W$ A9 G) z
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
* [ e$ C# [' ]; A% N* s& Z, J
6 o+ i) p2 D, m0 C2 e
J Y' M/ C3 M( [
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
1 P- ?9 {, ~" T' m! b3 p; K) \
每次DMA传输完成后都要再次使能传输
! u$ Q$ L/ W2 s5 r+ Q
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4