嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
; U2 j7 w# T9 S
#define PING_PONG_ACNT 1
# B3 x+ M$ |! q3 p8 z, ?
#define PING_PONG_BCNT 8*32*40
' L P: z& K1 P" A3 ~8 m
//#define PING_PONG_BCNT 1
1 M5 T$ o, a3 F8 |% U. L
#define PING_PONG_CCNT 1
. ^2 r. Q, W- h. z. q1 ~
#define MCASP_BASEADDR 0x01D00000
% H# U1 ` l. `4 ?' G
#define Mcasp_RXEVENTQUE (0u)
0 e: `9 D" ?- H$ E1 g/ L
i0 \- ]0 d A! Y" q+ X
/* OPT Field specific defines */
j5 z! \! ^! X% F% k
#define OPT_SYNCDIM_SHIFT (0x00000002u)
' } H9 j N, B
#define OPT_TCC_MASK (0x0003F000u)
# ]2 E; r% E$ x5 G* D
#define OPT_TCC_SHIFT (0x0000000Cu)
: D6 _* }5 I" n4 Z1 Z7 b
#define OPT_ITCINTEN_SHIFT (0x00000015u)
v; D5 G2 Y6 ~. x
#define OPT_TCINTEN_SHIFT (0x00000014u)
( g- l4 r, H. O+ V5 t8 E
9 o; E# g3 q, u. ]+ A7 m- r
char ping_buffer[PING_PONG_BCNT];
0 x/ k0 s$ |: B; h) P' D
char pong_buffer[PING_PONG_BCNT];
: H( X3 z( z" l* m" O' i8 a
% L) d5 `0 d* I1 G- I9 w1 Z# A' L
8 B. \+ t: d: H6 F1 t" H' w/ o
+ }) o% p3 P) B {( D) Y9 E$ T9 z: T
4 n! i/ x/ Z3 H; d: T
static void ys_edma3_init()
+ I. @0 `" h9 `8 e$ ?/ O/ {
{
0 l5 n0 j( O5 l% A" j# _8 z; N
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
/ R: ]8 i; k+ ?/ _! w/ q) H; @
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
6 T0 c# l% O. y
EDMA3_DRV_Handle hEdma;
# }) c4 a. z& m, [1 t% F! I
uint32_t chId = 0;
, z z2 l* f. V9 h$ c1 i$ c" o! {
uint32_t tcc = 0;
; T N8 H" Q6 H) k
% C2 ~0 j, p4 R" |- l! K8 q
print2arm("edma3 driver init...",0);
4 R' E# ]$ Z: K3 S* ?' X6 l
4 |3 @8 }# F5 E8 ?" o5 g. r# _ E1 A
hEdma = edma3init(0,&result);
' K* q( A' ?! X! |
if(hEdma)
, O# X0 Z+ L5 u. R% J5 c
{
, B( t6 K# @* _) ]
print2arm("edma3init() Passed.",0);
! H) ~0 S9 k3 F/ A' ^
}
, f* j5 k4 f6 I( @0 ?6 E! `& ~
else
8 W& {: m' h% O4 u& z3 [
{
! H: y7 O$ m0 q( a7 c6 p* q4 G
print2arm("edma3init() Failed.",0);
- E2 U0 D1 K# }" p3 t7 }
}
7 X; ?) u) ^7 f5 Q, ?
9 D( c4 V4 c( J& D; \: C
if (result == EDMA3_DRV_SOK)
# S. J8 A* j' A5 z$ D7 M$ D
{
/ \. j9 g: i8 e8 H+ K- S# M
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
D* z# I1 k$ E, ?& r
(EDMA3_RM_EventQueue)0,
3 }$ {% {* }) r) L3 @
&edma3_isr, NULL);
1 C& x4 t0 b3 K( ?1 R
}
; L) l9 ^9 u: K! P" I) b; ~
2 `2 t+ N0 c' X$ |
if(result == EDMA3_DRV_SOK)
: R$ Z+ B# {; R
{
: t! d% v( a7 r) W8 }! p
paramSet.srcBIdx = 0;
! W5 g4 F% N6 h/ ^) c5 q
paramSet.destBIdx = 1;
% c, r( a: |, X. x
paramSet.srcCIdx = 0;
8 Y& y4 ?# B! k5 k8 P
paramSet.destCIdx = 0;
( S' u, G& Z! @# d
paramSet.aCnt = PING_PONG_ACNT;
5 ?) a j5 F' r4 @
paramSet.bCnt = PING_PONG_BCNT;
0 j& f& u' e& F2 K+ K: G, h e
paramSet.cCnt = PING_PONG_CCNT;
/ r8 v$ `" Z* j9 B4 d8 ]) ]
2 n1 [, D3 a# F
/* For AB-synchronized transfers, BCNTRLD is not used. */
3 k1 w( Z8 x% C3 p4 @( u% C# k ?, n
paramSet.bCntReload = PING_PONG_BCNT;
! o7 e' Q" A' c8 f
6 `) |3 s4 D8 B+ U! H3 E% O
/* Src in constant mode Dest in INCR modes */
* T0 F: x# t9 y+ a! ^( y
paramSet.opt &= 0xFFFFFFFDu;
( P5 F' _! y# S
//paramSet.opt &= 0xFFFFFFFCu;
7 x2 v+ ^; w* G0 M5 j1 Y o1 F
! g5 |' W9 k1 U; x9 v$ s
/* Program the TCC */
/ F+ k' ^- z/ J$ C m( Y- ?5 t
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
/ f: q( Y& u: n# N9 l5 y) j
: ]: x9 \( s4 U( I7 i. P. D
/* Enable Intermediate & Final transfer completion interrupt */
3 } Q6 u3 `* E/ C1 G) b
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
; T1 z, B3 ]7 z. L- p6 _6 R5 M/ n
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
2 Q! e# d3 y0 B* {) M3 c. S! `
0 L6 \) M1 x+ K8 R' W% i5 A q
/* AB Sync Transfer Mode */
/ f, c" r# |+ @3 L
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
! N8 l( w, M; ^& C
1 O1 c5 n7 B# v* r
/* Program the source and dest addresses for master DMA channel */
" P7 W& |; M5 b) J" e, `6 a
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
+ `/ g* O5 B$ u% N
paramSet.destAddr = (uint32_t)(ping_buffer);
1 G8 n5 y( }7 b" } }# I7 Z+ C
9 V7 O) T* \4 J. w
/* Write to the master DMA channel first. */
8 }* g' r( l+ d: I6 Y
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
! u$ i U0 l4 ~8 Q7 a) v% B1 N
}
) z6 B! ]' @ p, f* [( H9 E
' @! W( ~: g. ?5 i
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
5 u' Y5 v7 |. d9 A( B. S$ y
- R4 ]% [7 ^" C. b
if(result == EDMA3_DRV_SOK)
* z# _1 T" D+ W2 [6 N
{
+ \ S# i. W/ k
print2arm("edma3 driver init success.",0);
& K( s! y. q# F; H4 K; I/ W1 k% [
}
) C5 B4 k7 P0 h$ C4 }8 _, U
}
: p6 b/ Y& Q! H
% O* N% K7 A: c1 f
# ^6 }) q- L6 ~& s# ]$ j8 T/ e
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
6 c0 Z4 l! \+ a& S
4 o: |4 @# U& i! P2 s
- Y1 J4 l: S, I8 R. [1 V% b3 Q
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
, V! `8 V3 L; f+ n, q% z
每次DMA传输完成后都要再次使能传输
1 a& J8 F& z$ S& z) d
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4