嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
3 J1 x6 D. p) q% _
#define PING_PONG_ACNT 1
6 u3 m# h. c T7 E9 T- O5 C
#define PING_PONG_BCNT 8*32*40
- B1 d8 j( {; f$ s$ \9 P6 n
//#define PING_PONG_BCNT 1
* w& R# d( }+ s. ~1 b
#define PING_PONG_CCNT 1
/ o, ]0 P) }& E5 {
#define MCASP_BASEADDR 0x01D00000
+ B) j# y+ g) k# `* U
#define Mcasp_RXEVENTQUE (0u)
- e1 c; v4 {' P S
/ B% ?) F- p( d4 {- i5 ?2 z
/* OPT Field specific defines */
4 j2 @ {6 x1 E2 O F& B4 V$ {
#define OPT_SYNCDIM_SHIFT (0x00000002u)
8 F5 @& }5 `) K' Q" H# ~: K+ ?
#define OPT_TCC_MASK (0x0003F000u)
/ O$ z; B5 E) ~) q0 R V
#define OPT_TCC_SHIFT (0x0000000Cu)
% \: w! @. A! ], P7 p5 [
#define OPT_ITCINTEN_SHIFT (0x00000015u)
6 f4 ?& ~8 h' L4 f W
#define OPT_TCINTEN_SHIFT (0x00000014u)
; f- ^ |' S9 ?3 v
! W& H9 A" q2 ~
char ping_buffer[PING_PONG_BCNT];
" H3 M, _* N- ? y
char pong_buffer[PING_PONG_BCNT];
$ V0 f- a8 [, K8 |, e+ J
S9 b d: V. ^' i0 B# I5 ?/ D2 u6 f, ^
+ y4 S; O# B7 ^" F. {( M- v
( d7 \/ J$ S7 h
% C1 L$ G: }- W/ e# |$ K9 [
static void ys_edma3_init()
! B" |# t" G8 Y" b5 a1 d3 O
{
! j- P: R; W5 I2 D% o9 ^( H
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& o" O6 x, H: G. e; B6 d4 G
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
; P' t" H/ c. x# J( S/ x; O. X
EDMA3_DRV_Handle hEdma;
% \0 b' q& }8 j" R
uint32_t chId = 0;
5 S: K1 [8 E& K
uint32_t tcc = 0;
. y0 W8 p1 t& T& Z, ^+ ]: [( P1 ?
7 ]* J# J4 w* W0 F# Z6 H6 x1 R
print2arm("edma3 driver init...",0);
2 M/ }7 W) r3 z
9 r5 E( Q; [; d# g6 _4 {
hEdma = edma3init(0,&result);
. v4 V" z5 D" U8 r8 P; I- v* a
if(hEdma)
! Q2 I5 f$ w& h$ g- u0 b% z
{
' V5 ~2 Y/ Q' G2 E" @: H
print2arm("edma3init() Passed.",0);
/ o6 O+ t: D" i* W" @$ m
}
# K- C, u2 n4 Y
else
; K2 f' @3 h z/ b
{
* D4 E* g0 \/ x
print2arm("edma3init() Failed.",0);
, G' q6 C% l- F. p& a3 v! B/ W T
}
; W; p3 S9 d9 ~6 G8 a
& {- y% P4 @& R
if (result == EDMA3_DRV_SOK)
/ I, N( ~8 n' b# t( C
{
. G; t+ _3 }! ]5 g% `( h. ?# E* f
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
% C3 l0 Q9 _; t$ G9 j" m5 Y: x# E5 i
(EDMA3_RM_EventQueue)0,
3 T5 a" R7 x( Y9 F/ k; v- Y
&edma3_isr, NULL);
. _+ e" m5 s7 L- I
}
. w: K# R! E7 W- B J0 i% ]
6 b' p; u' I/ K8 O# Y2 y
if(result == EDMA3_DRV_SOK)
s5 f) d. R" p9 S1 a1 z
{
5 f6 H5 V' T( g* ~" a4 f
paramSet.srcBIdx = 0;
, R$ q, O% w+ D) ` R) m+ `
paramSet.destBIdx = 1;
2 W( }( ~4 k( `& H8 w J
paramSet.srcCIdx = 0;
! G: M# u. Z" H0 D
paramSet.destCIdx = 0;
% p7 J/ W! e' V. y _' w
paramSet.aCnt = PING_PONG_ACNT;
( E1 Z* Y0 n, [! u$ P* D3 N
paramSet.bCnt = PING_PONG_BCNT;
* w0 D" K' I! `$ _" T2 [
paramSet.cCnt = PING_PONG_CCNT;
" d/ C3 b: c4 T
% D5 Q% d$ |1 ?' g2 M3 x1 {
/* For AB-synchronized transfers, BCNTRLD is not used. */
- U' b! m4 H. k- n
paramSet.bCntReload = PING_PONG_BCNT;
8 v7 {5 K2 _! g
1 m7 w+ |2 x1 E) M; ]1 a) p
/* Src in constant mode Dest in INCR modes */
' I) {( ~# U& I! K5 ?) w
paramSet.opt &= 0xFFFFFFFDu;
- v& o ~2 C$ a) L& m) v% p* s
//paramSet.opt &= 0xFFFFFFFCu;
! M+ A4 X- C# a; r, _% S
1 e( [6 G4 W# s& j
/* Program the TCC */
: `5 D& g+ \ V. C" u+ F) u6 V. b
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
# F* P; E) Q* r$ `- `& o" }/ j
/ F- q3 z) u0 `: K
/* Enable Intermediate & Final transfer completion interrupt */
. @' X8 z; G: b4 w0 O
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
/ O9 T5 t, `9 n f' x/ p' s0 c
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
; h2 k3 x+ A9 Y4 Z
& j/ i. h# ~ {* `
/* AB Sync Transfer Mode */
# V' |0 }7 G( a1 {, j6 b$ k
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
* o1 Z2 q5 n- D# g, z$ r' T
1 T, b( n- R; [ P; l
/* Program the source and dest addresses for master DMA channel */
0 t' X0 n- I, b# t' n) ~
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
2 P. ^) B7 Y+ v) J6 N
paramSet.destAddr = (uint32_t)(ping_buffer);
4 ?+ g' g- W- Z9 d
$ v0 O+ K5 W) P" i: f$ x
/* Write to the master DMA channel first. */
) A" m9 [; l2 Y; ^
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
8 ?9 Q: P, m. z$ i; P! Y) |
}
' V& A+ }. h$ W
: y# U, K9 I& m9 [6 U
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
# j7 T* `! k# l$ O$ D, g6 j: R
; e% b+ t4 c' U) ^" `
if(result == EDMA3_DRV_SOK)
0 B3 r E" U4 c3 E3 U# O
{
* K# I2 [: {) M, B2 }0 z! ?6 @* [- d
print2arm("edma3 driver init success.",0);
2 X% ]. S0 x2 X7 i! ~; _5 C
}
6 g) x B3 Z c* g$ \) j0 N
}
# ]; q$ y" {6 T1 Z5 M1 N
5 ]; [$ F; I2 |9 ~7 {0 v
/ K6 }! y. y6 `& [8 m V- n% k' u
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
: y. Q* V4 c! O* @& Y( D
" E T$ O3 [/ W' }
+ ~- I0 Y5 x/ J4 v$ M
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
: q/ i% l+ h( q( S& f
每次DMA传输完成后都要再次使能传输
) |1 n3 I0 w6 K- T9 N* b* o
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4