嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
: m8 D: Y. Y! G2 B) T6 j3 _8 }
#define PING_PONG_ACNT 1
: _) H6 C: H$ N, a% Y( [% F& b, q
#define PING_PONG_BCNT 8*32*40
( R, I0 o0 Y7 A* X
//#define PING_PONG_BCNT 1
?4 y a O" L3 L9 L/ D
#define PING_PONG_CCNT 1
# f1 R3 `% V/ ]/ e+ l' N
#define MCASP_BASEADDR 0x01D00000
& N/ P& s, K2 O# j$ _) o/ |
#define Mcasp_RXEVENTQUE (0u)
) a9 O$ X1 W/ Y
" R2 k1 S: g- S6 |& g
/* OPT Field specific defines */
* V' _2 ]6 `0 y
#define OPT_SYNCDIM_SHIFT (0x00000002u)
$ ^% f2 C2 D5 F; E
#define OPT_TCC_MASK (0x0003F000u)
2 j. h& S7 X. a6 r- O# P" O) R3 P! I
#define OPT_TCC_SHIFT (0x0000000Cu)
' i$ Y6 w X4 H. M |4 ^1 E
#define OPT_ITCINTEN_SHIFT (0x00000015u)
; f7 |) I9 W y3 @5 x2 C, P( t
#define OPT_TCINTEN_SHIFT (0x00000014u)
, @& a" A0 \& L, D" p4 |$ v( x
& C! f4 { S6 V' ]0 I8 R! O
char ping_buffer[PING_PONG_BCNT];
* f4 L6 y/ y0 L0 F
char pong_buffer[PING_PONG_BCNT];
/ u, M8 A; ^; ?. x7 Z8 L
4 V( D- N% K; E: z+ t
0 m. f {- E9 P. u. i, W8 O& Y9 x
( x0 c# y5 D u6 D
, O$ c* P- i- H. u
static void ys_edma3_init()
4 ^$ [7 s: w8 E8 M4 ]
{
# ]7 V( g; t$ H8 j' u4 P& m
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
9 m7 N! L: o* M. d& D" [
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
4 [/ D V7 F* W8 h+ D3 a& w8 J! Q
EDMA3_DRV_Handle hEdma;
( o% r3 o9 e3 K' c1 ?
uint32_t chId = 0;
( k4 z. L$ F! [) S3 E
uint32_t tcc = 0;
# }! ?! J) u" }( }9 e7 l T8 E
: n& \$ R# a, o# J) C) i
print2arm("edma3 driver init...",0);
1 }7 N- v P! k: N
- ~; R8 K: T* L9 _' b1 w
hEdma = edma3init(0,&result);
8 G5 V$ x+ x( C
if(hEdma)
# T6 B% d @) P, g9 [
{
2 t6 n8 X8 c! D3 ^1 r3 P
print2arm("edma3init() Passed.",0);
6 [$ I& K, Q8 i2 l5 o2 Q0 y
}
6 F$ k( C) G1 _, o
else
- P L. U! W& H2 b% f9 C
{
3 X# l6 A9 B5 _' ]+ R0 R
print2arm("edma3init() Failed.",0);
& \+ c0 C+ G. x& |
}
* _! j3 z" b% s
|: U5 s) f4 r! O# \
if (result == EDMA3_DRV_SOK)
& \" k! @5 M6 x2 d( l2 O# h9 {
{
" J1 d& _3 L% }4 w$ Z' d5 r/ K
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
0 ]% x+ w5 B+ d4 `: R
(EDMA3_RM_EventQueue)0,
: Y. F/ R% u9 V3 y/ L
&edma3_isr, NULL);
3 d9 |7 x: V2 [4 P/ V3 P0 X
}
- f6 z) f0 j, W
F# l+ E# Q+ r/ u8 f
if(result == EDMA3_DRV_SOK)
5 H% [0 E; x# H/ _, v" u
{
1 Y- m2 S* L4 b1 N+ r3 `
paramSet.srcBIdx = 0;
4 a/ P' B' {+ I" e: \; w
paramSet.destBIdx = 1;
& a2 }8 Z+ H1 W. O% Z. V# K/ K
paramSet.srcCIdx = 0;
" S$ e1 ?3 h5 j) M( t1 ]
paramSet.destCIdx = 0;
: a) |( C6 O5 X
paramSet.aCnt = PING_PONG_ACNT;
" x8 @! `( W# J6 z0 @2 w m
paramSet.bCnt = PING_PONG_BCNT;
$ V' |7 Q8 s1 `
paramSet.cCnt = PING_PONG_CCNT;
) u8 z3 A' C. m0 A
0 B O* F) r, Q* _% F' J$ {) o5 M, I( F
/* For AB-synchronized transfers, BCNTRLD is not used. */
0 i _* L2 g" k, G! W6 G# o4 {4 Z6 ?
paramSet.bCntReload = PING_PONG_BCNT;
/ a& Z; q8 j& Q) b
+ V$ k, j& U& K2 _: ^
/* Src in constant mode Dest in INCR modes */
3 c) S7 r' T2 z
paramSet.opt &= 0xFFFFFFFDu;
0 Z! H" Y* y0 h7 E
//paramSet.opt &= 0xFFFFFFFCu;
: c' B3 X8 P& }7 t
! r/ K" ~2 V0 b. }
/* Program the TCC */
4 L7 \ `7 {: b4 h& o' N
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
4 K+ v2 q, P4 q6 ~0 s. r' C# H
( j# e$ d7 N% o9 ]3 m( t
/* Enable Intermediate & Final transfer completion interrupt */
3 e1 u6 j+ [' C) ^; W1 ^
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
+ h" W4 Z0 s' w) E1 X8 `
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
8 {- U3 g* E/ ?% Q( K$ a# K
; ]7 M+ R# E1 G
/* AB Sync Transfer Mode */
1 h; j9 h) E- h/ H8 y5 ~. p7 b- T1 _
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
0 p. m9 i2 U& E- q7 }* P$ v
) V e+ |' F5 d5 d2 P& Y
/* Program the source and dest addresses for master DMA channel */
2 `( F# M5 u9 \! R& ~: K8 B7 ~
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
8 ?' h- i1 m, R
paramSet.destAddr = (uint32_t)(ping_buffer);
4 \6 q$ U6 h6 w( E) k
9 Z# o2 n, }& p" d# {9 t( V, A9 `& ^
/* Write to the master DMA channel first. */
- X4 U. Q4 [7 `
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
9 P' B! m: r) Y- q- H& t0 K d; \
}
( R8 H7 t5 u% c& _# ]. k
! F+ F8 G! s: \7 B" G
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
4 }# V. X% G8 c6 x' z2 H0 w: w5 ~ G
' I! F7 \5 n5 x4 P! L0 V X8 e. L; e k
if(result == EDMA3_DRV_SOK)
, F) [, A7 i$ B H5 ~
{
" D) w! N4 k; j
print2arm("edma3 driver init success.",0);
. _( N N4 m. b$ P! B
}
; |. t/ ~8 Q. V, j" c0 J6 E
}
/ _' V. k" \& `, u3 h9 w- h0 H
' K) L2 b+ p z2 F) S
& ^" ]# s7 S& i6 F- H* t
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
& {8 i Y+ @- W- O6 Z
) q( N2 J' [. ~$ e: B
; _/ {6 d. {/ A" F% ^1 R! h" f
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
C' \& @3 O% {+ R
每次DMA传输完成后都要再次使能传输
/ g) D) n+ V' V0 O
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4