嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
( I( |+ b4 H6 H8 }* a# s
#define PING_PONG_ACNT 1
1 m9 x( z% G. Q
#define PING_PONG_BCNT 8*32*40
4 R: Y7 {- x+ W/ I6 |0 }
//#define PING_PONG_BCNT 1
! R! B3 [+ O+ z* B
#define PING_PONG_CCNT 1
) _& j* d* j0 X; {8 U% I+ W
#define MCASP_BASEADDR 0x01D00000
& p7 f1 ^: L% Q9 o
#define Mcasp_RXEVENTQUE (0u)
! J1 h$ b6 e l- z
; A( h- d6 c+ W& x; V" B P2 N
/* OPT Field specific defines */
$ e4 n/ h( |2 N, K. K7 z: @
#define OPT_SYNCDIM_SHIFT (0x00000002u)
+ {0 ~5 l: T4 B& c7 p" K; N7 U
#define OPT_TCC_MASK (0x0003F000u)
; Y2 M7 u+ s5 x; `" W% S) [
#define OPT_TCC_SHIFT (0x0000000Cu)
( ]% e- Z7 I; g) x) q, ]
#define OPT_ITCINTEN_SHIFT (0x00000015u)
; S$ ~4 a* S" K, P* w2 }+ V
#define OPT_TCINTEN_SHIFT (0x00000014u)
; ~0 `" x! }) W9 y! W1 O' V- I
* H) J: x% P y0 R8 L& P
char ping_buffer[PING_PONG_BCNT];
. w* j% U; m4 X2 D5 G. t
char pong_buffer[PING_PONG_BCNT];
& r& m2 o5 H* f+ h1 P
/ N2 u+ ~ }. O! m0 q
1 [. y9 }- s g9 e( s x2 C0 _
- f" N3 X2 @: i! o
9 I5 F" S7 p- N+ p% Z9 ] S6 `
static void ys_edma3_init()
0 K6 v& E* f0 V5 }. O. b$ N
{
* T& Y& L+ C) u! ^1 G2 a' @( n4 _
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
. L D$ D }$ @2 `
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
" \; b& Y! a- |3 u$ j
EDMA3_DRV_Handle hEdma;
2 {* |7 V* \( j/ E8 c; |
uint32_t chId = 0;
3 m/ K' t3 y9 s4 A4 B9 \ a
uint32_t tcc = 0;
* p2 q/ u2 r* X, L- c6 R B4 g
/ \" e4 o& c- W% {( U, `
print2arm("edma3 driver init...",0);
2 x6 |; @7 O6 \6 n) b
9 q( ?- v# s5 v' _7 t1 r
hEdma = edma3init(0,&result);
5 x) R& Z+ e5 Y- {: N, I6 o# p f
if(hEdma)
# C! K8 D; J/ D8 F5 p1 X
{
. A+ J& j6 K/ t# D
print2arm("edma3init() Passed.",0);
- h. z6 E. U. l$ Z6 o" _: n
}
( c6 _& I- G6 p, F; Y
else
+ v; M! i& L1 T6 B9 |% J
{
; `+ B1 {' N( @' ]+ U7 Z
print2arm("edma3init() Failed.",0);
y2 W9 s! M, \4 c# Z
}
: U, n# u6 a/ M0 @
1 I, ?0 ^& B- F& O! Q' Y$ U3 U2 B
if (result == EDMA3_DRV_SOK)
4 M0 v: h' f$ @
{
% j0 E2 B4 V) g% W" h
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
, y0 x1 J5 ~' l" P8 Y7 `
(EDMA3_RM_EventQueue)0,
# p# Q- W1 U3 [) v9 M
&edma3_isr, NULL);
: c" V9 A, D$ s0 d% Z9 m4 ^
}
6 ~- S6 O0 L3 D4 m) @
! ^3 v8 I3 \' o9 r% M: S- ]7 J
if(result == EDMA3_DRV_SOK)
. @( R# J' o# A7 e# Y- X5 A
{
2 d9 A0 d$ y; [2 z6 k e/ F$ S
paramSet.srcBIdx = 0;
" j) X# L+ y; B3 p) v' W9 ~% i
paramSet.destBIdx = 1;
4 v( G7 s! M+ {4 T/ H4 w+ d4 M+ ?8 A
paramSet.srcCIdx = 0;
7 M1 U; V. w) [' I1 {3 |3 C Y
paramSet.destCIdx = 0;
c3 I1 P+ B, g, J' R
paramSet.aCnt = PING_PONG_ACNT;
3 d1 c! N! }% m( y
paramSet.bCnt = PING_PONG_BCNT;
: D% p- J0 t' v q* h; B3 L- A
paramSet.cCnt = PING_PONG_CCNT;
6 Q: P% _1 M! t N
/ ?$ h k" e* b, b& K) D: G0 K2 p3 w7 k
/* For AB-synchronized transfers, BCNTRLD is not used. */
* @# @& @0 i1 u7 o+ u
paramSet.bCntReload = PING_PONG_BCNT;
2 o! E! O3 ]* h( @6 b/ O
( a2 B0 d$ m) ~9 K! B
/* Src in constant mode Dest in INCR modes */
& d5 @ x+ K- U$ s2 k5 `
paramSet.opt &= 0xFFFFFFFDu;
; T. O O, R3 U) x7 K T" \6 h
//paramSet.opt &= 0xFFFFFFFCu;
& B% f! k( ~: _3 j! ^. Y, C K( |0 U
$ F$ V4 A2 t7 W' C
/* Program the TCC */
$ f+ ~: X8 e7 P) _, `* V
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
# X' @4 v" B" q: ~4 g0 L2 u
' @- E3 e, }" i; ~: W
/* Enable Intermediate & Final transfer completion interrupt */
7 p3 d2 m8 x3 `3 u. J
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
z" e8 c- s2 Y- U4 k; T$ M. P% i4 u
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
% t: k" P2 K K3 Z7 Y, G9 g: ~! Z
8 y; a; R0 B7 m6 G c+ D
/* AB Sync Transfer Mode */
5 r$ p6 [2 w& C ?% i# }- r
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
# u+ v- k6 @8 i4 d7 Q
+ ^% `/ c- _, S; l6 o" U
/* Program the source and dest addresses for master DMA channel */
4 D# N T# ]) b% S5 a6 l
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
0 G4 D# E# n% [, k
paramSet.destAddr = (uint32_t)(ping_buffer);
" r4 c/ Q5 h/ k+ l! l/ x% i
# l1 ]' x% Y/ g7 f! I8 _- Z7 N
/* Write to the master DMA channel first. */
! a# w. y3 `" V. s2 ?
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
8 R$ n8 v. x% |: |$ L# _
}
/ g& P6 q' |7 `. u
5 g3 u. d0 r6 k0 k4 ?) m* C. ~
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
$ S( i, f8 B& |. C$ |" K
& v l" r0 \# z+ ]4 R5 N1 F
if(result == EDMA3_DRV_SOK)
. F0 w; h3 F% R, n0 U
{
/ T" M5 d. r ?3 M# J7 j3 ]; d
print2arm("edma3 driver init success.",0);
: b5 y0 L; A5 F! t! y
}
5 Q0 P5 S" e( n; \5 h
}
- v h4 w! K( m3 f0 }( P" P2 c2 h
* k9 i- A" l/ J8 A/ o t
8 Z& u/ x# C: i. l3 Z
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
% L9 E6 S& z1 {% L D. `
. O1 j2 J/ g& E. D2 p( v- ]% @* U
; o+ B7 i0 f0 ~% L! G8 J$ |+ F: D
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
* U& L9 q. E5 O) D
每次DMA传输完成后都要再次使能传输
w' K! g( |9 r- F, m; W4 h" H N
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4