嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
8 V/ W8 c: b" c$ }
#define PING_PONG_ACNT 1
+ Q5 j( `9 D; ~ T3 ?
#define PING_PONG_BCNT 8*32*40
' Q! p( ]! l6 @7 F( ~; P
//#define PING_PONG_BCNT 1
9 Y6 D5 X; u2 R* j" A
#define PING_PONG_CCNT 1
) ~* z9 t. ]( d" `
#define MCASP_BASEADDR 0x01D00000
3 `# ?; u- E6 a
#define Mcasp_RXEVENTQUE (0u)
% o) f `9 r# H' v( s: F+ {
! B0 `1 J5 s6 y, e2 _; P5 s& V* Q
/* OPT Field specific defines */
' K% e5 o: q& v$ ]
#define OPT_SYNCDIM_SHIFT (0x00000002u)
4 a7 v# K" [: t0 ?2 J" D" O
#define OPT_TCC_MASK (0x0003F000u)
2 T7 `9 M/ f: e( i
#define OPT_TCC_SHIFT (0x0000000Cu)
" X2 k* l3 T. |2 w. @ _
#define OPT_ITCINTEN_SHIFT (0x00000015u)
; i" B% Y; [5 ^: t0 N# P1 w+ ?5 @
#define OPT_TCINTEN_SHIFT (0x00000014u)
4 W$ H/ m- B# r9 L M8 E
6 Z$ L# s" f; h0 i; A b0 X
char ping_buffer[PING_PONG_BCNT];
$ p4 |0 J5 k# B' I. E
char pong_buffer[PING_PONG_BCNT];
. j$ b: y+ p* x- h
& h1 c/ {6 R. c
* I$ a5 {( s) h" S
5 R7 E1 r$ f- ~, L- j; W
6 C |; Z9 a; c$ V. Z \& n9 L
static void ys_edma3_init()
, P l$ P7 _& R- \
{
3 q- ?$ B- k& w# Y! S0 r
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
' H( F4 C7 w8 V% Y& z: ~
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
J4 ]$ n/ `$ L6 z
EDMA3_DRV_Handle hEdma;
8 R( ]3 [& G' c7 C8 W T% i
uint32_t chId = 0;
# C: A8 X8 E- C h, ?- j* R( G
uint32_t tcc = 0;
: ?8 B- V* q( X. x8 i! Z. K1 v: y
3 S5 x' m$ _' O7 y7 ? H
print2arm("edma3 driver init...",0);
0 Y4 h+ f" \, U' j8 _/ I# d
0 O% R( J0 D+ D; K& s! _2 D
hEdma = edma3init(0,&result);
, T6 J3 c' p+ z8 W
if(hEdma)
* e2 S' l# |2 @- H; n/ J( e4 |- b+ [
{
- Z) Z1 F& [, @$ M
print2arm("edma3init() Passed.",0);
* B; G6 A' o% A" ~- G- y3 s
}
' b1 P" T% i) ~! B2 [
else
+ X D; R, K) J# s
{
2 b# {3 ~: z# y0 @7 H, O0 U
print2arm("edma3init() Failed.",0);
2 i0 j0 M8 M+ c6 f4 |/ m8 b% [0 S
}
! K( m5 o. S) n
; h/ R. E; Q' h& B
if (result == EDMA3_DRV_SOK)
6 W4 C8 O2 b) ]& W0 ]
{
8 z! V5 O, z3 L+ T" Q( O2 `
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
}2 i, M4 ] s* {* O2 z0 I/ ]
(EDMA3_RM_EventQueue)0,
0 y& k* d4 f' N2 _& w3 C
&edma3_isr, NULL);
9 s4 Z3 A( v8 O+ p! s8 o
}
1 `9 N0 Y: H7 ^7 ?4 W
; s9 a: c& s5 ]& Y9 l7 h) U' S
if(result == EDMA3_DRV_SOK)
: e* A" d6 B o, ^6 `
{
8 q* j# b, T) Y" G; P! F3 J
paramSet.srcBIdx = 0;
* y" w! M+ s4 F/ `; F
paramSet.destBIdx = 1;
S% H& V) L6 x% v5 c" d4 C
paramSet.srcCIdx = 0;
) ]8 A# L2 F% Q
paramSet.destCIdx = 0;
8 J9 L& p7 B) X0 F0 A5 v" _
paramSet.aCnt = PING_PONG_ACNT;
9 q! c! @2 W h* k; `
paramSet.bCnt = PING_PONG_BCNT;
) {* u: i& j/ }7 q6 n
paramSet.cCnt = PING_PONG_CCNT;
$ I: k1 i) {* a# E
9 c& U% e4 k, n0 K8 h4 X) I
/* For AB-synchronized transfers, BCNTRLD is not used. */
7 G. J; K) E! ?- y. S* K0 X S
paramSet.bCntReload = PING_PONG_BCNT;
+ v: M6 d9 ]/ s [3 Z8 I; r
+ }: K+ I Y& w1 b
/* Src in constant mode Dest in INCR modes */
% v& g9 ~. t; `0 \8 r2 I' \; T8 G
paramSet.opt &= 0xFFFFFFFDu;
! F) p' Q8 `: M9 ?: q
//paramSet.opt &= 0xFFFFFFFCu;
# M/ [# I7 d$ `5 J
0 @% G' _" D) ], q3 X5 B( d5 E
/* Program the TCC */
+ y5 c. T$ o: J2 K" E) \
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
; [- N& b2 \* m e5 {: m1 `
% ]9 f ~. O/ u# i1 t/ O7 y
/* Enable Intermediate & Final transfer completion interrupt */
5 {& {' A6 X# F( [2 L6 U5 \
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
+ \' L/ }2 r6 `- k3 m
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
- ^: d, d" F- W5 v$ `
+ g6 `; F% B9 m7 a& D
/* AB Sync Transfer Mode */
0 ~$ a* d7 {' o8 G, P4 ^
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
. X. K( P2 z( p
5 s3 g8 V0 y. w* d
/* Program the source and dest addresses for master DMA channel */
! c' b$ K8 _% e8 I4 K
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
% g; ^7 k) D, x0 x
paramSet.destAddr = (uint32_t)(ping_buffer);
* r% o b: l% X) E" I- D
3 q, Q% n6 z6 o- |8 T0 w6 a
/* Write to the master DMA channel first. */
# ]5 M" @0 O: G. s g
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
6 i6 L1 L' ~' A
}
4 m. E* q2 ^, _7 J- u
$ s7 J" f& a5 r4 K n
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
/ @0 ]0 J6 n" I+ Y
( r) S/ z& {) W0 h0 l, B4 l
if(result == EDMA3_DRV_SOK)
, t/ `. m8 S5 ]
{
2 L: B$ Y+ W% Z9 f+ Y. q, O
print2arm("edma3 driver init success.",0);
/ a( T$ d! \7 A3 D* m7 p3 R* w8 E/ k
}
" y. p! @; p( x
}
) e# z+ O( i) ~0 }9 f, l% T7 H
7 E0 d4 W9 n+ m, U/ B1 m
" o0 G4 \" ~/ h
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
6 M7 C4 }& u X$ U) S
n2 }" C( U9 ~) O( o# `% e% q6 G9 h
* e( g. M& m; d( p
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
/ i: K; |- p9 w8 S
每次DMA传输完成后都要再次使能传输
- H- B9 t4 P" n' Z5 O. A$ U
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4