嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
. S- \+ B9 i* x# k3 f9 R/ a
#define PING_PONG_ACNT 1
) o, Z+ h) v) c! N( O t
#define PING_PONG_BCNT 8*32*40
- \+ K1 l3 |( i4 @; g2 ^' S- ^$ ]
//#define PING_PONG_BCNT 1
9 Z* _% h$ @ g7 |4 r
#define PING_PONG_CCNT 1
$ t) S2 C; ]% S1 X& [. d6 i% w
#define MCASP_BASEADDR 0x01D00000
' Q2 a& v0 Q: A/ R n
#define Mcasp_RXEVENTQUE (0u)
( F6 V9 W7 b0 f8 q. j( w9 w( J
, @1 P) Z+ C& U5 R1 `
/* OPT Field specific defines */
$ A! A b& ?8 H
#define OPT_SYNCDIM_SHIFT (0x00000002u)
" o) `6 g p! t X: F
#define OPT_TCC_MASK (0x0003F000u)
8 i5 t) Q0 w0 ~8 V C- A6 p
#define OPT_TCC_SHIFT (0x0000000Cu)
- F% ]$ ?6 r" h1 z+ R2 [
#define OPT_ITCINTEN_SHIFT (0x00000015u)
7 e/ {: G9 ~( i! `4 E5 Y" ]! W
#define OPT_TCINTEN_SHIFT (0x00000014u)
6 F6 E) R: A5 x6 R2 ] u
6 Z8 @$ U5 I# a1 N- A) ]
char ping_buffer[PING_PONG_BCNT];
3 Y% v4 H+ e' y( J
char pong_buffer[PING_PONG_BCNT];
" I; y! j" g% F9 u, f6 f
- f2 S+ L7 P( g B e
4 E8 R; K9 j, l7 P7 b6 i1 j( R& @
! h" ~# v: o0 l. g5 |
4 D+ B* w- k' ^# i7 ]4 X# j
static void ys_edma3_init()
7 \ ]3 y9 `; N# e0 H
{
5 S0 n- e; j# B
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
, n k* x- C4 N V* k( r0 A7 C1 Y' |
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
6 m8 _7 D( T1 _
EDMA3_DRV_Handle hEdma;
q" @; Y) ~+ \# x' ~6 O6 D0 d
uint32_t chId = 0;
* w4 s- k& n, x2 ^) T+ `; `; p
uint32_t tcc = 0;
o% e1 v2 v# \( J P! l: Y8 ^2 N: d
' `5 f; k# ^% A: X: L
print2arm("edma3 driver init...",0);
! j' n6 U3 n% H7 o
. f8 V, ~& a; s- H
hEdma = edma3init(0,&result);
4 S$ |* _+ |' y5 f) A/ t
if(hEdma)
9 L& S& B( g3 A+ C+ F, `
{
8 j" y$ k6 ?% v4 h
print2arm("edma3init() Passed.",0);
9 l3 X: m# W2 ~# t% I
}
( I B0 I( I, r$ H
else
# G( m: Z' d& W9 k
{
0 \. x. e2 n( }! }; S/ O; D) E
print2arm("edma3init() Failed.",0);
+ a' r" p! V, c% g5 \
}
/ i* j: x8 X. D ^; u! `0 O
1 k6 P1 g5 L% ~4 _( h
if (result == EDMA3_DRV_SOK)
" D& a! v/ n; Z4 x n, v
{
! J. e1 A! Y! `- A% l
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
. s, X' ^& v7 m# l; C! g& ]$ j
(EDMA3_RM_EventQueue)0,
0 k, X. r2 ~# O! z
&edma3_isr, NULL);
7 r. _" a" i7 m
}
+ I, f" P! d! j n8 O# `
" T5 F9 I/ x4 l- p7 }& X
if(result == EDMA3_DRV_SOK)
' Z0 W+ d8 y& E6 ?+ t: b! F
{
$ T& c; }5 n$ q: g& F* i* h+ y
paramSet.srcBIdx = 0;
6 ?' j: ^$ o6 J/ P
paramSet.destBIdx = 1;
# S. W0 i: |# O8 _
paramSet.srcCIdx = 0;
2 }7 X; l2 z7 o) s
paramSet.destCIdx = 0;
t N' T& [% [7 U
paramSet.aCnt = PING_PONG_ACNT;
: I0 E7 O" f5 B7 V4 g& u% W
paramSet.bCnt = PING_PONG_BCNT;
2 n( D6 c% G$ _5 {4 O, v
paramSet.cCnt = PING_PONG_CCNT;
4 e+ x* P+ M# r4 Y8 A
, Y3 M7 w. n7 {* l- |
/* For AB-synchronized transfers, BCNTRLD is not used. */
/ j8 S, ~) w& L- \+ s
paramSet.bCntReload = PING_PONG_BCNT;
1 \5 z& s" X W5 M* Z
+ Z2 `/ Z- E+ l4 U) K
/* Src in constant mode Dest in INCR modes */
4 o3 o8 B. ]1 C& ^ e- Z6 x* v
paramSet.opt &= 0xFFFFFFFDu;
, _) x% Q4 y, M2 ?/ }6 I Q5 |
//paramSet.opt &= 0xFFFFFFFCu;
" s; x( N8 e* ]; [- ~6 T2 y% ?
. A1 f8 X- S& w/ J' E
/* Program the TCC */
7 \+ i1 E# V- E) i$ I3 f
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
; k! K3 {8 a8 t( ~6 u% f% \
* a0 |: b% m. ?+ u) [
/* Enable Intermediate & Final transfer completion interrupt */
3 x% T4 N& I$ T9 y! V
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
8 d" C1 V' x3 l! e
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
) Q0 c, y6 |4 b2 I0 x* v3 M; T
J- R4 ^; `! J; \% N y) X1 M
/* AB Sync Transfer Mode */
" j9 K, @7 l7 Y" y0 e" l2 r
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
$ t( X8 a7 W3 J9 l' X- l
' A- A- Z' h" V7 {
/* Program the source and dest addresses for master DMA channel */
/ Y; x8 Q* y) u. B! s
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
. V+ y! O+ P7 x
paramSet.destAddr = (uint32_t)(ping_buffer);
% h3 d( v& g z* `* e9 F; G
$ I( @2 S1 {& R, D% V6 Q2 g R
/* Write to the master DMA channel first. */
) E* O6 }- |, x F I
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
/ ~5 n {, n. b o
}
. ^: x2 ]# p$ d6 |, k/ S
! G2 z g- @1 k/ K" w
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
' `! m, q& R& V: B$ l
7 U) h. I5 ^# m' _+ ~3 V# w q4 F. y
if(result == EDMA3_DRV_SOK)
( ^+ S8 g7 Z7 y5 J" t- [
{
& c, g4 K, b& A9 ?
print2arm("edma3 driver init success.",0);
% o& k( O7 c& l8 a* N
}
% L3 U* v! j3 K) f) l
}
/ T" Q& H1 e5 l6 g) `
# s( `4 b5 ?: Y |; K
+ x0 ~1 a$ C$ H6 y. ?
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
8 ^% |+ ], Y& @, `* N! F
' s) l6 m7 x0 K& b8 W) j7 P
/ I6 u, {" U+ F6 s
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
* X0 N J# c$ w0 B8 G
每次DMA传输完成后都要再次使能传输
% `! c/ Y+ c4 K8 K% [
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4