嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
# V' S! x: P `( U" a7 F6 \2 y
#define PING_PONG_ACNT 1
8 n" X. l( N5 H- L4 v3 y% L
#define PING_PONG_BCNT 8*32*40
+ Y7 L( @3 f# N' m3 w) ^0 i. ?
//#define PING_PONG_BCNT 1
2 l8 L6 h9 {7 b5 e( P# M
#define PING_PONG_CCNT 1
2 i( O, q* g2 p# G+ v$ v
#define MCASP_BASEADDR 0x01D00000
. x4 a& e0 M+ ^) W
#define Mcasp_RXEVENTQUE (0u)
+ u% ]: f2 l" p/ o% _
* x* o$ H3 c' n- B' B( M* Z9 a
/* OPT Field specific defines */
8 A9 J& k7 A$ D7 B U. }
#define OPT_SYNCDIM_SHIFT (0x00000002u)
# o& S o9 F' v5 X: y! i: D
#define OPT_TCC_MASK (0x0003F000u)
7 q3 ?# D6 |$ n& S
#define OPT_TCC_SHIFT (0x0000000Cu)
; I, q. I) ^# Y/ p
#define OPT_ITCINTEN_SHIFT (0x00000015u)
+ k5 H3 V i' a7 S' M8 u0 G
#define OPT_TCINTEN_SHIFT (0x00000014u)
; u5 k( w% ^9 u) E5 Q. d# i) j
/ E' v# `4 R) U# K5 K5 S7 n6 P3 w! n
char ping_buffer[PING_PONG_BCNT];
. f- C M4 c' A8 C# c' Z0 @5 ~- @
char pong_buffer[PING_PONG_BCNT];
+ _5 k% m. u# b% M5 b0 A5 x& f3 E9 G
; v9 s1 y9 U6 _9 {* w5 `1 y' M- e
! J; \5 {4 A8 |7 a3 V
. O4 s3 q) ^- F
. R5 r; g; f. f. B
static void ys_edma3_init()
, Q) }% {9 ]8 k* G
{
7 o$ w' u0 E9 F) r) D
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
0 k. L5 t n+ n; D, r- ]+ a& s
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
3 _) j% ?/ k" h. M2 a4 @2 t! s
EDMA3_DRV_Handle hEdma;
7 B l0 _$ T$ z3 D2 b+ _5 Y6 Q
uint32_t chId = 0;
" h3 Q6 s6 H- O( d. }
uint32_t tcc = 0;
2 T" G0 a" O- _! W! n- x; h
?, J0 a% O$ c# @
print2arm("edma3 driver init...",0);
. c9 |0 |! x" `: R# e' `
& @3 }9 r4 d& y4 S' C- V9 d* v# `
hEdma = edma3init(0,&result);
) L% b. I' T1 i: y2 D
if(hEdma)
$ |% s- h0 V# s' w1 s
{
; \8 w( h7 g. e8 E; I# U5 G. Y
print2arm("edma3init() Passed.",0);
: o: x# G3 O" w5 j% Y7 g; g+ A! X
}
/ Z& X9 V! S2 z
else
( j+ Q4 l! c( @( o
{
/ w6 f# X6 p3 _: @4 e9 }5 `) N1 q( }
print2arm("edma3init() Failed.",0);
! V0 O1 v. e/ h! v+ `1 L' }$ O6 P
}
- v$ u6 ?- X5 R
. o2 c' O0 q9 y$ z6 Z
if (result == EDMA3_DRV_SOK)
7 D8 c( ] P G6 h1 `
{
. p; }7 z4 t% U+ d
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
2 u4 u' A2 s0 U4 z, k# S
(EDMA3_RM_EventQueue)0,
, U8 Y+ V9 g3 A' S8 B
&edma3_isr, NULL);
9 G+ x; F) Z N" g, D* Q7 I& X" j
}
1 o1 _0 R) T/ B2 s' j
( J& l1 {3 G) f H
if(result == EDMA3_DRV_SOK)
, J& a, f0 n, ~
{
% K4 X- z0 U/ ~0 a ?1 S# r; O( ~
paramSet.srcBIdx = 0;
0 _6 a0 R# {6 G8 o( r4 B" i( K( D
paramSet.destBIdx = 1;
. o5 T8 E" H2 X! g5 r" p/ a
paramSet.srcCIdx = 0;
: d5 E4 R1 w, j# U6 h7 U8 {2 K
paramSet.destCIdx = 0;
9 V- _: Q+ C' ^8 u
paramSet.aCnt = PING_PONG_ACNT;
3 Q2 u, R; H! I# l
paramSet.bCnt = PING_PONG_BCNT;
7 [6 D# M) D& a1 V' j% N: `
paramSet.cCnt = PING_PONG_CCNT;
' v* i% n* F( q1 f s! [
& Y v; b. c% T
/* For AB-synchronized transfers, BCNTRLD is not used. */
8 x$ y& P% ^) x7 a" r h& C+ G, _
paramSet.bCntReload = PING_PONG_BCNT;
. b; ~" J1 H7 e- |" P) x6 {- R
2 f$ J3 B# Q( b/ f8 u
/* Src in constant mode Dest in INCR modes */
- d/ L$ p. V8 c! }5 ?* W
paramSet.opt &= 0xFFFFFFFDu;
- ] @2 K% V8 p2 z* {$ C
//paramSet.opt &= 0xFFFFFFFCu;
; O- V/ T4 Y0 J" P( o5 D$ K
' M7 {; m# A, ]6 E
/* Program the TCC */
$ ~* r- [3 _# i
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
# C8 p6 n$ o+ G G- R F
1 q, ~0 w! `: d, k; Y
/* Enable Intermediate & Final transfer completion interrupt */
* V2 U/ Q2 ^: H
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
; R- Z0 C+ S8 d( q3 D
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
( |+ L6 N6 K: Z8 w) a# v% K
) w% C4 }; C" E: p$ v
/* AB Sync Transfer Mode */
# T" [1 K( _* c/ T U
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
: n+ W, h% s; l. @$ Z' v1 t) [
O8 T4 X5 D& R Y6 w) z& }; n
/* Program the source and dest addresses for master DMA channel */
- b" a, g. H# ~6 @9 b$ F
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
8 i: d0 D# [" h' m
paramSet.destAddr = (uint32_t)(ping_buffer);
, ~5 ?; {0 y2 r: u
H' j2 J7 Y, I0 g; _0 T4 a* N
/* Write to the master DMA channel first. */
7 e, [0 `! M6 s7 s
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
! s3 A4 z& F0 @9 O' c
}
" L' q- a0 k* t0 l1 {1 F4 L$ b4 o
% W) E/ S: G! V6 o7 d6 W- n
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
( E( a4 h/ x, d- o
" N f& q! Z4 N `1 Y
if(result == EDMA3_DRV_SOK)
2 `; g# ~2 G' E4 V
{
6 U6 S( H: x: m% v6 t6 P
print2arm("edma3 driver init success.",0);
: L D9 {1 A6 s: c- ]/ {! u. d1 D
}
8 ^" E; t- S* z( i
}
: m* k2 P% k+ p
# t, y8 i s4 g* w' C d' e% Z
1 c7 y1 P: j4 n& \9 t. @: h9 b
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
$ O* }# V/ b$ A# f* D% S
% z V, {5 @; E; F4 a8 b! @) t
_' u& x% Y2 K8 I" Z( m: Z
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
; H( {! T1 V3 k( s0 `# M( D
每次DMA传输完成后都要再次使能传输
% t( m2 G. ~0 i f0 i! a3 ?5 H
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4