嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
4 M) o$ Y/ Z- j
#define PING_PONG_ACNT 1
+ K7 n( Y& i- A8 [1 K# z. R
#define PING_PONG_BCNT 8*32*40
; d- i0 }9 y8 b& F: F. O
//#define PING_PONG_BCNT 1
, v. c/ i1 ^. y( R% e% [/ k: c
#define PING_PONG_CCNT 1
. Q: x8 h- \1 G% O
#define MCASP_BASEADDR 0x01D00000
4 \0 f/ B# w s% D( v
#define Mcasp_RXEVENTQUE (0u)
1 J) U9 k2 R+ G4 g; O
* O# _3 O7 ?& q" N
/* OPT Field specific defines */
1 B0 ]5 z' f I5 l' |
#define OPT_SYNCDIM_SHIFT (0x00000002u)
1 }( N5 l1 h4 c& l, k7 y% Y
#define OPT_TCC_MASK (0x0003F000u)
* ]$ X) v& S% G+ U
#define OPT_TCC_SHIFT (0x0000000Cu)
9 G& k. {3 x! g$ q- V, Z7 t
#define OPT_ITCINTEN_SHIFT (0x00000015u)
& K, |: l2 O2 A
#define OPT_TCINTEN_SHIFT (0x00000014u)
. n3 A( @+ ?# p+ [
0 P# u+ k. `& B9 C2 u
char ping_buffer[PING_PONG_BCNT];
3 [. m4 F$ p, |
char pong_buffer[PING_PONG_BCNT];
" `6 ?; L* g1 u) I
! y1 q7 L, ^: L8 c
7 ~8 x! K7 q+ b" ^# @ h
/ F+ |0 `9 ~* l, d6 `$ G- i+ r
0 y e" K& F2 J% c! R
static void ys_edma3_init()
& M+ X7 u5 B* C* A
{
$ j$ W- e3 n3 K; z) M
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
/ {- y4 f' ~$ G! ?! h/ v
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
% i+ e7 m0 x$ Z9 S
EDMA3_DRV_Handle hEdma;
% p/ I* `( i" w& @- |! M
uint32_t chId = 0;
+ e: ^* N3 h& S% q5 ]3 [
uint32_t tcc = 0;
8 m, x4 y6 i5 R8 ?; n$ F, H( R
, G6 x) m2 ?. R" [- l2 h8 Y8 g" [
print2arm("edma3 driver init...",0);
% x' ^8 T" M+ ~% I
/ h0 E+ F% S% L8 X: m* m7 L7 M
hEdma = edma3init(0,&result);
- x4 s: L; g" {; q5 I3 a& }. }
if(hEdma)
1 W; H k5 u, z$ b3 V
{
0 a0 L# n6 H) S9 q: w
print2arm("edma3init() Passed.",0);
# w3 V$ x- J% g
}
- X9 p' f u) z: ?" X. O
else
, a8 [+ K; [ D4 i; Y
{
5 \ D% S+ D) V1 n+ Z3 O9 j
print2arm("edma3init() Failed.",0);
& _. A: `- r5 \" N( Z2 l
}
, `, d, ?' v7 w% N, c0 A9 ?# l" ~* J2 ?
; c, x3 e0 E P0 ]
if (result == EDMA3_DRV_SOK)
& A5 _. [5 Q9 T. [" }: J
{
8 Y0 }" q, |4 N8 q& s
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
& h* @5 t0 a. L8 p8 }. \
(EDMA3_RM_EventQueue)0,
5 e/ |8 C7 o+ Z' r! L5 U8 A
&edma3_isr, NULL);
! [/ A/ V$ _& c; R0 k! @
}
3 u& Z+ a. y7 p E
$ c' j3 B; \* M: ~" ]3 D, y% F
if(result == EDMA3_DRV_SOK)
( d9 d9 t2 U% O) R
{
6 u8 f# v( y. q: w( i0 s2 m" ^' F9 l
paramSet.srcBIdx = 0;
! u. i, F% x+ A3 f
paramSet.destBIdx = 1;
2 g$ o& z2 J. i
paramSet.srcCIdx = 0;
3 j/ B' ^; w! }- [
paramSet.destCIdx = 0;
; W9 ]- g. j2 @' u
paramSet.aCnt = PING_PONG_ACNT;
# Q1 ~) K! p P
paramSet.bCnt = PING_PONG_BCNT;
, Y7 K" K* M1 b3 k5 N! W, [9 w$ Q& }
paramSet.cCnt = PING_PONG_CCNT;
- Z5 N. k/ k& Y% y6 q& p/ Y
T6 P+ H& D6 ^4 u% |
/* For AB-synchronized transfers, BCNTRLD is not used. */
% D5 n q9 I# v( h6 g3 F& c
paramSet.bCntReload = PING_PONG_BCNT;
0 w- g# O3 k+ y' V
3 c) ^5 U& {; s2 p+ a- O% |3 j% P& z
/* Src in constant mode Dest in INCR modes */
f9 d4 Z5 q3 a; m
paramSet.opt &= 0xFFFFFFFDu;
8 ^9 ?. h" f& U# Z+ w, A0 T
//paramSet.opt &= 0xFFFFFFFCu;
6 h% T2 U' K) g9 K6 L% t4 S& T
& q7 w- L+ K3 v* P. B4 d
/* Program the TCC */
$ q( e+ S4 r- G" ]8 o$ W2 c
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
; i( y, k) a9 C! e& \$ A$ [& V
- F) f" ^3 K. S- r
/* Enable Intermediate & Final transfer completion interrupt */
0 _# N* W9 M* t3 _6 W, X* K
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
, E* U) u/ ]/ e
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
6 }# H+ P0 ?1 D+ f _1 J+ i7 b
- m/ n8 s4 ^3 i( g4 z
/* AB Sync Transfer Mode */
+ x* X$ K5 } s2 |
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
6 h) Z( @. M- ]! |& J
- e" ~8 S9 H( o9 {+ i, t
/* Program the source and dest addresses for master DMA channel */
, s X( A7 [$ h# Z3 A
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
% p- G* r' \ J6 w2 ]
paramSet.destAddr = (uint32_t)(ping_buffer);
9 P- `, N2 Q% c. T! N
$ O) {9 J, a8 i5 ^* b2 Z+ W; }
/* Write to the master DMA channel first. */
! N, D ]( u. p' ?; o; w- P
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
! ^6 {( G n1 C
}
1 I! ?4 N& W v% v
0 V4 J) d( p& N' q+ o ~3 M
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
' o+ p% s2 P) s! K2 G
% R7 R0 ]* x- V2 M7 C
if(result == EDMA3_DRV_SOK)
& {" n6 J2 M- _, k/ `" C" j$ q( Q" A
{
( Q4 n* X! {9 }7 m+ o$ `# N
print2arm("edma3 driver init success.",0);
; u0 U; Y4 y, Y
}
9 y$ @, ]) _8 G1 C K
}
, o4 ^+ ^0 k9 c8 U3 g* e* g! {: q
* r' M- h7 k+ u9 }
/ j3 W# E! ]* b$ l, t% E- w) d. c0 E
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
; V* C9 Q1 C3 j6 X, H% f+ @
3 d0 t3 C0 Y) m
3 m5 X) S+ s. j% C2 V
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
1 j3 g8 w5 T; R" v8 v5 }
每次DMA传输完成后都要再次使能传输
* L9 z, R0 p* c$ J
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4