嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
$ F, R- P) r* a | F# I1 v5 _5 p
#define PING_PONG_ACNT 1
6 Y; X3 _. T3 C c ~- d* t9 T9 L/ B* _
#define PING_PONG_BCNT 8*32*40
" H5 q* c5 V2 Q1 n! R
//#define PING_PONG_BCNT 1
5 c9 y* O: k/ N* I3 a* }
#define PING_PONG_CCNT 1
, u: o5 t3 g# [5 L4 V: ?# b
#define MCASP_BASEADDR 0x01D00000
# Z0 _4 Z, i9 {2 z3 `9 E
#define Mcasp_RXEVENTQUE (0u)
- C% c: O8 f* \7 U+ Y" q! _3 `3 }
9 B- V+ ~5 ]! _7 e; ^# f, m( Q
/* OPT Field specific defines */
$ N+ U0 v# r6 @1 T5 s
#define OPT_SYNCDIM_SHIFT (0x00000002u)
/ ^) F( P1 l8 g" ?6 n( }$ N
#define OPT_TCC_MASK (0x0003F000u)
- \& m( G# N4 x6 K" K
#define OPT_TCC_SHIFT (0x0000000Cu)
+ H" A5 \2 s, u2 z6 E2 a! u
#define OPT_ITCINTEN_SHIFT (0x00000015u)
7 ]# e7 C" O- S
#define OPT_TCINTEN_SHIFT (0x00000014u)
3 F! c, f" n! l' X" O7 y* x
9 Q% p6 o# e. Y2 S8 q' ?
char ping_buffer[PING_PONG_BCNT];
* k% R. J- y" \" K0 g
char pong_buffer[PING_PONG_BCNT];
0 z0 Z6 X* t% K" R2 O$ |' t3 F* h
/ J" ?' d& K2 x$ R \
$ E: t0 O9 i4 o# `+ r; [& h
0 B; i+ C; X: l6 ~* P" A
+ W# C' Y3 p4 E% [' y. D
static void ys_edma3_init()
7 n4 C6 h1 _6 S" a: R- P
{
, Z) w4 o, u. p6 v
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
2 v4 ?; d! n* X0 X
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
. d! Y/ v3 T& J3 X
EDMA3_DRV_Handle hEdma;
6 r+ a8 M( Y, O1 B9 y3 c; h: {' s
uint32_t chId = 0;
8 P3 U8 \6 O; S* K9 p5 L0 S
uint32_t tcc = 0;
, Q/ _/ R3 z; ?; f! C
6 G- v" q6 Z# h! ?2 \
print2arm("edma3 driver init...",0);
" D, U$ c: V$ ~
7 K: U- u! b% A) \+ S
hEdma = edma3init(0,&result);
8 f. N4 p; U D) F
if(hEdma)
1 _7 X7 O- }' ]) `- V! y5 A* O
{
$ J; U( I! B1 d4 y2 Y; J9 Z9 R& q
print2arm("edma3init() Passed.",0);
3 j, y+ o) L+ q
}
) a$ C6 w5 U5 E' n8 d$ S% |
else
& T3 M. d. c8 M' o: y
{
T. Z3 e$ B$ F: f3 M: I
print2arm("edma3init() Failed.",0);
+ d7 D) a9 H" ?# Z* n3 p) D
}
, U8 K0 T" x9 s2 D+ s
2 Y& b' C$ m* {; I1 d2 H
if (result == EDMA3_DRV_SOK)
, K- s& v$ X0 w2 R. [
{
1 [. v1 T5 ~' ~6 n% B0 Z4 q. R
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
/ R+ b8 R8 ^5 j' G( `* ~
(EDMA3_RM_EventQueue)0,
! z8 q4 ]5 r1 V5 |( W" v# _
&edma3_isr, NULL);
* ^! a3 k4 S& x& A3 Z0 x; t
}
; H4 Y* d+ E& O- Q. R
8 G8 s" g' }" }2 H
if(result == EDMA3_DRV_SOK)
1 H" L' t; q( i; X! } k$ n% P
{
* H$ Y* F* [" p# }3 e) y
paramSet.srcBIdx = 0;
3 w' ]5 O, A- r( e2 v2 C5 P9 S
paramSet.destBIdx = 1;
- I) A3 R. \! n' {) D- f
paramSet.srcCIdx = 0;
3 G U( {+ |( M: p( A
paramSet.destCIdx = 0;
! F% A B' ~, c
paramSet.aCnt = PING_PONG_ACNT;
' _2 o5 T0 ]! Q# e$ Y' Q
paramSet.bCnt = PING_PONG_BCNT;
( s( m- I' V2 `8 P# i4 X: D
paramSet.cCnt = PING_PONG_CCNT;
( {, |; U3 M6 t! u+ ], G
4 y6 r; e A0 l7 m) L9 S
/* For AB-synchronized transfers, BCNTRLD is not used. */
- S& h9 X" b6 B8 L
paramSet.bCntReload = PING_PONG_BCNT;
0 o7 }3 Z6 |* ~% i
' f1 J" ]: P# ]' ]
/* Src in constant mode Dest in INCR modes */
; v d0 @& [& F' A- D
paramSet.opt &= 0xFFFFFFFDu;
+ E9 G& U' [1 n+ T B5 Z
//paramSet.opt &= 0xFFFFFFFCu;
# y7 K# N/ B& T- Y( E: k
1 k. ]! j; g5 J( h# j
/* Program the TCC */
- S% v; D( w' e$ u1 b( _
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
7 e' L; }+ b5 B! \ D5 y
* r) S" R( [1 ]* y. a/ l
/* Enable Intermediate & Final transfer completion interrupt */
' l4 U' o, v. C! @: t0 x1 r; F4 _: E
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
/ {2 R9 O" U( d2 j" r* q7 F( Q
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
$ V# b* R! k# `4 N4 Q# P
, S7 h9 V5 @8 \. i7 J: _1 O3 `
/* AB Sync Transfer Mode */
# v" M3 q0 w6 y
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
! O' k1 T1 G- R$ c2 C) u- N9 c
- [& t# b- f! I5 w
/* Program the source and dest addresses for master DMA channel */
- P+ G1 Z5 F# J9 ]6 ]% a" N0 G
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
6 ^* E0 v; M) O4 s6 _2 {
paramSet.destAddr = (uint32_t)(ping_buffer);
$ f( h, D9 X' x
$ I! m( Q; w) X% T" Q
/* Write to the master DMA channel first. */
. j0 P5 q Y! ~( R( L
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
4 k# Z6 w! q* C$ B# T4 Z
}
! V( M6 D( s& `( |. i+ Z% L" ]
" G8 ~$ `4 N0 @
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
/ w, q" V: @6 ]( A: O4 h- V* Z6 D2 X
( C( g& }4 ~3 H; ~
if(result == EDMA3_DRV_SOK)
9 @. g5 Q0 U" z& C
{
9 M2 I0 s* {7 v$ N1 ?; c
print2arm("edma3 driver init success.",0);
7 W+ K! p" G" a- U! n) ^
}
3 W! L- L( E5 ~- ^5 F
}
+ ^) k6 e! a, ~4 U ?
- p: Q' Y( ?0 P6 _( D3 T
" B& L' ]7 |0 P* [9 x/ F" K: L
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
' _/ j6 ~* b4 B6 e* i/ n
% D8 s. u) D% P
K7 y. |6 a1 ~
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
+ J* z& |6 ]& s$ ~" f) P8 @
每次DMA传输完成后都要再次使能传输
3 ]* g9 }% Z5 B: B! q% C
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4