嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
, F/ e, z' u% ?( Q
#define PING_PONG_ACNT 1
" z6 t5 L! h; ^' y
#define PING_PONG_BCNT 8*32*40
U3 u7 W: b6 v1 _; s9 p" E6 r$ \
//#define PING_PONG_BCNT 1
! ]" n0 m' |0 f. c: [$ N. G
#define PING_PONG_CCNT 1
2 r0 X! _* {/ T$ [2 ?! I+ `
#define MCASP_BASEADDR 0x01D00000
2 o0 o3 @- m+ N4 B# V8 J+ y/ X! w
#define Mcasp_RXEVENTQUE (0u)
, f+ N) Z( H4 r! q0 a, z6 W" r% O
5 P9 Z% Y: i6 H" Q
/* OPT Field specific defines */
( g6 Z- V1 ~" e% _9 {7 E3 B
#define OPT_SYNCDIM_SHIFT (0x00000002u)
& K7 N( V/ |' B4 c* e0 S' `
#define OPT_TCC_MASK (0x0003F000u)
+ t- j* b3 f! V8 x7 h& G
#define OPT_TCC_SHIFT (0x0000000Cu)
5 Q* }4 K) t* M, E% I% y
#define OPT_ITCINTEN_SHIFT (0x00000015u)
6 w" n$ ~6 G% I3 W* [4 |
#define OPT_TCINTEN_SHIFT (0x00000014u)
4 V3 }( u' I* S+ Y* B+ z/ c
6 x5 V* w% b8 {
char ping_buffer[PING_PONG_BCNT];
5 j2 b" S0 y. t* A) x
char pong_buffer[PING_PONG_BCNT];
* r! X+ A) z/ {; n4 p( s7 m" I
w5 Y/ d# h! R% V" \! k
. c( P' k6 S4 t3 l& G0 G" ` x
% R0 u) U0 U- |6 f5 W" e- T- V
# u# Y$ y. h7 b# N
static void ys_edma3_init()
* D: n' X5 J. B; K, j i
{
% V% C* h9 o1 v: l9 H
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
) D5 @, T9 x7 G0 N
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
3 W/ V9 h, r4 T V5 m! N" I3 m
EDMA3_DRV_Handle hEdma;
) g& K3 k5 M, @8 V. A. M, R3 W$ e3 o
uint32_t chId = 0;
1 W8 F0 X# N) Y1 Q; N r
uint32_t tcc = 0;
: G7 e% a# u/ t& O8 M' ], l
- x6 \% h0 k: ?4 E0 T9 l" k0 C
print2arm("edma3 driver init...",0);
" D3 K/ V+ q% M1 W
, F6 N4 ]2 @4 L" ~; u
hEdma = edma3init(0,&result);
2 o( [% }0 F' I; U0 t
if(hEdma)
2 p; N8 _1 b; s$ {0 j
{
& u; ?/ C$ L) V+ D. K Y
print2arm("edma3init() Passed.",0);
% W/ H' s1 n0 Y2 [0 I3 @& i' j& X3 {
}
/ S& p( B$ ^. y# S, N
else
5 Y7 w4 H6 T/ Y4 \3 ^$ d
{
* Q$ i# Z2 j9 Y. b# R& O: }" ~
print2arm("edma3init() Failed.",0);
3 F A! w% m/ N2 t, A( N
}
@2 E: T4 z6 J4 Q2 H
; p+ z. F) ?) a" w+ O$ v: p$ L
if (result == EDMA3_DRV_SOK)
& r* O7 K6 ?* Y7 s1 y, g
{
0 r$ Y4 D6 Y P4 g. F; ^) D
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
; A' S+ j9 \/ H# L: ]8 H+ o
(EDMA3_RM_EventQueue)0,
' u( X5 O6 w, X; h: l0 z4 B
&edma3_isr, NULL);
% O8 u8 L( l( t" |2 N
}
/ c; S8 Z4 g: D& D, x
/ A% l. }+ ~' W ^
if(result == EDMA3_DRV_SOK)
) Z- z2 |5 g2 ^( ]
{
- k, Z* U( z2 ^* U4 K8 v, X3 c
paramSet.srcBIdx = 0;
( T1 t7 _8 \. l: ?+ A( S8 w
paramSet.destBIdx = 1;
r+ W$ d, l9 V& ^ J
paramSet.srcCIdx = 0;
9 \& h/ J* O* V3 b6 R8 e
paramSet.destCIdx = 0;
4 X5 p \" p! D7 m3 ]
paramSet.aCnt = PING_PONG_ACNT;
" l9 l8 X& t5 | I* c0 B
paramSet.bCnt = PING_PONG_BCNT;
5 Q/ a+ z6 N7 O: W+ w* O' ~
paramSet.cCnt = PING_PONG_CCNT;
2 h1 x6 r' t/ n7 R: M i8 m8 Q' }
6 ^0 V9 R9 t" l/ Q# k$ ]. V+ H4 t
/* For AB-synchronized transfers, BCNTRLD is not used. */
( q* W6 M2 W% z6 d
paramSet.bCntReload = PING_PONG_BCNT;
9 }# c7 J/ Z! q( v& ~$ ?) T
+ g0 Q, o+ O8 J, @2 T; H
/* Src in constant mode Dest in INCR modes */
+ k0 F6 V/ e! H" s2 P, w) M/ p
paramSet.opt &= 0xFFFFFFFDu;
1 J1 ?7 V/ D1 a7 r6 L- b
//paramSet.opt &= 0xFFFFFFFCu;
9 A2 I$ o$ ]( n3 j( A
, o' k, Y' Q; S1 [
/* Program the TCC */
& R& }. r: t: x% N5 ~
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
! T8 C1 v) B1 I6 _! W* A
w& w+ Z* _: m5 F% j
/* Enable Intermediate & Final transfer completion interrupt */
% v9 e% f- c" @6 h9 j
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
* `% }' A7 ^2 L; J) P h
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
7 o) ?# W, |/ _1 O7 q4 [, i5 g4 ~
. r( f7 U) U( \
/* AB Sync Transfer Mode */
1 ?4 R. ~5 ]2 J; }" Y
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
9 I# k8 ~* X4 n' i3 ?
% ^% q! T& v1 F) G0 ?) `% B$ a* Z
/* Program the source and dest addresses for master DMA channel */
. x' ]0 M$ @, }% b0 Z3 Z/ \
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
7 E8 e2 P$ F7 V8 }
paramSet.destAddr = (uint32_t)(ping_buffer);
2 X; ^, f' c# R x* x' S
5 w2 o( Z) C" W9 j$ t1 G( a. U
/* Write to the master DMA channel first. */
6 d, {; G! e: o, F
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
7 t5 f+ W u* _" S1 m' X% h
}
! H5 R7 p" a a, |
" b$ p3 E; f% B! K& m/ {
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
, x- Z, s2 q: Z# C
, Q$ G3 H+ E8 C8 D5 U: Z: {, X
if(result == EDMA3_DRV_SOK)
, ^4 {9 l- K) g+ s+ w
{
* F4 N( c" V# P6 \
print2arm("edma3 driver init success.",0);
; f0 o! X1 U# r" t5 p- M; Q
}
2 X. {$ f1 Z+ p
}
- ]6 s# e! E q
* p2 B4 p" G3 S+ ~
* j4 }; o& j. d/ B6 A
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
, C4 O# }7 ], C2 n7 v! y1 d% X
: e+ e; `: f# d9 T) t
# [. |- A9 F; p/ O3 w
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
8 w6 I: T+ `$ E4 G
每次DMA传输完成后都要再次使能传输
% P Y: _5 }* |) D5 S, L. }, ?" g
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4