嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
& k$ I) R- L2 a2 v g
#define PING_PONG_ACNT 1
. u1 ^$ J7 s% Y# \
#define PING_PONG_BCNT 8*32*40
! r, y) R: D7 X& @
//#define PING_PONG_BCNT 1
; d# y. T) H5 J9 y+ a, Y
#define PING_PONG_CCNT 1
, `6 Z9 u% b) O' j
#define MCASP_BASEADDR 0x01D00000
4 b5 @: n T) k" Z
#define Mcasp_RXEVENTQUE (0u)
0 L, Q0 g2 z$ Y
" u* v5 ^4 F2 f+ ~3 u7 u% A
/* OPT Field specific defines */
, B% N5 r; ]) b. k( \% x! j
#define OPT_SYNCDIM_SHIFT (0x00000002u)
~/ m+ O0 b, v' Q4 i# x# b
#define OPT_TCC_MASK (0x0003F000u)
1 X7 I, y) ?1 h% d
#define OPT_TCC_SHIFT (0x0000000Cu)
: T" j7 x) f4 f: H" L
#define OPT_ITCINTEN_SHIFT (0x00000015u)
i# A0 j x: U# |9 z" _7 K; ~
#define OPT_TCINTEN_SHIFT (0x00000014u)
( k/ s# c$ X# z" @8 O
) {! J& y& ~) k i- l! j
char ping_buffer[PING_PONG_BCNT];
; f% T Y* r/ [# C& i
char pong_buffer[PING_PONG_BCNT];
; X8 U1 j: _) I" o/ N; C) F
; n; T& V+ u' t9 t! u+ b
8 n' o1 ]- Q* W0 R+ S+ j
) l: H6 s; \/ Z) N* o+ n
4 o9 h( v; S3 ^$ }# f
static void ys_edma3_init()
9 \' ?4 @+ J7 I5 ^" X1 Q
{
; A7 m( k p) }
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
8 g1 A" h2 T; x$ L+ | T# T
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
# j" U; j' f" z+ u2 [+ l
EDMA3_DRV_Handle hEdma;
x: p" z) l$ X. u4 q
uint32_t chId = 0;
. g; g* O, t: A# D% b2 p X Z$ D
uint32_t tcc = 0;
! @/ u+ U2 _. |% y( {3 `# B
- Y0 a: ^1 p7 m' t' X. j; D
print2arm("edma3 driver init...",0);
) }$ X/ W( t/ u. s
: P* f; c6 }& |: u4 ?* E
hEdma = edma3init(0,&result);
* {( V& H6 ^6 U1 u$ t9 P
if(hEdma)
4 x- l6 j; s6 e! x8 v" ~
{
) e% Z4 F9 y* h& _! o
print2arm("edma3init() Passed.",0);
. B! `5 r! ]! b6 j. `( f! q
}
; f# W' s' Y# t: I7 F) v2 t* {
else
4 z8 J9 e2 u! {$ F5 i$ W9 K! O
{
; J8 f5 q/ ^. y! s9 N# I1 p5 A+ i
print2arm("edma3init() Failed.",0);
8 S9 K t5 Y% y d
}
# e. a; ~" L9 ^# H" h) T
6 M6 P$ i5 [+ U+ v
if (result == EDMA3_DRV_SOK)
9 A2 k# }) g3 P( C, u
{
! l6 Q: d0 f( v* V" k% I" L
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
7 P% F" p+ H* {/ }
(EDMA3_RM_EventQueue)0,
9 W: E4 R9 u, a
&edma3_isr, NULL);
9 v( e4 X O7 |/ I3 U7 V: I8 Z
}
$ W/ e( ~! @0 l4 X/ @# F6 F. A
: }, c/ }+ J' k+ x
if(result == EDMA3_DRV_SOK)
; D( T& s G: j5 z x% e
{
7 o; ^8 V5 k1 ~
paramSet.srcBIdx = 0;
: n7 {% I: Y# w6 P2 h' U0 A
paramSet.destBIdx = 1;
" k' e! F, }0 E. j1 a3 h3 R
paramSet.srcCIdx = 0;
1 Q# w' ^6 ~1 w9 w$ W) s& I0 M
paramSet.destCIdx = 0;
% C3 R$ h; F' R) `) p
paramSet.aCnt = PING_PONG_ACNT;
3 W% N% N" C0 T7 g( q/ B0 x: v' A
paramSet.bCnt = PING_PONG_BCNT;
% I9 I+ e8 K4 k& z" F
paramSet.cCnt = PING_PONG_CCNT;
, _, R5 N- r- q
6 p! B' F$ K; W
/* For AB-synchronized transfers, BCNTRLD is not used. */
3 C+ J$ Z* S( |6 s7 O% N
paramSet.bCntReload = PING_PONG_BCNT;
8 @' e% o* q# y
9 P* X/ {7 ^3 c. | ]+ [
/* Src in constant mode Dest in INCR modes */
2 k& T( E# N# g; d
paramSet.opt &= 0xFFFFFFFDu;
& {0 G: O# r3 M- R# n1 h! @( D
//paramSet.opt &= 0xFFFFFFFCu;
/ e+ G; K7 l1 {+ v
! q' _! O3 O+ S% J2 u: P
/* Program the TCC */
) h/ Q* M3 Z' C4 P( L1 q
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
, A, A- U# l" S! Y' w% J& G* T
1 W6 `) F; g3 }9 [9 `
/* Enable Intermediate & Final transfer completion interrupt */
: |4 J- ?- O* c$ K0 [; i
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
* [; _- F) o' U
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
& O0 ^" x! S+ k! r1 |* s8 f i
' @+ L( C2 B- t* M
/* AB Sync Transfer Mode */
& u- ]' _! [% R9 k: g
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
- b/ S8 [9 R3 Q/ |" x8 \" _
5 E2 X) L: h0 P. n
/* Program the source and dest addresses for master DMA channel */
" [* B+ W. f( `: e0 P$ ~
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
" B t. D5 V# S' Y0 ?. r0 H% O
paramSet.destAddr = (uint32_t)(ping_buffer);
8 D o8 Z7 W* E. [& v: V
" k) p6 p% T/ Z
/* Write to the master DMA channel first. */
: c7 T3 v& k- p& [
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
) r. j# F4 E$ z, s
}
1 y& H$ J8 i5 b+ G; l9 t# E
9 T/ f& d# [9 h2 m# d f" v6 ?
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
+ U; @4 S; Y/ H* \; U V
$ Z) M) j% O j7 R: F
if(result == EDMA3_DRV_SOK)
/ u/ r" H" l4 ]9 n$ f9 o
{
4 H- i; w$ X* O7 {
print2arm("edma3 driver init success.",0);
/ ^3 S. y( D, {% B) H8 i
}
7 l4 \. O5 ~+ P# z
}
+ L4 b! b7 T/ w4 x5 H- i$ I
8 \2 ]5 Q3 q9 n3 B) v' p
# g" C m, R8 \: P0 g2 T5 Y
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
/ \) b9 s8 L/ I1 M
+ S) @- Q, X2 Y- l
! r9 d! q6 g) d( e& O; S7 Y* g. \5 A3 A
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
( v) k) J& O" M1 f- r
每次DMA传输完成后都要再次使能传输
! o8 P" ~! b2 q0 i6 I( C. |8 t
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4