嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
% z7 J, u4 _' Q8 Y& p
#define PING_PONG_ACNT 1
+ a/ t# `. ]! m
#define PING_PONG_BCNT 8*32*40
+ m6 ^. k$ {! j6 X% ]# u C
//#define PING_PONG_BCNT 1
$ m' H3 ~# N, M w% Y. t: {- x
#define PING_PONG_CCNT 1
& d7 x7 U( e1 h/ u
#define MCASP_BASEADDR 0x01D00000
4 v' i1 P$ P% G4 @; Q6 ]
#define Mcasp_RXEVENTQUE (0u)
# V; c" o, v/ [/ x$ q- ]) s" \- O
* H1 i i/ i) R, Q" Y
/* OPT Field specific defines */
5 h: l7 @' q5 i, \- t# q
#define OPT_SYNCDIM_SHIFT (0x00000002u)
' g! z: N* U/ F, X( O- J
#define OPT_TCC_MASK (0x0003F000u)
" x0 |! C; L6 S5 ?3 r9 H
#define OPT_TCC_SHIFT (0x0000000Cu)
3 `6 k0 P( m4 v# x6 n
#define OPT_ITCINTEN_SHIFT (0x00000015u)
1 K# x" N3 b- ~( t
#define OPT_TCINTEN_SHIFT (0x00000014u)
6 D: P& o: R& I! T' E7 ~
k! [4 ]9 X; q# v: T
char ping_buffer[PING_PONG_BCNT];
4 v, i" V( E- J) r. A# T4 O! |1 k
char pong_buffer[PING_PONG_BCNT];
; N0 e+ v5 n7 N8 Y, E* ?, n
9 A o7 A# h* @( F
3 E# F+ _# J [
- t2 J) f9 u. X i
+ A& v9 ^9 @0 E7 T
static void ys_edma3_init()
. `, [3 T9 Z. e4 w% a' w; W" }
{
4 z2 C# Z0 T' T4 T* h( v0 ^9 |9 m
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
x3 H8 U W; [
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
; P. j4 Z% G' U3 ^+ ~9 U
EDMA3_DRV_Handle hEdma;
( p) [2 T' B5 t8 E3 {. Y; X- k
uint32_t chId = 0;
1 I- y: }& x& m9 w' q2 x
uint32_t tcc = 0;
2 F# [! \" N1 E; z0 K5 |
% s6 [) u' |% P* L$ J8 l
print2arm("edma3 driver init...",0);
5 w6 ~( p! Z6 d! s: ]
1 v0 X1 U+ W/ W$ D
hEdma = edma3init(0,&result);
; |9 |( B$ `- l- ]5 z; k
if(hEdma)
* T4 G9 I" v1 }( O
{
* W: K' Z1 ^# [. w7 h, x
print2arm("edma3init() Passed.",0);
- ~. R* V# C& v4 g ^" O# s% Z
}
' r0 J7 V0 L% n$ ]1 D
else
" `8 h8 @% E7 r6 M9 ?% I
{
2 u/ b, D2 b4 m) U7 }, ~! [
print2arm("edma3init() Failed.",0);
- K+ j k* [4 ]$ P" \; K
}
0 |6 S) f2 e3 n& y& u8 o& S
0 ]0 {) _! u/ ~+ @: o f
if (result == EDMA3_DRV_SOK)
! W+ f, w5 k! L% u
{
* e* u' i3 y" Z3 ]
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
( P2 J7 j+ Y& b6 ?$ s7 w
(EDMA3_RM_EventQueue)0,
/ f1 l9 @" I9 e/ V% t
&edma3_isr, NULL);
. c3 X1 l% v( Y: w+ L1 i, {; ^
}
1 ^& h3 w8 L" e4 J
: G0 y7 J/ z0 e. d
if(result == EDMA3_DRV_SOK)
4 [2 x2 [$ m8 Y# {+ |0 S0 `" Q6 n
{
/ x: K' k- T& I4 c0 {/ n& R- N5 |
paramSet.srcBIdx = 0;
$ T z' o4 ]6 h! v9 p" l
paramSet.destBIdx = 1;
* t" ^7 G$ b) O
paramSet.srcCIdx = 0;
! K b* n- q. j5 Q
paramSet.destCIdx = 0;
8 p7 @1 G; V5 n/ Z. c0 A) ?
paramSet.aCnt = PING_PONG_ACNT;
8 g% T7 y+ N2 [) U
paramSet.bCnt = PING_PONG_BCNT;
: C% h7 D$ q1 @2 a
paramSet.cCnt = PING_PONG_CCNT;
' I) y$ l1 L1 F6 }
1 m2 [) I# b/ `
/* For AB-synchronized transfers, BCNTRLD is not used. */
# `; | p0 z" ?* V
paramSet.bCntReload = PING_PONG_BCNT;
6 ~0 ]$ Y7 I+ @: C \' k: _& [5 ]
8 `. t/ r1 z7 R$ j8 o
/* Src in constant mode Dest in INCR modes */
3 \; O* t8 N! Y3 _% Y
paramSet.opt &= 0xFFFFFFFDu;
# z# d+ |/ t: o7 u M4 V
//paramSet.opt &= 0xFFFFFFFCu;
5 Y5 J8 q3 h- p8 K3 I& z3 }
' M0 j/ U$ V! \' f- \
/* Program the TCC */
- i+ s, K$ g2 f) ~& L+ T
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
+ t4 L3 O5 q1 q7 A% J
) [8 I/ h5 z) E3 R7 ?" F2 j
/* Enable Intermediate & Final transfer completion interrupt */
' |, `: I4 ?) M
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
, F4 J+ S& Q# N8 z5 O( C# k
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
& O }- s0 U: V& R+ R4 v* @- @1 a
8 G7 }- n/ m- X% k
/* AB Sync Transfer Mode */
# ?1 K6 v* Z: `7 R r4 D, [
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
. w8 y% t( L" y$ p/ E; L# E
/ G% H. L* K; }4 w( ]
/* Program the source and dest addresses for master DMA channel */
S) g3 Q6 l$ a1 _3 T
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
( g2 c- \4 T4 S2 `2 T3 }! O
paramSet.destAddr = (uint32_t)(ping_buffer);
$ j D8 Y8 M1 i1 x% R; o* T
; R1 V$ r# y! {3 `* @
/* Write to the master DMA channel first. */
( B+ Z$ X0 D4 {: t( d
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
& P' k) H6 n0 A" P }# B
}
' z; z: `( Z' I: V( o* J4 V
9 {. X9 [1 a* V
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. K) U$ {6 ~! O* U* u: i
5 X0 ~- N; X/ O8 d6 t5 m
if(result == EDMA3_DRV_SOK)
# n. u! a; ~# m% ]! M* g" i
{
& k+ Q( k% y6 ^! d% V. T
print2arm("edma3 driver init success.",0);
1 j+ Q |# c' b) D9 y
}
2 y4 q# ~4 T8 n
}
/ C0 ?# l1 f9 S7 F
) k0 K$ B1 B! b* u+ O
# f/ v' ?: E" d
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
3 }- ~, N7 P; T2 X6 `9 C" n, j
/ l# Y3 _ Q# ]# _2 j
0 H! r) ~% h& u7 f& S' C" Y+ T
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
/ B* J4 }3 c$ Y1 N S G
每次DMA传输完成后都要再次使能传输
( @& Z. A, Z8 e2 v# \: T% O8 J
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4