嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
6 n! H1 i9 t4 N5 z. ~
#define PING_PONG_ACNT 1
, C0 w7 m: u" L5 O& ^
#define PING_PONG_BCNT 8*32*40
' k, S! G) G5 G- x" c% M
//#define PING_PONG_BCNT 1
! N: O1 d* j" d% m% Q+ D7 s% u; [
#define PING_PONG_CCNT 1
& G4 C! C7 ~& D1 k: j) F" P! C& K
#define MCASP_BASEADDR 0x01D00000
% {$ x3 U. l( z8 y" ^/ {
#define Mcasp_RXEVENTQUE (0u)
! }2 |6 T. r" y8 G0 x' B" S ?! X+ }
9 d ?' d- u" T& E0 t; H
/* OPT Field specific defines */
$ L% q- M8 P3 q# Q/ [; e
#define OPT_SYNCDIM_SHIFT (0x00000002u)
! Q: |9 h# b4 T% A0 W
#define OPT_TCC_MASK (0x0003F000u)
6 s: u& F& c0 G7 X3 f0 I
#define OPT_TCC_SHIFT (0x0000000Cu)
* V) `. h) J E+ y! h
#define OPT_ITCINTEN_SHIFT (0x00000015u)
/ K8 {2 v- Z; f: a* c. j
#define OPT_TCINTEN_SHIFT (0x00000014u)
+ \# {% b8 f- r. W& y9 z
* j1 u( U/ p, U9 [$ @
char ping_buffer[PING_PONG_BCNT];
' \- ^5 G. u# o2 S; k8 s
char pong_buffer[PING_PONG_BCNT];
; S! P3 U+ y7 u
9 G4 P$ v' i- H3 j) ~; F
* U& L! _* ~( Q) n* z8 v5 y+ Q8 a1 O
3 Q1 T9 V) X6 G1 c+ c# ]) r# e8 u
9 |/ g5 R/ r" E* U. H' L
static void ys_edma3_init()
) R0 t# P$ r) f$ g
{
J6 z" y' C; v4 O
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
# l9 u/ @5 t* C8 ]5 A
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
, B* X! N' a: k7 @; Z2 U5 C
EDMA3_DRV_Handle hEdma;
Y4 {4 k4 m0 w" A
uint32_t chId = 0;
2 E4 W' R( b/ i$ W* d
uint32_t tcc = 0;
7 J2 P8 k8 M9 s, h
% s' W' l2 ~ J9 Z1 ]+ M+ [
print2arm("edma3 driver init...",0);
% O% L' q3 x% } X; R) N
3 t5 o# _3 ]# j3 O% j2 Z8 _
hEdma = edma3init(0,&result);
; r* `. r4 N1 v9 U" y( ~0 [
if(hEdma)
/ A" ]# }5 I3 Q" h# u
{
* r: d( M1 g2 \6 G% k
print2arm("edma3init() Passed.",0);
8 [8 w& L! P. Z! p# M0 N% k
}
) M- E; Y. V5 ] p5 G* ]: y: T& J
else
5 e7 k" }" b0 [' p. w
{
* ]8 S6 R" \9 ^ q
print2arm("edma3init() Failed.",0);
' B- q" o v; C
}
+ W0 r( B+ ? H$ ^' H. J! g
. b# j% s2 m$ s( b k
if (result == EDMA3_DRV_SOK)
( R& A& `6 i3 F( U/ w6 r
{
6 A, g, [! X9 {: h* e
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
, R" y5 {8 y0 P2 v; Z5 t& y+ n
(EDMA3_RM_EventQueue)0,
! H& {: X; c, i; @7 D3 Z. t! k4 L- d7 Y
&edma3_isr, NULL);
8 w+ T& e$ p: ]
}
# U' y$ F% [. g4 U" t% J
* |4 U' W9 o4 o
if(result == EDMA3_DRV_SOK)
K, Y: W' l2 |( G1 B7 ]# ~
{
1 p; p- E4 D: r: Q/ O' q I
paramSet.srcBIdx = 0;
6 ?6 c+ {# C3 q' V) e% r
paramSet.destBIdx = 1;
$ k8 {" w2 v9 i
paramSet.srcCIdx = 0;
9 w& J H3 B4 m# I- j2 A
paramSet.destCIdx = 0;
, L" |! Q) u: X) P* W+ H
paramSet.aCnt = PING_PONG_ACNT;
% d) S9 |1 f, q( s5 B
paramSet.bCnt = PING_PONG_BCNT;
( o) V9 |! \6 U
paramSet.cCnt = PING_PONG_CCNT;
# {. u/ {% ?6 ~
- ~; P) z o# I1 P r! D
/* For AB-synchronized transfers, BCNTRLD is not used. */
7 v; |% \7 o8 F1 S @: z, }1 T
paramSet.bCntReload = PING_PONG_BCNT;
; S; \" B5 s$ e
9 Q9 R' X+ q! ~7 \7 b- a8 `
/* Src in constant mode Dest in INCR modes */
$ l) ^7 u* v( s3 R0 u0 Y
paramSet.opt &= 0xFFFFFFFDu;
% @6 Q% C' @$ F. _+ K
//paramSet.opt &= 0xFFFFFFFCu;
& d3 o8 U# v0 a2 q* U+ L
) D3 f x" }2 v/ K1 u5 \5 ]0 k
/* Program the TCC */
, o f, a1 {' _6 T
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 b! D- Z# i2 V4 V; s
, M! M# ^' j8 W( a0 n
/* Enable Intermediate & Final transfer completion interrupt */
" ? H9 [/ S- j2 z# ?# }" s
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
! R0 U- D4 t S# x0 \/ l3 i
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
+ _# O1 I3 W* y: n. Z% ^
8 m8 R; U: I' w3 d
/* AB Sync Transfer Mode */
! x+ F2 C e, z5 R1 _( \
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
K7 b2 H# ?; t& q
3 K, ?" k. V. @0 m1 b, ^, W
/* Program the source and dest addresses for master DMA channel */
* n4 \3 ~. s/ e5 @# l
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
) H- ^0 [0 F& F1 m4 r! l
paramSet.destAddr = (uint32_t)(ping_buffer);
- w9 q N x: o$ Y: p- t, V7 ^
' N, n6 M+ p' G. v
/* Write to the master DMA channel first. */
1 ~5 A" J4 }" ~# z0 }9 g
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
0 Z& C) @' l# Q& s
}
6 Q& K/ @; d6 s4 n% `
* n" `5 Q3 m! c2 f( x) R3 B
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
3 \8 w1 Y$ p. a S5 S
2 l; W* f" b" s1 v5 p! @
if(result == EDMA3_DRV_SOK)
" r9 T2 u1 x1 R. E1 _7 V) a0 h
{
5 A! \' z- c. J! A4 O& I, \6 w
print2arm("edma3 driver init success.",0);
: P. P% Q" v% `0 m
}
# f' x t6 ?" Z8 } U- r/ `
}
p( C0 ?3 B( j9 ]) o/ _
: s$ ~& D1 o9 t; ?( H+ c4 G
8 ~2 M% B1 _0 x( @6 Y) Y, [
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
( |% g5 x5 g; n& G6 Y7 M
$ m8 O5 F. V3 J& c6 A+ |
; `( g+ J4 a9 ]% E5 S+ I' \
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
: \& q: r& ~6 d% D2 X* O' w
每次DMA传输完成后都要再次使能传输
1 K/ X+ v/ L- x' a* m% z
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4