嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
9 _. W: I8 }: Q& G6 E0 s, |
#define PING_PONG_ACNT 1
$ n% y4 \7 N5 U6 |+ N8 S
#define PING_PONG_BCNT 8*32*40
/ |6 b; ?1 j1 U3 W
//#define PING_PONG_BCNT 1
& Q7 y: M' B' `, f
#define PING_PONG_CCNT 1
% l+ `9 S* N; g. Q: X' }" \
#define MCASP_BASEADDR 0x01D00000
; [# f H- W5 f- ]& |
#define Mcasp_RXEVENTQUE (0u)
6 E7 V" w4 Q& h$ g
( j/ l! G: C. d& q7 \3 Z7 K6 \
/* OPT Field specific defines */
( i* b, k3 d, `' [0 h1 p
#define OPT_SYNCDIM_SHIFT (0x00000002u)
4 m# `( S. u, c0 G7 a( Q
#define OPT_TCC_MASK (0x0003F000u)
0 b1 R( ?. E) q5 l" U# p9 W5 V) h& s
#define OPT_TCC_SHIFT (0x0000000Cu)
! b9 O$ U0 P0 O4 e" R% ] G
#define OPT_ITCINTEN_SHIFT (0x00000015u)
8 [: ?2 J8 t1 x" G
#define OPT_TCINTEN_SHIFT (0x00000014u)
3 y* s7 Z1 d$ I9 }. V6 Y( Q" E
% r) p) r. u1 c
char ping_buffer[PING_PONG_BCNT];
; c% l) e% u. K% Q) R0 k
char pong_buffer[PING_PONG_BCNT];
a$ l6 [1 T4 g4 m
g) O: |: [! k, r1 N I* j0 d
$ \1 L; b7 x/ j0 ^. u4 Z
( [6 r! K# f3 J* B- K' `! _
9 D8 x0 w7 R' k/ q/ w
static void ys_edma3_init()
) U. g! X& A- R( v! X H5 R
{
# }; t, x4 v6 k: i$ A
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
7 }# m2 b0 b' Z$ ~6 O6 F" q6 l( e
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
+ ~" T; q. ~% }+ s* G" F
EDMA3_DRV_Handle hEdma;
/ {5 o; R ]* n
uint32_t chId = 0;
& [+ z$ k7 V, r# E/ e0 w
uint32_t tcc = 0;
8 O2 }# p& b9 T8 u9 e Q
?$ I+ B8 m7 {9 E/ f' |
print2arm("edma3 driver init...",0);
1 L2 Z! G- E" D4 K- ^: w: G( ~1 f
( Q' U5 H" a& f$ k
hEdma = edma3init(0,&result);
2 |, c3 T# S- T8 n# U. Q, `
if(hEdma)
# [% s; l) W9 {/ j& i
{
3 N2 x/ L# t w/ |
print2arm("edma3init() Passed.",0);
* g6 e4 p% E* S' y$ o2 N. V
}
( i8 @2 [% d5 k' d, @
else
5 W: Q) s2 e2 i
{
1 h$ g( a7 f; ]) T
print2arm("edma3init() Failed.",0);
* l5 J. K4 s4 j5 n: Y! t, R( B+ h2 B5 D* ?
}
8 r' U9 j& [+ e% M/ U
! H( B6 F; W r, O
if (result == EDMA3_DRV_SOK)
' h% u3 H7 c: R, t% X8 s8 z
{
8 d3 ~$ Q& ?- c1 A4 b0 r5 R
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
* g( `3 ~0 d- k, p* h$ u9 d. C
(EDMA3_RM_EventQueue)0,
! i4 [- u7 l( S
&edma3_isr, NULL);
7 u) G! h3 Z+ U8 ?
}
) i8 |& P% h/ K2 q% H& f- C
T, D' u& T6 q" e
if(result == EDMA3_DRV_SOK)
; u# E7 E8 F, {9 S* W
{
i4 `* S# B6 E
paramSet.srcBIdx = 0;
5 U" ~% N9 L9 ^, t+ A3 A
paramSet.destBIdx = 1;
7 t% G! |0 z) N4 g2 y
paramSet.srcCIdx = 0;
# M0 M% c* }! e! {- ^
paramSet.destCIdx = 0;
# W1 O1 u3 X- r: |8 [1 g
paramSet.aCnt = PING_PONG_ACNT;
4 e4 t, H) _" U& z7 T' q
paramSet.bCnt = PING_PONG_BCNT;
4 g) M) [( A1 C3 L6 o
paramSet.cCnt = PING_PONG_CCNT;
: \, l3 a3 }. s8 F1 z6 B' @. M
8 F8 o7 K, Z- |3 {2 G8 ]
/* For AB-synchronized transfers, BCNTRLD is not used. */
" P* a# m2 _' Q; `
paramSet.bCntReload = PING_PONG_BCNT;
B u6 q% x6 c) ~1 k$ X7 q
' ~3 T# L1 T6 {1 S! D; q
/* Src in constant mode Dest in INCR modes */
) o6 I5 v& G3 o. ]% q% Z0 A# y7 x/ O
paramSet.opt &= 0xFFFFFFFDu;
9 \; p( Z! T) M
//paramSet.opt &= 0xFFFFFFFCu;
Z0 u$ }* u( D
8 [8 V. Y' E Q* q
/* Program the TCC */
9 Q# P0 j- ~7 G! \. P
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
( o' w% _0 W3 E b* Z0 g4 ]- e$ H; g
# \5 X% k/ d9 Z+ H" W8 t1 m
/* Enable Intermediate & Final transfer completion interrupt */
& j8 S' k/ g9 L7 V- v- W' |: m
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
! K6 e$ w* r; e& F: \
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
* e k% S$ h" {) U
0 x, m. d+ {" X& d
/* AB Sync Transfer Mode */
0 r4 L- V( S4 A% U% a4 K
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
' @. y+ K/ b8 P+ b2 H9 o4 w
) e$ V# j& y# i y8 e' r
/* Program the source and dest addresses for master DMA channel */
9 ]& }, o2 Z. f- j1 m" }4 L
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
% R8 Z# z! c Z- \8 Q3 m1 z: _
paramSet.destAddr = (uint32_t)(ping_buffer);
" @: u' w8 |' ~+ V
8 o& K8 P& P9 [0 x! g0 H
/* Write to the master DMA channel first. */
3 Q! \; r! T) w8 r
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
3 ^& @. ^! B. P
}
2 r) T5 L" X$ i8 G
/ c4 F) h6 r) E5 C- }
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
, a- I+ p) u5 \5 G F
/ q8 E7 Q$ X% z7 M) J
if(result == EDMA3_DRV_SOK)
5 g2 t$ L2 E* x6 w* ~
{
# ]' f4 J8 ]9 o, P4 T1 v0 ?* c
print2arm("edma3 driver init success.",0);
8 G8 ^* t! ], M( x4 h
}
# P8 Q7 S/ B. H: y
}
: {6 \6 T7 q$ F! x
2 {& v& S' n2 M t7 r$ f
* |2 a' z9 \: y) z' g1 w1 b
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
2 @4 w1 v5 `2 x' S; u3 j; d
0 x9 V6 ?5 z5 v
7 r- h8 a6 c3 N& e4 ?
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
! P+ [ W6 p3 x5 p6 X
每次DMA传输完成后都要再次使能传输
1 u( G6 F, U. \; E3 I; |
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4