嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
5 @( U- i( L: l2 F/ `4 I
#define PING_PONG_ACNT 1
`: z9 W. r, C! G3 o. i' S
#define PING_PONG_BCNT 8*32*40
2 o4 B" y( p' k' D3 I
//#define PING_PONG_BCNT 1
5 m- ?6 v( n: ~% B* \
#define PING_PONG_CCNT 1
) F; w; d2 Y' l, z% n& o3 o) {& @
#define MCASP_BASEADDR 0x01D00000
8 B5 C1 X! d+ v+ u' Z; N* B8 M: V
#define Mcasp_RXEVENTQUE (0u)
! v% v8 K1 D. I1 b( W) L7 R
( f1 e. j8 |: s* T5 X* {
/* OPT Field specific defines */
7 }# P1 b$ p! j K
#define OPT_SYNCDIM_SHIFT (0x00000002u)
4 c% q1 v/ T7 r$ M
#define OPT_TCC_MASK (0x0003F000u)
- i7 ~* ~% o' h) j
#define OPT_TCC_SHIFT (0x0000000Cu)
& x) }1 S2 `# S0 d2 E
#define OPT_ITCINTEN_SHIFT (0x00000015u)
: N8 D- t& W; a! T5 x# _' g9 ?
#define OPT_TCINTEN_SHIFT (0x00000014u)
0 f+ N" h9 c/ z& r7 g
! B, v) d4 q" H- o: _6 k
char ping_buffer[PING_PONG_BCNT];
% |* w: c Z) ~5 _: k
char pong_buffer[PING_PONG_BCNT];
7 B, ` u7 }: v1 i. ~$ V0 T' {
$ X# ~$ n% c5 u2 f. a* o. b1 p2 Q
( N V' Z" ]! X2 s! v$ m
- p0 v% o5 S) j0 _9 B
7 j- I' g" V/ H) @8 ^
static void ys_edma3_init()
2 |9 ?% |/ N( p1 r
{
: e! G) d0 G! ]) {$ l- h+ |+ c: g
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
/ x( S" K& g! \+ O, f
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
5 y3 t+ p+ d" B# h$ ]9 ~
EDMA3_DRV_Handle hEdma;
! o" x; {7 x4 ]+ m
uint32_t chId = 0;
" ?, u% G; {2 |6 \8 n
uint32_t tcc = 0;
2 s" C5 V& N& n* a9 S& v
+ S M y% ^3 d" u% F& G
print2arm("edma3 driver init...",0);
$ s; A- y4 V; b6 G
' c2 W% w8 @6 y( u
hEdma = edma3init(0,&result);
( M3 r( l0 q8 H" R) k/ `" H% N9 y
if(hEdma)
/ ~% P! r* M1 Z4 Q. _
{
1 r9 U% p. U- x+ Q( E
print2arm("edma3init() Passed.",0);
* ?9 b! J- i; M1 ?# V
}
# O, O$ y* S& a- p# O ?
else
5 c% z$ z* S% g- q: [; `6 {
{
) H7 u4 P& a( \2 I
print2arm("edma3init() Failed.",0);
* H5 q- z; m: U. P/ m
}
: K; X6 h$ x* t
9 w% W, @9 M; s' M5 g [9 D$ i2 X9 F6 }
if (result == EDMA3_DRV_SOK)
7 [# j+ ?$ F# W, X1 u% M6 e. x
{
% `) e0 z& }4 F X/ w* B- e! S7 J
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
8 s0 S. B: S" T; l
(EDMA3_RM_EventQueue)0,
- D) g9 K! d: J9 D) ~5 r: W4 ~
&edma3_isr, NULL);
) |( ?% K1 R( U+ K! a
}
% A+ g7 ]1 x, A, `
( Y- s4 _& `! q+ a
if(result == EDMA3_DRV_SOK)
6 I- Y0 ?' {" I( W
{
1 b4 m7 X1 |6 x) Z3 p7 ~
paramSet.srcBIdx = 0;
9 N: i& C6 N$ B9 Z4 M
paramSet.destBIdx = 1;
, W5 o9 [, t' L% a! }6 i
paramSet.srcCIdx = 0;
8 D! Q; G% d* |" Y3 J# F% M
paramSet.destCIdx = 0;
% W$ W* P# ]0 |7 O. a$ b+ p- l9 h5 Z
paramSet.aCnt = PING_PONG_ACNT;
X4 c& h2 F4 \# W+ U8 r
paramSet.bCnt = PING_PONG_BCNT;
: T' Z- o0 `% }# Z
paramSet.cCnt = PING_PONG_CCNT;
1 k7 W$ x4 v2 K& p, u. z( Q$ r. W' B# d* Y
% _: U! ] D8 A+ ]# e
/* For AB-synchronized transfers, BCNTRLD is not used. */
$ k' G% ^$ J# w" W+ ?" u4 r
paramSet.bCntReload = PING_PONG_BCNT;
- _, p& ^/ H1 R" g3 t& t4 ^+ t
' R7 Y( o( s; ^; X5 Q+ L# _
/* Src in constant mode Dest in INCR modes */
7 M/ ]0 n! q, w4 g- e5 |. w6 W1 r
paramSet.opt &= 0xFFFFFFFDu;
3 K6 O) A4 s; T7 ?
//paramSet.opt &= 0xFFFFFFFCu;
8 N% |/ [% L$ \% p9 M
+ m6 l y7 f5 T% }
/* Program the TCC */
' q2 [* |2 R0 S- u
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
( l6 q. T: p; ?: T& n
% V( K! g+ \8 @( |3 `
/* Enable Intermediate & Final transfer completion interrupt */
$ c: O/ H* d! e' D3 A0 P5 R# Z. @- E/ N1 j
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
+ A$ ~# o# s4 C& X0 ^% h4 t
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
, L0 ?' n* ^( ?) c4 s
) r, m n; }9 l) m6 Z
/* AB Sync Transfer Mode */
! O5 D/ q7 \: w
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
4 W S& Q$ _+ m N' J% q! y% b5 @
+ J" `) [( E9 S
/* Program the source and dest addresses for master DMA channel */
- X0 v! O5 A! L+ v6 C
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
$ S( {4 w9 k5 o4 Y3 T) W
paramSet.destAddr = (uint32_t)(ping_buffer);
, g o6 I1 d4 h, ]) H& c R
' h. X5 F3 ]+ a0 ]: @
/* Write to the master DMA channel first. */
5 y6 j4 u- e- t3 q
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
0 _# N0 A6 c' M3 ?1 `. J( a0 U( U
}
' Y8 O+ w+ z/ X. b
+ q7 }+ \1 r% W% U2 h9 N+ ?. o
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
" W/ ]) U5 k8 t' M1 x+ }6 z8 d
) z; m& l: U; q9 l' c* n7 f
if(result == EDMA3_DRV_SOK)
; y! U" B1 k( o. e' @* U- o/ m2 c
{
. o2 q3 r5 X/ g8 R6 R4 r
print2arm("edma3 driver init success.",0);
; ?) @: A Z, H
}
3 E* |( Y$ V$ r2 U" b7 u
}
4 Z. l2 I& ^" @1 {2 R( C* q
. t9 t4 a: p5 o* r5 a0 e; F6 U2 m/ k
% u' V3 {+ B' k: r* j& U
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
" v5 w. S3 Z. V
( I6 p* L& C4 }/ @* s: p
+ V8 Q1 Y2 }& b/ f+ A5 e, G
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
" ]1 }4 p( ^! S8 f8 m
每次DMA传输完成后都要再次使能传输
1 ~* e4 [ n, g
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4