嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
8 s" g: }. V' v2 S2 R X
#define PING_PONG_ACNT 1
B5 D1 x7 E, ~! a* x) w% r3 }: ]
#define PING_PONG_BCNT 8*32*40
) h) e& U) G5 g6 W: r
//#define PING_PONG_BCNT 1
/ Z9 {+ n- M3 i
#define PING_PONG_CCNT 1
3 S9 K) A$ i* a) A1 {* K9 @. D8 r
#define MCASP_BASEADDR 0x01D00000
2 c5 ~5 [8 e* E) M* Z4 f5 g
#define Mcasp_RXEVENTQUE (0u)
* i8 T( T2 ]4 I( K
2 a: F& r7 @: K" y% n- F/ c6 d9 y
/* OPT Field specific defines */
) `5 u2 x, I9 b: G5 D# {# h+ h* o
#define OPT_SYNCDIM_SHIFT (0x00000002u)
6 v8 L! _5 [; ~) p' ~
#define OPT_TCC_MASK (0x0003F000u)
( H7 w) }+ v2 `& M
#define OPT_TCC_SHIFT (0x0000000Cu)
V/ h0 ^& b0 B: F2 {
#define OPT_ITCINTEN_SHIFT (0x00000015u)
4 E7 K* t3 K3 e6 Q, ]. O' [
#define OPT_TCINTEN_SHIFT (0x00000014u)
% }% I; z2 H# T. c. K- m! }8 i1 ^- W
* T" _( F# m; w+ T
char ping_buffer[PING_PONG_BCNT];
6 ]' i* r# y$ x* n" n0 k9 b
char pong_buffer[PING_PONG_BCNT];
+ m, ?3 y5 s5 ?8 W& d& T( P/ H- D
, u" e$ Z3 Y8 s3 K
9 d: M7 n+ ~% s! ]2 e0 x% F0 c2 C6 [1 O
5 y0 ]2 A* K- f) ?- y
+ v# k6 H# P9 O5 f3 J
static void ys_edma3_init()
0 G9 j J& g7 S& q
{
$ V s4 U2 D* E% {8 |) G
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
7 [7 ~1 t2 @3 Q* T
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
1 x* h5 W+ s; r4 Y" {
EDMA3_DRV_Handle hEdma;
9 X" d+ }4 W7 [9 K! z
uint32_t chId = 0;
, d9 o% i# o; X" n8 `, G
uint32_t tcc = 0;
" [0 f6 C. q7 r& {' s2 {
. M2 o. w! I) f8 r/ Q! X$ q( M
print2arm("edma3 driver init...",0);
2 l' L$ ?, Q2 T
* G7 V% i+ O& F$ p1 j7 U& y% f
hEdma = edma3init(0,&result);
5 h1 g" R w; a7 x3 J0 F$ G3 n4 l
if(hEdma)
% v4 D/ w3 t( r! Y3 c* E5 I
{
( F4 z3 `4 y4 U3 n: v- c& \* d
print2arm("edma3init() Passed.",0);
" E& ?0 f( v4 n
}
) e9 R3 |# R* b) Q
else
& o! _$ L& }& H/ i4 s
{
* x5 E, l$ ?% d
print2arm("edma3init() Failed.",0);
{. V8 f2 D1 p5 a+ X/ D6 f
}
5 M/ G. \9 K- w6 {. O# z: r
- r6 ~; }3 \# a) [. ?3 z9 G
if (result == EDMA3_DRV_SOK)
0 U6 g, H8 j) r
{
4 o8 d$ h5 K" B) x4 [3 A' Y
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
/ A8 j0 ]9 e5 |( I
(EDMA3_RM_EventQueue)0,
# W% l* ^3 o+ Y
&edma3_isr, NULL);
2 `/ M& V# G7 b. b$ [* n
}
0 c; j, x6 d* ^3 k0 i6 z5 R
; b: r/ b* s- A+ I; q+ V
if(result == EDMA3_DRV_SOK)
6 K0 g$ t6 }4 o P/ o
{
4 c4 \/ H7 H: R5 [1 J/ \
paramSet.srcBIdx = 0;
1 `4 V* t, l6 t8 s# S4 T; ]- p3 B
paramSet.destBIdx = 1;
3 p# q% @1 T2 k6 f( H4 n
paramSet.srcCIdx = 0;
& C. z5 p9 ]7 q6 m% u! ~* n2 W8 D
paramSet.destCIdx = 0;
2 E1 h, t& S# X6 a% k% F; h
paramSet.aCnt = PING_PONG_ACNT;
7 \+ T7 Z/ i5 |; Q% z
paramSet.bCnt = PING_PONG_BCNT;
* I: Q0 M! {7 B2 E8 F3 G" R% ?
paramSet.cCnt = PING_PONG_CCNT;
- ~( ?- w1 K7 F6 u6 M* Z
- Z6 \7 J# F+ J n, Z/ u/ A
/* For AB-synchronized transfers, BCNTRLD is not used. */
/ p n3 f7 D5 \) e$ W8 ~
paramSet.bCntReload = PING_PONG_BCNT;
* T! Q6 ?9 B# l
- k1 V- `( B4 W$ s% [
/* Src in constant mode Dest in INCR modes */
* C; l# K' F: T) w
paramSet.opt &= 0xFFFFFFFDu;
. @3 ^$ J! f P" Y' W
//paramSet.opt &= 0xFFFFFFFCu;
2 b1 t$ ~, J, {. N) ^$ Q
: k+ w2 B4 _6 H% @* l
/* Program the TCC */
% {' t: f& ?- l# V, ^1 {
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
. I- Q5 `, X8 N2 U5 |+ ?
* q# C8 g0 D; t" v4 E$ x# S
/* Enable Intermediate & Final transfer completion interrupt */
9 h$ G+ ?, _" ]$ K8 D
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
6 `6 H/ Q+ K* b' r& k' h- T
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
# `" G* _: P" L! r( p. ?
7 g) z+ y' }4 J {3 U
/* AB Sync Transfer Mode */
9 B2 l' C5 d7 w
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
2 o" U! e7 C+ A! G1 K/ v) c
; _0 r) R- t3 {! A
/* Program the source and dest addresses for master DMA channel */
* n6 t# Q8 N" S+ r2 r+ Q' m: g
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
/ s6 x. {' k$ O8 c! t0 W
paramSet.destAddr = (uint32_t)(ping_buffer);
) t) I- C v6 ?, b9 e0 S
$ u# i* x8 m8 Y- L y' y1 t5 n
/* Write to the master DMA channel first. */
2 c0 H* l3 s. R, V( {
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
( V |! J {4 u& T7 F5 \; q, v8 A }# Y
}
( ~4 D, y2 e5 I! L
" F- H' l* ?& [- e8 Q( [
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
; @3 b0 O" F: H. S9 f; N& [5 x$ c
& T/ h5 H( b% r- h; U6 n
if(result == EDMA3_DRV_SOK)
4 p5 F3 u( E) a, |; R9 ^
{
- Y/ g/ R7 O: p
print2arm("edma3 driver init success.",0);
2 W! G' G" j6 l5 i' M
}
; F) D: A5 X# a$ C. b
}
. ` J/ i' m- u1 N
4 J+ C! b3 G; O2 ^$ @* {
6 O$ ]. h6 m; B1 s b' e
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
6 x6 L' C; x8 k
$ O4 { Z+ o% d3 X5 i, y7 ` l
6 c2 d8 e8 s; D4 S) A( Q( [
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
6 W0 D3 ]+ s( O0 K* O/ h
每次DMA传输完成后都要再次使能传输
F( U! L2 _. L- P
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4