嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
6 R/ x3 `5 i. k" h! b0 w
#define PING_PONG_ACNT 1
2 J$ R( A5 q" P0 z
#define PING_PONG_BCNT 8*32*40
. u- ^- a7 i1 e: s' ~! B! L' r7 U, C! I
//#define PING_PONG_BCNT 1
6 {: |0 R, F. x W' {$ I7 U& h
#define PING_PONG_CCNT 1
- R) l2 V/ ?0 |5 r
#define MCASP_BASEADDR 0x01D00000
% O7 x1 @6 Q6 P% g Z! _# G- L$ s7 d
#define Mcasp_RXEVENTQUE (0u)
6 t' R$ K: e+ h, u+ E( L
' v' E ?/ W; K9 s% z- K% k
/* OPT Field specific defines */
2 a5 B/ D6 i8 s Y5 u: ]* `
#define OPT_SYNCDIM_SHIFT (0x00000002u)
0 I. K& r6 h* B: p% g. Q
#define OPT_TCC_MASK (0x0003F000u)
$ u2 g# T6 P' Q4 C) U
#define OPT_TCC_SHIFT (0x0000000Cu)
9 ]8 v( n9 e6 z" E* ]' r% }2 ~/ Y1 N
#define OPT_ITCINTEN_SHIFT (0x00000015u)
8 c- K2 L2 Y+ T- Z2 P
#define OPT_TCINTEN_SHIFT (0x00000014u)
* k2 v4 l& ?; W! T5 [$ `! T0 p
, g3 w6 G0 A0 @$ u
char ping_buffer[PING_PONG_BCNT];
+ T) F7 s: M& |& X0 C
char pong_buffer[PING_PONG_BCNT];
/ M1 Z3 _+ ~' \" W/ W) c
& m' N6 B1 g2 j0 |
0 Y; R# o4 G" A Q! N. k
+ q* x( c2 e3 m
# C( h% a5 q5 C. c# l; m; F
static void ys_edma3_init()
& R8 ]" ^2 I. V& p) V
{
: n8 r% o$ d7 s: ~5 H5 |9 N
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
+ o# U, p' y5 t7 U
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
% |0 ^2 [- h! N9 ~7 H
EDMA3_DRV_Handle hEdma;
7 J1 C5 {0 j0 Q2 y5 I* x. R% W; `9 d
uint32_t chId = 0;
( X0 {2 E% _9 l& x% ]# ~' R
uint32_t tcc = 0;
1 Y& l* ]# @' h! k$ ?3 {
3 r1 E" t6 g' J( F5 h
print2arm("edma3 driver init...",0);
+ T. G$ Y# y) R# L
4 Z$ u" P! n! W: \3 a7 ~$ E
hEdma = edma3init(0,&result);
9 b+ Z3 c4 |( ? H- ?- I8 ]+ V
if(hEdma)
+ L. O3 f- |4 L& U4 f- `: D3 v7 Z
{
2 {$ ~* M& v- N! x/ B2 c; Z, [
print2arm("edma3init() Passed.",0);
8 a% U3 `/ V; w: B
}
+ b! ~+ T8 }& I% q
else
1 T+ v5 s7 v# y
{
) p$ t) @$ T5 l' I+ ] O$ M
print2arm("edma3init() Failed.",0);
) _, J! B2 Y9 Y! j8 e K
}
" G: H, W! Y# z( ^8 D4 b
& g) \) f9 f+ ^% U3 }
if (result == EDMA3_DRV_SOK)
; h* O3 _3 A4 k# m
{
/ b+ @) g1 l0 W, l" j
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
: _! K9 ?) \4 f7 ]! W/ T
(EDMA3_RM_EventQueue)0,
! |1 j6 P% z; F4 \( j4 ^; Q# P6 a. x
&edma3_isr, NULL);
! M4 y1 j2 m/ a$ {+ r l5 a1 n
}
. q0 H$ a' L1 H) M0 p
3 ]2 G. q5 l6 c$ ?
if(result == EDMA3_DRV_SOK)
5 f+ H7 V. C3 D9 d6 I( p
{
0 ^. g3 W5 F* l/ a& i) b0 a% t
paramSet.srcBIdx = 0;
z6 Z" W9 O& j' t4 d+ C
paramSet.destBIdx = 1;
* j. ~+ I. u2 v( _$ X6 P5 B6 z
paramSet.srcCIdx = 0;
}0 ?% n6 i" n+ x% D
paramSet.destCIdx = 0;
# P+ m5 Q: F) t! y# f3 Q& f" ?2 p% ^/ X
paramSet.aCnt = PING_PONG_ACNT;
$ M! H2 f+ `: d, s8 k
paramSet.bCnt = PING_PONG_BCNT;
O% B7 U% X- E
paramSet.cCnt = PING_PONG_CCNT;
0 E1 j" }9 f4 a* d5 f- k
5 T0 Y m3 ]" T' d
/* For AB-synchronized transfers, BCNTRLD is not used. */
( E4 |' B; r0 G$ D) r& Y
paramSet.bCntReload = PING_PONG_BCNT;
4 } x% D$ K6 a( p. `" l# d
w1 |" X: @( Q1 z+ f& H2 x# s) b
/* Src in constant mode Dest in INCR modes */
# C6 B* S. b) W. K. X
paramSet.opt &= 0xFFFFFFFDu;
9 g- R+ m; V* s' _
//paramSet.opt &= 0xFFFFFFFCu;
! s2 g7 u$ [% R2 d" F2 e" c
/ E3 i9 |0 t6 e2 f# U; } D
/* Program the TCC */
- T: V2 M/ o, W3 i4 c
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
/ ^3 \' `& h- q$ S$ p
' t; k8 F( ?" ]- V# m+ I1 v
/* Enable Intermediate & Final transfer completion interrupt */
. r! f, w( P& o- b+ v
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
1 L# L7 Y" Y; u! [! o: v+ N
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
8 h+ ~" M$ M U$ B
, q- O7 e. p( M5 n6 {
/* AB Sync Transfer Mode */
0 e; p1 Y/ x/ B, _% |
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
u0 W7 N1 o( l2 c
$ @/ R T& S0 J5 m
/* Program the source and dest addresses for master DMA channel */
$ K2 }/ C3 N; A9 |: j# u
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
# e5 l; k( F. M) o! y- B: S
paramSet.destAddr = (uint32_t)(ping_buffer);
. N' m$ {! Q' o Q/ l, v
( z D; Q. N; b7 A1 ?- n9 I
/* Write to the master DMA channel first. */
; }/ \7 m1 Q5 d& P! }" P' `( D
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
+ U O. |1 R& e/ [6 |( y
}
3 p1 S" @6 B) ?- }5 j0 @% J) J
" P) V7 y7 ~0 l" h
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
- Q7 O0 D( U* l( F, ^
5 k2 f4 h' f. P' Z x
if(result == EDMA3_DRV_SOK)
7 \, U- K* _0 Z) @1 ?
{
+ j8 D1 k& e/ u: k. @% M$ c
print2arm("edma3 driver init success.",0);
$ \/ o1 Y3 u& o- r
}
% o% Q! y: W( \7 r3 @6 z
}
. F3 C! ?- l. q
" C5 R8 \* p' Y/ ~) c* _& |
/ A; v& V/ c7 w) O" r
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
# k% U% S& _ L/ i9 p) m
8 m# B; O( U- q
/ Q, l* L4 w3 `9 f1 M9 i$ g" c, R, O) h
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
1 r- F9 a y1 A, W
每次DMA传输完成后都要再次使能传输
* a( i3 u' s) t f7 ]$ h
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4