嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
; B4 k7 R- d. q! T3 G9 l
#define PING_PONG_ACNT 1
7 {9 B7 k5 }2 {1 ?4 C4 |2 _
#define PING_PONG_BCNT 8*32*40
- E! j* f4 |& x; p' z6 m4 H
//#define PING_PONG_BCNT 1
% T( |( f( x# F* K
#define PING_PONG_CCNT 1
2 z. E# H% u1 S4 _
#define MCASP_BASEADDR 0x01D00000
9 |! `' j) k1 B, G5 Z2 ]
#define Mcasp_RXEVENTQUE (0u)
* r" @- m5 U" z. z# B3 \
+ R2 r& w9 p- w3 C0 x1 F
/* OPT Field specific defines */
5 ^; @/ p; r% s6 T
#define OPT_SYNCDIM_SHIFT (0x00000002u)
8 U5 A1 a+ ]) k/ _/ l& I
#define OPT_TCC_MASK (0x0003F000u)
- c9 |4 F; [& {' I! Z
#define OPT_TCC_SHIFT (0x0000000Cu)
4 D4 i: i, C' M1 ]
#define OPT_ITCINTEN_SHIFT (0x00000015u)
+ Z6 d& ~1 H2 U& c7 T$ b
#define OPT_TCINTEN_SHIFT (0x00000014u)
% [ B) D3 G& X( V- W
& U! I5 J: X; {4 _) b9 C. ]6 l' I
char ping_buffer[PING_PONG_BCNT];
1 I8 h2 x) |1 f- L
char pong_buffer[PING_PONG_BCNT];
2 k' W/ R% z }0 w0 L- H
+ J9 C: l4 I. P: S5 ]2 c
* A3 l0 E$ {' M; ]
+ y& _2 g* |9 R0 l: p) \
; c: a+ [1 q7 l
static void ys_edma3_init()
& [) ?; \3 W) c$ j0 c8 I
{
0 E6 V5 }! Y) D' N7 D- O: ~
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
3 k L% M# P, P- V. A5 [
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
L9 d& ~- Q3 A5 o. j, h
EDMA3_DRV_Handle hEdma;
o( a3 R& C6 P
uint32_t chId = 0;
2 \5 S0 X* f- b
uint32_t tcc = 0;
8 R$ K/ l/ p1 B2 Z
( f* T# o0 ]5 B5 U0 w$ [
print2arm("edma3 driver init...",0);
" r" |4 `3 e. |9 r, i- p H
% K+ k Y" l2 H, ~0 D8 I- h- ]" m1 D
hEdma = edma3init(0,&result);
& T$ c! _) M2 X6 K- e; Q
if(hEdma)
: p* h! k; m* y- M; v; \4 _; s3 X
{
( F4 u5 L. l; G
print2arm("edma3init() Passed.",0);
+ \- K! a7 e C3 v4 \& P
}
; u0 |6 b! R' n& F3 N& R. [. Z. F: n0 u
else
& r4 ?$ N( Z9 q+ a/ U0 g |
{
4 x$ J) S6 {2 ]3 U( x* r
print2arm("edma3init() Failed.",0);
d, s9 u6 G& N* i& l1 G7 d
}
7 V) ^: ?6 P+ D
9 @* C& L$ g( f# D
if (result == EDMA3_DRV_SOK)
0 `1 T' N) u2 v; K& A- }
{
& G3 J9 Q0 a9 e" Q
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
/ N* L; z x, H" b; w! y
(EDMA3_RM_EventQueue)0,
2 y# k. m& |6 w( ^
&edma3_isr, NULL);
t* b$ B' h8 f
}
" |3 h$ |8 }. T
: ?' ]' i% v. E/ w
if(result == EDMA3_DRV_SOK)
3 P5 G: h2 Z- u ^: b( L& U; h
{
5 O, ^- G4 \8 p: J9 a7 O. H* W
paramSet.srcBIdx = 0;
9 D1 `8 N. B+ F1 ^2 c9 L: C) _# P, I) }
paramSet.destBIdx = 1;
; j- G% x* |; T# Q" v" M7 z
paramSet.srcCIdx = 0;
4 j& f: p1 R+ C' I
paramSet.destCIdx = 0;
1 [4 B: C- p. J1 C$ A9 R& ^
paramSet.aCnt = PING_PONG_ACNT;
" W/ V# E2 O( k. L
paramSet.bCnt = PING_PONG_BCNT;
* T# W( G/ E' W- N( ^/ g
paramSet.cCnt = PING_PONG_CCNT;
5 [" N* T& x6 h8 L% S+ Q
- D0 `; p5 @* h1 [5 @: L
/* For AB-synchronized transfers, BCNTRLD is not used. */
. `9 @ B! {# x. b4 [" c& Z/ _
paramSet.bCntReload = PING_PONG_BCNT;
/ q% f* {6 z8 }
8 W2 F7 O; n+ [( i) p% w
/* Src in constant mode Dest in INCR modes */
/ T, C( K7 [; w
paramSet.opt &= 0xFFFFFFFDu;
0 @9 d G A5 v/ R- j2 L
//paramSet.opt &= 0xFFFFFFFCu;
! P' j& F0 b; J2 S2 s' g
# K7 r' s) I1 P; L; n; p9 I
/* Program the TCC */
7 x6 `5 S& h& f# Q1 {
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
9 b7 M1 [* Z- `4 F; b& G) H( M
- _- B" b; _$ h7 P
/* Enable Intermediate & Final transfer completion interrupt */
2 C" r1 \3 O f7 S1 G
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
3 n! }$ \) B F/ E
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
) J, _2 L5 V l' C, m
" E4 \7 C; E' y# g4 Z
/* AB Sync Transfer Mode */
" w7 S7 O" O: Z0 L8 ]7 A5 N; a
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
" l$ I- v5 m" u$ h
+ ?% W8 r. o+ I5 A3 p `
/* Program the source and dest addresses for master DMA channel */
! g8 @0 N3 T- X+ P6 q
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
% s M c9 T1 L; [6 v# M
paramSet.destAddr = (uint32_t)(ping_buffer);
+ i2 E" f8 [( G8 u: f6 y
0 V8 c8 j7 U9 O3 K: s6 ~
/* Write to the master DMA channel first. */
6 u0 s( m- s( c+ `( ^6 L
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
4 H* j& B' o2 y! Y
}
m6 ^2 ?& ^& R2 v9 |* T' V
5 o; U1 J* l2 K9 _+ b. N3 x
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
; k6 v" O9 e q- A8 k) i
' G0 g' a ~# D1 l1 R. s6 Y5 h
if(result == EDMA3_DRV_SOK)
" W, _: T% ] x7 R+ H4 B: A
{
% d, p* K* M" R2 Q9 d4 | h- V. \, n
print2arm("edma3 driver init success.",0);
# m; H8 e, ~. D
}
4 b8 B% `; e0 X% J4 s2 O
}
# \' P5 e2 Z% a( K) ]0 u
8 Z, M7 O- M; Z* g4 l
& o5 Q0 m% I% @* }4 W
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
4 M( G$ R z) [* k3 E
. s- \" o4 \. F/ T
' h. q9 N% H' z% l1 D' D' p
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
& V" {; ~- e9 `
每次DMA传输完成后都要再次使能传输
5 t6 \* P' u1 {" \5 X6 U
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4