嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
; D9 k. ?8 g+ O; N' U
#define PING_PONG_ACNT 1
$ d9 E+ Z6 Q* g9 d# T- y, E
#define PING_PONG_BCNT 8*32*40
6 |$ c B# U, p+ r/ M) D e: U
//#define PING_PONG_BCNT 1
; u% ]8 g* j9 L# |
#define PING_PONG_CCNT 1
0 m/ ]/ O1 q" A$ P, W
#define MCASP_BASEADDR 0x01D00000
* z) c; w/ b0 ^
#define Mcasp_RXEVENTQUE (0u)
! ~3 ~6 { A/ n) i/ ?4 H
6 f) i Q5 X& l# b
/* OPT Field specific defines */
7 O3 o% ~$ c* y
#define OPT_SYNCDIM_SHIFT (0x00000002u)
2 F- e: n. r2 J, s2 X4 L- o7 a
#define OPT_TCC_MASK (0x0003F000u)
% A' L" i3 I- K) X7 A
#define OPT_TCC_SHIFT (0x0000000Cu)
: c, O l/ y. f* @
#define OPT_ITCINTEN_SHIFT (0x00000015u)
/ }( q+ b( v7 m' E7 K% a5 v
#define OPT_TCINTEN_SHIFT (0x00000014u)
1 D6 I9 B( w$ Q- C* A1 ?& X
6 G) \/ ~2 l' A3 [( N1 }# J
char ping_buffer[PING_PONG_BCNT];
0 I/ a; D- B* q. ~
char pong_buffer[PING_PONG_BCNT];
) a+ N; o5 a4 A9 I& j# c- c; s# C
3 T" g! q \3 ]# p! W
: X$ N) H2 K% I6 c/ x
8 J; {" p3 R \" C! {& P/ ~- B
1 [; ?0 N1 s8 |3 K) @2 N
static void ys_edma3_init()
0 n3 |3 E2 d0 p* E% Y% K
{
( s* C- z. |5 i9 ?0 `
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
7 P& w+ c& w' q8 O
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
. p4 L! ?6 h4 C0 y, B+ p' f. d
EDMA3_DRV_Handle hEdma;
3 p( b: Q- k; g# N
uint32_t chId = 0;
4 y V2 E7 f; ^3 A1 [; K2 m) A+ _0 C
uint32_t tcc = 0;
/ Y1 S9 r* N8 ?; T, r0 Q0 e, w
$ ]% m* X" f0 w) P
print2arm("edma3 driver init...",0);
& J9 ], _! X6 Z4 m' T! m
. ^5 N' Y) o8 z: g. Y; R! F# A
hEdma = edma3init(0,&result);
5 C- Q; b: g" b; W, c" X7 E7 T
if(hEdma)
0 g, u1 @' C( v/ A; d( n
{
4 q# K/ U1 l# X) z) g+ A* J. U: S2 Y
print2arm("edma3init() Passed.",0);
; f8 q! ?8 u$ D! x0 K, ?' z
}
- S; u+ l. j/ W l# }: O
else
# e$ i0 _/ I$ x7 E" n, G
{
5 D/ Z; s1 [' }1 ]1 [ z7 A) N" X
print2arm("edma3init() Failed.",0);
; q- t( @! `6 U% u7 V' D5 _+ Z
}
; h; Q8 Q. ?9 ?; X% X: x+ l
1 F i2 O' Y5 B5 F7 I0 O3 ~; |
if (result == EDMA3_DRV_SOK)
& b. k# G0 T# Z" \
{
* G) M% `- c- F. ^" {
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
( g3 S. y# J+ }
(EDMA3_RM_EventQueue)0,
/ n2 [. D0 d7 f2 ?% I
&edma3_isr, NULL);
# M+ Q9 n& l0 e7 p* S0 p
}
' [6 J5 o6 h0 ]. A1 N% J# W2 \
8 R+ q3 f2 u9 O* `3 L9 t
if(result == EDMA3_DRV_SOK)
" _ k7 W7 A B6 F2 X7 [
{
6 S$ y4 q: m! p: Q
paramSet.srcBIdx = 0;
( u6 d6 ]4 J' v7 V- `5 S
paramSet.destBIdx = 1;
- X6 k' f4 L5 \4 @0 e+ p
paramSet.srcCIdx = 0;
. [/ W B# S3 f; n& r" S; {
paramSet.destCIdx = 0;
# K$ E. Q3 a; t5 ~
paramSet.aCnt = PING_PONG_ACNT;
@2 w* z$ K) ^3 T2 T5 e+ G3 f! @9 b( O
paramSet.bCnt = PING_PONG_BCNT;
, a) }! t1 a, A1 B! Z' t: m- c- t
paramSet.cCnt = PING_PONG_CCNT;
- n& s4 R# r; p$ ^! H' f
0 w4 s3 e. j* d
/* For AB-synchronized transfers, BCNTRLD is not used. */
* X: [; p1 v. N& y' A4 n: ?
paramSet.bCntReload = PING_PONG_BCNT;
' X' ?+ ^: I6 U8 c* P9 ?( Y. ^
1 W) _+ |( M' b9 \: F8 y% X3 R+ K
/* Src in constant mode Dest in INCR modes */
! L- E! o/ f4 f
paramSet.opt &= 0xFFFFFFFDu;
# ~5 B& J9 y+ g2 G: N! q* h
//paramSet.opt &= 0xFFFFFFFCu;
: }# ^4 ?2 r4 ^ ?
4 T: N/ `% o( J* c
/* Program the TCC */
! ^% [4 U7 U; O2 I; T
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
z9 [' X: m+ X( u4 J' q! E) `
2 l8 W9 x$ c; P* p M, V
/* Enable Intermediate & Final transfer completion interrupt */
J7 z$ l7 d% N' I4 l% |
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
6 g+ B, i4 b) @7 I( {5 |
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
g' f3 p1 y0 Q
7 ?, x. q. C- W- P
/* AB Sync Transfer Mode */
) ~8 T& x% H( Q( J, y8 ^ i
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
4 H. _# Q9 ^: I5 J8 y
; a$ w- F- A; g3 Q- ^! d: a- s
/* Program the source and dest addresses for master DMA channel */
' ^2 i- A6 u. X0 `9 w
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
5 }& M/ q1 q" }6 W: T4 r3 J0 j
paramSet.destAddr = (uint32_t)(ping_buffer);
4 h# X+ W% j" l" Q/ o" Y, \$ S
# T% ] k% x8 j* B" O. P+ N/ ~2 |
/* Write to the master DMA channel first. */
4 Y' u; Z1 b" s3 F, z5 e0 g% m
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
6 V! W* v+ W3 W
}
9 q6 t* a4 J4 @1 z# |
( H$ p$ B1 o; h8 h- o1 _, Y
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
# g: R# i8 S$ V% ^
2 G; K6 J f$ N7 N# q
if(result == EDMA3_DRV_SOK)
, q- W* J6 i/ ~4 _/ k' a0 G1 J
{
6 z' \5 ^1 C2 y+ i% t
print2arm("edma3 driver init success.",0);
4 B' ]/ f8 m6 [# |5 D# }" I4 x
}
/ _: k0 L6 n- e; D
}
* s: @! Y5 m o1 O# O
/ _, J* A9 n9 Z/ h! K1 `, Q7 v5 i
8 f: Q4 G! V/ g7 s2 S* z# Y* F4 q
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
$ V9 K+ Z1 `- R2 k) z
+ Q0 ^& G4 g9 G
u$ ?) d# `! }. s1 E: h
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
8 I0 w8 ~' L) `' K+ k& g* v; {3 R
每次DMA传输完成后都要再次使能传输
5 ^6 r/ u$ ?' P$ u' B. q
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4