嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
: r# ?5 q+ [2 [3 F& h& q) n
#define PING_PONG_ACNT 1
) b) a) v `4 ~# \8 k6 R
#define PING_PONG_BCNT 8*32*40
$ p) N$ d. p8 T5 j- D
//#define PING_PONG_BCNT 1
# ^: T( ?; D5 {, H/ `" X: L
#define PING_PONG_CCNT 1
$ R) y% _! p4 C, y+ l) W1 a/ J
#define MCASP_BASEADDR 0x01D00000
6 d E5 e4 p8 v4 \
#define Mcasp_RXEVENTQUE (0u)
M" y! B( d# h2 ^6 s% U
) d k# q4 \& \2 M" b
/* OPT Field specific defines */
; W5 y$ ?; K' L) f: p* [4 o3 H8 A
#define OPT_SYNCDIM_SHIFT (0x00000002u)
; v& J" I- b' P& \0 x+ ]+ \
#define OPT_TCC_MASK (0x0003F000u)
o6 }9 \" I) W; R
#define OPT_TCC_SHIFT (0x0000000Cu)
4 g5 V7 _' U* Y6 y% `
#define OPT_ITCINTEN_SHIFT (0x00000015u)
! { \- X# |' J9 }
#define OPT_TCINTEN_SHIFT (0x00000014u)
* e0 a$ T' ]& X) {1 D) a
; t2 g& k' v* w
char ping_buffer[PING_PONG_BCNT];
2 v2 D( c4 J9 t* L: W3 T
char pong_buffer[PING_PONG_BCNT];
" x- _9 [" R# |
. x+ i6 C1 `; [$ H: |( X) J
2 Y! {2 C+ O4 T. }7 x) p) @
8 a1 f) ~# V# Q* y; Q
' }2 X* ~2 t3 ~* O3 w6 _9 Q
static void ys_edma3_init()
9 U! E! ?- k/ F, H7 k
{
+ A8 R5 P* ?/ Q0 o
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
) d2 e7 T% P* U' v* O8 e' G
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
3 m$ o/ j: ^, [& }& e% a" v/ m" i& `* q
EDMA3_DRV_Handle hEdma;
/ d( H3 X- |$ i! ~, |* c3 o
uint32_t chId = 0;
8 Z0 l; T6 ~9 E/ v1 N
uint32_t tcc = 0;
+ C" U2 x. |, g/ R' N
! q% ~+ l, a- b0 o" m
print2arm("edma3 driver init...",0);
" s( x+ e5 `! U8 ^0 Z" i
# _1 b) A* ]$ T2 ?" [- ~4 ^
hEdma = edma3init(0,&result);
8 l: O$ l/ [& | N: w, Y
if(hEdma)
, g+ j, z+ c" |; |
{
) e1 P/ D1 d7 \2 [4 Y9 k( a
print2arm("edma3init() Passed.",0);
% A; f! Q9 x, S6 [: R
}
' A4 @. X2 s; q4 g3 ~7 c
else
' @& }. {/ g' x
{
- ?/ B' v; @ W% Q9 R) v
print2arm("edma3init() Failed.",0);
# i" Y& T$ Z: r/ J
}
; P: m/ H3 D. y! O' B7 m$ O$ P
1 a+ }0 y. W9 X3 B
if (result == EDMA3_DRV_SOK)
: m1 K$ f& T. A2 Z( O/ I1 W
{
$ G3 C# |" _5 A: o, c
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
$ U6 v) W r5 F! d
(EDMA3_RM_EventQueue)0,
$ N9 S1 O- D( U! A P% K
&edma3_isr, NULL);
4 s/ j8 b! f6 L& E7 z
}
, g. u+ j/ {4 E, o; G
) A: i1 x* M9 C4 f3 c- R s$ A
if(result == EDMA3_DRV_SOK)
3 }' s4 Z7 r; l6 }1 e
{
6 w0 J) N' b! D" S$ D+ D+ Y
paramSet.srcBIdx = 0;
" T, |2 _" u, M0 D0 u9 N) y& n
paramSet.destBIdx = 1;
. Z8 d3 D; m+ q
paramSet.srcCIdx = 0;
/ o* `; [0 S8 t7 [$ O3 p9 ~6 _
paramSet.destCIdx = 0;
8 J0 x3 j& i0 q- K% y/ g! W3 E# x
paramSet.aCnt = PING_PONG_ACNT;
3 [2 b; M+ c% g: }
paramSet.bCnt = PING_PONG_BCNT;
" T& E8 ~1 k; H; B: u. f3 J
paramSet.cCnt = PING_PONG_CCNT;
0 `* ~6 }& H* s5 R% b
( a+ U! U# I; }4 o/ \9 C# g4 x/ W
/* For AB-synchronized transfers, BCNTRLD is not used. */
; A; u% L( g+ ]; j
paramSet.bCntReload = PING_PONG_BCNT;
# | S& M4 i7 [
6 U* h. b+ B% j' S
/* Src in constant mode Dest in INCR modes */
) ~4 I- o2 A* M% N! |' Z. E/ D
paramSet.opt &= 0xFFFFFFFDu;
V; w) `( \/ z7 Y
//paramSet.opt &= 0xFFFFFFFCu;
+ e+ n7 C1 _7 G: S7 r+ }
1 ~ n! h+ y- o
/* Program the TCC */
$ w7 `' C U8 w, [/ D; V
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
) E: n- C4 f5 o' d# J2 ~1 \4 z
- k! C* f; k; _) w4 `. @* ]
/* Enable Intermediate & Final transfer completion interrupt */
7 n+ ?8 N: V; H+ M3 J& |+ b
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
9 Z' \3 J) k/ w) Z
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
8 J! {9 z; T/ n: ?- \% x& Q% V
1 s9 W* {; u8 I/ S4 k; q
/* AB Sync Transfer Mode */
$ K6 F8 W: I% @2 w3 {6 }) B
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
" p! Z, W; `& m# }; V
4 ?6 e% S& q, `% r4 \
/* Program the source and dest addresses for master DMA channel */
s6 ]/ {7 V) a9 k9 J
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
x; u( ?# n9 V& P! d) |
paramSet.destAddr = (uint32_t)(ping_buffer);
9 {" A$ y* A% b0 _
# U+ p* Q9 W+ F- |
/* Write to the master DMA channel first. */
/ s1 j. G% r) w+ u7 \" b5 Y7 [
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
5 q w$ ~# G m t- P
}
G1 [) C3 S0 u4 |
" B2 ?/ D5 ~& C' h) }& F' L
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
0 H+ h/ l, R% j' ~3 \6 n8 J5 ?
0 k% F( g6 G' Q `5 ]2 h
if(result == EDMA3_DRV_SOK)
8 o0 f' j9 O+ l( C; v! @' P
{
* ? r* c+ k$ j; d- X9 n3 `
print2arm("edma3 driver init success.",0);
& i2 T, n% j1 y3 |1 W9 H% G
}
/ i Z) _% M9 T! t+ D) t
}
$ S R) H+ \2 I e! b% t
, c$ R7 ~/ s7 J$ x3 g; s
; u6 P% G' V6 f) U& W a1 [
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
/ y" V6 g( m( C, q1 [) G
3 [ b' P0 r7 O; m) N$ t% [! i
0 m) f. i& J6 }! Y( S, k
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
. y" v; d2 ?9 O: M! f8 Q
每次DMA传输完成后都要再次使能传输
& v2 T6 l+ Y) O# G/ m+ h# q8 I( {) P5 ~2 c
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4