嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
% Z% ]2 ?( g- X* r6 ~" {
#define PING_PONG_ACNT 1
- l6 l B! M6 Q
#define PING_PONG_BCNT 8*32*40
* |0 e# H6 z# j
//#define PING_PONG_BCNT 1
& q' D& ^" i ~( O/ l% u" W
#define PING_PONG_CCNT 1
6 N2 y2 H }: i/ E3 w
#define MCASP_BASEADDR 0x01D00000
: W o# p. C- \' g8 v7 p& Q
#define Mcasp_RXEVENTQUE (0u)
; s) m8 o2 s5 S
+ I! l9 J, I* `
/* OPT Field specific defines */
8 B0 l" m" q7 P0 }, b" P
#define OPT_SYNCDIM_SHIFT (0x00000002u)
# g5 n2 Z8 f# x
#define OPT_TCC_MASK (0x0003F000u)
% |5 ~0 B- B+ {& J0 m. Q. K: I; [
#define OPT_TCC_SHIFT (0x0000000Cu)
' i8 N- ^. \5 ]5 d. e
#define OPT_ITCINTEN_SHIFT (0x00000015u)
& |. \+ z1 |. ~& j* f; i
#define OPT_TCINTEN_SHIFT (0x00000014u)
% A2 a/ N# e' x8 H
0 G. e; h% W+ a4 G
char ping_buffer[PING_PONG_BCNT];
0 b# L& x5 \( f% \) ?
char pong_buffer[PING_PONG_BCNT];
# M5 c- H# x: \# R* `1 l# Q; G
2 U E4 _ ?9 d( q* Q, H+ g4 H) [- F4 I
) s0 q: z- A3 r1 P; `
$ J/ M: O5 B6 k1 X6 s: \1 \+ f
# D2 C- k9 P5 r! o
static void ys_edma3_init()
5 N* _- R- |& F- D* a
{
4 R* ~/ L3 h- F, \4 s
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
6 K) N! R! n& O5 h5 L
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
( G1 [: B1 v, h' u+ k! ^& A9 Q
EDMA3_DRV_Handle hEdma;
6 |2 s' ?/ n/ C. K x$ o
uint32_t chId = 0;
4 i, k+ y }! y3 q: F9 _, ~% C
uint32_t tcc = 0;
9 D O7 H' `1 C# }
4 M1 N& U( ^5 s; r: k
print2arm("edma3 driver init...",0);
" Y2 h7 d$ u* q6 u
* B0 h7 z/ a( b& h; o: O
hEdma = edma3init(0,&result);
: J" u: C8 i4 C7 U5 H" y1 I
if(hEdma)
( o6 I; R2 @6 Y+ n% Q* r
{
( U6 @7 n: e! x* A7 X9 y+ c
print2arm("edma3init() Passed.",0);
. z! O( c, E( H% y2 T6 x. g3 i9 \
}
/ j, T" @$ ?# V* H3 \$ C! G
else
, y6 Q$ g a5 w5 y
{
& C& ]: g- \3 B
print2arm("edma3init() Failed.",0);
2 w" s# u+ j" \, g7 T) \
}
6 G; d x, L% E+ C. z
L$ V3 U8 Y2 T
if (result == EDMA3_DRV_SOK)
# {( e6 @4 l/ m
{
* F. \# ]2 [" _+ ^) ^/ @
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
9 t- r( [# I2 ] R' |' P% N
(EDMA3_RM_EventQueue)0,
1 M3 U K) L) a6 i$ C1 x' P
&edma3_isr, NULL);
# m8 ~. I) d! d9 M
}
5 Q: T! }' W$ r: w, j
- N4 Y, r3 o: m3 ]3 ?5 C# r
if(result == EDMA3_DRV_SOK)
7 a- M. b* w) G6 T6 q( @/ c2 B
{
& C) ?/ r# E! H7 Z/ x- D4 {
paramSet.srcBIdx = 0;
+ h, k9 L% }' Z
paramSet.destBIdx = 1;
* t7 V( U1 }, s% I6 p5 S2 ~
paramSet.srcCIdx = 0;
$ x- u1 X1 X2 \# _$ a* i
paramSet.destCIdx = 0;
' i ^4 M$ y5 E. N; t1 b
paramSet.aCnt = PING_PONG_ACNT;
4 N k" g. i7 Z6 N( D) f) l
paramSet.bCnt = PING_PONG_BCNT;
) v* ]$ U$ x. ~1 n. G' O
paramSet.cCnt = PING_PONG_CCNT;
) g8 E% S5 H ~) R; ?3 f
' D, {8 p& `( Y7 ^
/* For AB-synchronized transfers, BCNTRLD is not used. */
! m( U v- c6 m# H" Y
paramSet.bCntReload = PING_PONG_BCNT;
; D2 f1 Q3 ?2 Q, {& W
9 I; i/ i( J% G$ ~& s& O) i( a
/* Src in constant mode Dest in INCR modes */
0 I: T- V* {7 D6 _3 ]% o: D
paramSet.opt &= 0xFFFFFFFDu;
0 ^. I- D% {% _- L1 `, v; d
//paramSet.opt &= 0xFFFFFFFCu;
. }6 A- ~0 K; `* {
7 a3 ^- x: E6 w
/* Program the TCC */
8 K0 H' @* t% B6 X/ ]
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
" B; k+ w7 K7 n# p) r
# {2 i" r# o5 x1 u
/* Enable Intermediate & Final transfer completion interrupt */
' X! Q( D4 g4 T# a) o2 f
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
, N0 N7 M: O: x. V. f" T2 e
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
% p, w w) C& ?1 o1 z$ U, W/ S7 T
: k# Y: c3 d# u% t3 \; B9 p
/* AB Sync Transfer Mode */
9 v6 e% t1 u; r% ^& F
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ @2 F3 \; q( i" R
$ l H8 F1 e4 w6 J
/* Program the source and dest addresses for master DMA channel */
% \4 V$ \# O! t% D" N- Q
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
0 L8 E& |( r' Y" n/ i4 |
paramSet.destAddr = (uint32_t)(ping_buffer);
2 B6 P. v' |; r& R, c7 X
1 C/ {! M% l; J% r/ J' a
/* Write to the master DMA channel first. */
! x0 d% T! S# F8 k6 S
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
( w& U; X+ t- e7 v6 E2 V
}
4 q3 N) G1 q( P' U9 E% P
: L9 W# l2 m' x9 [+ x7 G: `
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
( N6 H2 M1 F: M" }; _ l* j' @
+ P2 Q) t4 [! A g- E, I! S
if(result == EDMA3_DRV_SOK)
% T6 S8 d$ x: ~& d
{
& M& O6 m* r+ E& }& a( r
print2arm("edma3 driver init success.",0);
/ {& i: ]* d* t' R
}
q4 I) ]: P6 j1 A3 S
}
$ U; a7 U# h! M' A3 N3 A
; x- a/ ]: g) F' g% T
0 d4 A6 ?' p; c6 f( r" Y' W5 M
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
# j3 O6 A* C( K# a0 C
4 C+ c l$ n. A5 m; T3 h, E
9 U( h9 E4 F- a9 {/ K
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
. J2 v, i; V" A9 L% e
每次DMA传输完成后都要再次使能传输
# D6 t! W- h! k( I
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4