嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
9 L6 Z' e( ^- l! q2 D# u$ Y
#define PING_PONG_ACNT 1
, ?1 l' J% p/ M3 F* f S1 o; B
#define PING_PONG_BCNT 8*32*40
" S& {' M9 x- N; ?4 D |' Y* w0 Y3 X
//#define PING_PONG_BCNT 1
+ C# I- {6 R: u$ h1 {
#define PING_PONG_CCNT 1
/ [6 \% ]5 |$ c9 ?5 n) o- i
#define MCASP_BASEADDR 0x01D00000
) F! ^5 i5 h2 ^7 h& B6 t
#define Mcasp_RXEVENTQUE (0u)
& w% S( K3 q) q
7 k& S* ^$ ~# J4 O7 E% y& W
/* OPT Field specific defines */
3 e1 t4 w; W; V3 ~$ z6 V
#define OPT_SYNCDIM_SHIFT (0x00000002u)
) E7 L; m1 v3 b! k4 Y" p7 j. P3 d( p
#define OPT_TCC_MASK (0x0003F000u)
+ J# y9 g( }$ b' N/ d
#define OPT_TCC_SHIFT (0x0000000Cu)
/ N0 k, d! u ~+ @" B# ^* }7 ?
#define OPT_ITCINTEN_SHIFT (0x00000015u)
9 N! U( @0 X- c2 c! ^
#define OPT_TCINTEN_SHIFT (0x00000014u)
& E' a- j2 S/ m0 z
( ~7 p( T; ]5 I
char ping_buffer[PING_PONG_BCNT];
' }6 X8 V: \2 J; {1 S
char pong_buffer[PING_PONG_BCNT];
$ w% ^% T$ b- T
) B- o% N2 k; {5 ?8 I6 V X
2 f: Q1 b1 ^8 o7 V/ e$ b) W3 H
, l) u! k$ a, B! e: V; {. _
8 V2 {" [: P2 W6 c
static void ys_edma3_init()
' S0 \0 H( _* Q/ l0 P# y; t
{
1 _; t D5 u J; X' R; y( C
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
% p9 X! P6 I- l+ b7 E: W
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
! w, P* E8 T4 P) u
EDMA3_DRV_Handle hEdma;
; q5 H {( A. V$ c. A5 y C* W
uint32_t chId = 0;
8 ?2 @! m* K v* P& D$ K4 H
uint32_t tcc = 0;
4 [4 D) a& b* f5 \9 [! T& Q9 [
% q5 ^4 t% S3 x
print2arm("edma3 driver init...",0);
& a0 L# g& y& [9 Z2 `/ l) D7 O* U
! m$ e7 y8 F: v6 F6 H1 O1 Q6 N0 w2 {4 |
hEdma = edma3init(0,&result);
; b; f8 |0 v) f6 |7 I, O* f( C
if(hEdma)
7 s1 u" K% K$ Y8 O1 s; x, Y3 k1 d
{
2 E3 d; M# e6 V4 J
print2arm("edma3init() Passed.",0);
4 \/ N" I |, H' n& Y4 L* \
}
7 t& F9 O) a" i% g X
else
6 u9 U4 M2 k n7 U. e) C
{
: w- w9 ?- R, S
print2arm("edma3init() Failed.",0);
3 q& u3 k8 u* f# E$ ~4 G
}
# i+ l4 c5 u: x6 S6 p: g8 C
3 c- g& }. c% P% c' W x2 [
if (result == EDMA3_DRV_SOK)
3 {# @1 {. }6 J. b
{
$ t1 u( n/ B, ]- @
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
0 a z( n: I* y5 c4 E
(EDMA3_RM_EventQueue)0,
. `: i7 L0 ^6 R
&edma3_isr, NULL);
; \% |0 H2 B) ?: q% p4 d |* \
}
# D8 z' R }9 c$ a$ U
1 B3 z3 k2 k1 f# _9 O" }
if(result == EDMA3_DRV_SOK)
! l j% u# Q1 D
{
9 g0 Y u( x+ e/ `. C: r- N" X
paramSet.srcBIdx = 0;
, ~2 _" I' j* t6 A7 E
paramSet.destBIdx = 1;
& `( v/ ~1 c1 O! [
paramSet.srcCIdx = 0;
5 x. ]/ o/ l8 j5 S$ U. [
paramSet.destCIdx = 0;
# r& D/ @% W# y2 L C2 W
paramSet.aCnt = PING_PONG_ACNT;
( [$ D/ ]/ z6 n" I& W
paramSet.bCnt = PING_PONG_BCNT;
' j6 Z3 Z# g/ l) T* D! B/ P
paramSet.cCnt = PING_PONG_CCNT;
9 Q; [- V+ T& N7 P0 z$ R
. A) n0 i* o4 K4 H
/* For AB-synchronized transfers, BCNTRLD is not used. */
: o* j4 ~5 T7 K' m$ L; d, ?9 F0 t
paramSet.bCntReload = PING_PONG_BCNT;
9 q, _$ n' \% Y/ M9 @0 d& k4 o
7 K' F7 F" W v; v9 [
/* Src in constant mode Dest in INCR modes */
/ o( w0 Y/ I5 @/ ?* K
paramSet.opt &= 0xFFFFFFFDu;
6 U3 }8 S2 G. X# N
//paramSet.opt &= 0xFFFFFFFCu;
3 u7 V9 I9 B- U' x6 w- `, P* H8 F
% b2 u0 R7 x9 ~7 w6 i/ |4 _+ b2 {
/* Program the TCC */
. ^0 m" P( V' ^
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 p; K3 X" l+ z7 U# \
- V- d- `+ W! i9 u
/* Enable Intermediate & Final transfer completion interrupt */
8 X/ w% _" c# ^( P" O( e$ z
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
9 |# C1 t8 M' C; `
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
* d( D& x* ]& k2 e h
/ g" x& L( X7 `& G
/* AB Sync Transfer Mode */
& q2 N* F' H) j' e
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
! I5 V% w) R- l" X# h( Z4 B1 _
9 b( q2 ^% N/ Y* w0 J' a
/* Program the source and dest addresses for master DMA channel */
" V3 o7 m- U, {$ B& @
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
( I, @4 y+ _: K8 M0 w9 a1 Z8 [' T; i
paramSet.destAddr = (uint32_t)(ping_buffer);
: D+ w0 s+ ^( j: n+ c. C
" r$ E! D; u* I! O4 {
/* Write to the master DMA channel first. */
+ M% O5 i0 q6 {- b
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
3 Y3 v- ~, P. p. K- B) m8 U8 I
}
, x! h) M9 i, n/ v0 ]
4 h5 ~# H4 ^3 o- L: B- c
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
) f n2 I o+ i3 E
- j7 v9 t# U0 s j0 c4 Z" s
if(result == EDMA3_DRV_SOK)
% T/ _) `9 D7 Z, |! `. i& L; A
{
$ N- v1 a" q/ K5 J
print2arm("edma3 driver init success.",0);
; Q/ [# X" K! [9 a
}
$ M. N3 |% f" o* d1 l$ K* f
}
% }) G+ u4 M/ J2 X7 X, o
* s# L- ^* G6 Y
6 y2 E/ ]2 x/ N9 l; z+ j; I- _
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
, v2 D' g# U/ p6 o% z
5 ^7 H0 k7 x8 P3 }1 f7 e
7 _; l0 X; `" Y" |* m9 |4 k' k: r
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
3 H6 t- m4 c$ m0 i' X2 Y& w6 b4 U7 `4 ?3 n
每次DMA传输完成后都要再次使能传输
4 F' j& N8 ?2 K
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4