嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
& n0 {( L5 q/ ?2 w0 a' n
#define PING_PONG_ACNT 1
( C9 P2 ?6 r. W/ Z* s( k
#define PING_PONG_BCNT 8*32*40
8 `! K5 \0 Y: Z' c& c
//#define PING_PONG_BCNT 1
) i) O8 s$ l, H
#define PING_PONG_CCNT 1
' e4 k9 w/ A& \, R6 v5 k7 u, ?# i
#define MCASP_BASEADDR 0x01D00000
) {" t+ _0 W; s" h
#define Mcasp_RXEVENTQUE (0u)
$ \& e( O4 @$ |! f% y
& X: S. |5 e; v4 Z9 r1 ~
/* OPT Field specific defines */
& t& u+ y. a9 V5 B7 |
#define OPT_SYNCDIM_SHIFT (0x00000002u)
9 G" V. ~ F+ \* G$ ?
#define OPT_TCC_MASK (0x0003F000u)
* j8 @: A/ W/ f' \- r+ q
#define OPT_TCC_SHIFT (0x0000000Cu)
0 A o6 a7 I( `
#define OPT_ITCINTEN_SHIFT (0x00000015u)
/ e* h' W6 J9 f
#define OPT_TCINTEN_SHIFT (0x00000014u)
0 |2 a I" u [& X5 |2 v$ m; ]
& n# C' @" T' Q! {* @7 {
char ping_buffer[PING_PONG_BCNT];
7 a3 z2 c/ C" I' c# D
char pong_buffer[PING_PONG_BCNT];
! t) q' c2 B( p* S6 b* V
& ^' I) T. U2 G+ G8 a7 ` t* ~
' [' D2 M$ L. v
% \3 C* u, r+ X2 |" s
0 F0 c: o# r8 L2 d4 k/ r7 \! b
static void ys_edma3_init()
5 m* o; `) I0 z' e d& V
{
4 t8 }% t+ g$ G1 J ~
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
# }% u$ s/ X5 ~5 x p2 T
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
3 |; a" s2 K6 u$ y
EDMA3_DRV_Handle hEdma;
$ |9 p$ q- X% w
uint32_t chId = 0;
9 i! P, u, ]& ^0 P6 T
uint32_t tcc = 0;
* }4 @$ P; ?1 n- K% o
. R1 A7 u! Y) W( U o" h: H
print2arm("edma3 driver init...",0);
' |# U# O. q4 C0 r( k
/ M6 ]+ `0 V5 C! ~
hEdma = edma3init(0,&result);
/ l+ j+ q4 {9 H( l, c$ m
if(hEdma)
$ f6 x( ]: C8 c
{
9 \# V! L* Y, \
print2arm("edma3init() Passed.",0);
7 ]% W' ~* B, H. t* F
}
8 ~% H$ C5 l2 H- ~1 b/ @
else
( D% d, e Q- m. T* K
{
/ {6 v, n m3 `2 g$ A
print2arm("edma3init() Failed.",0);
2 U; p* O- d% | z& P+ c
}
& D) X" Y8 o4 k s5 X) z
! {" ?" S0 x7 P/ V/ I, \+ X
if (result == EDMA3_DRV_SOK)
; g/ O( e$ d6 G+ [1 ?- u! N; F
{
# r2 p2 Q, e! U3 n
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
$ c, v$ h& r3 Q% Y0 c
(EDMA3_RM_EventQueue)0,
* m6 G6 n0 V [+ c( @; {0 q; R
&edma3_isr, NULL);
t: _: h0 a H4 r7 B9 U: X
}
" n1 A+ R7 m$ Q0 ?5 `0 {# d
9 ?1 V, ?. s, g7 \, v9 ]' ?
if(result == EDMA3_DRV_SOK)
7 n" a: g' l$ {1 F5 J# |
{
; C7 W" q- b: x9 U
paramSet.srcBIdx = 0;
" J, E+ u( \: F2 q; S
paramSet.destBIdx = 1;
/ ?( U0 W% i9 C3 N
paramSet.srcCIdx = 0;
4 W) K) e+ N; f
paramSet.destCIdx = 0;
$ D3 V3 Y% X0 s( L& C! c" d" k
paramSet.aCnt = PING_PONG_ACNT;
, {$ n2 _! t- b: M a7 _% \8 Z
paramSet.bCnt = PING_PONG_BCNT;
4 a+ v2 w5 o" I! |. X H3 {
paramSet.cCnt = PING_PONG_CCNT;
5 g5 r* b# A7 g7 P! M% b* z
, N7 Z& q0 N, Q7 M0 `
/* For AB-synchronized transfers, BCNTRLD is not used. */
" e! Q$ f: X3 i4 n) {. I+ T
paramSet.bCntReload = PING_PONG_BCNT;
8 j8 m" I) c8 J7 s# ~- [8 j
5 `, U3 }- p! v' M1 x" c' z* i
/* Src in constant mode Dest in INCR modes */
8 l9 U$ E8 Z5 P
paramSet.opt &= 0xFFFFFFFDu;
, B9 W1 q' Z2 }3 e$ G3 a' e9 X" E, ~
//paramSet.opt &= 0xFFFFFFFCu;
) k7 J3 N' H8 P( R
' i3 e4 Y* N$ [0 H
/* Program the TCC */
& n3 r" q. J2 H# r/ w0 U; i+ Y2 ~- m! \. m
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
6 N' ]6 j2 W* G1 _: ?% w: _
* m+ O3 n3 |/ ~- X' w4 R. }
/* Enable Intermediate & Final transfer completion interrupt */
( Z7 Z) `# v: S! b0 }
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
9 M: R& I2 A) |$ m( B7 J" d
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
, \4 x9 r: O; N; S
* c' b" q6 n8 j5 @( F. | S
/* AB Sync Transfer Mode */
5 W0 N( p3 u M! @+ g" e
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
& t# t+ _0 P- H( a- M
5 F" d& |9 N. a( ?0 }# P% k
/* Program the source and dest addresses for master DMA channel */
9 v3 w0 M P% x7 c
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
4 j3 s2 r% J6 H: V
paramSet.destAddr = (uint32_t)(ping_buffer);
$ s9 u8 p/ [! f2 z8 @& V
) D& X( M* o' m0 ^ @; G' T6 y
/* Write to the master DMA channel first. */
0 Z3 x- V* Q7 @4 c1 s/ b. c7 |
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
$ ^- P, m- f& i' G$ A5 X
}
2 U. D! `0 n+ B7 f V
8 G' v1 f! u) V
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
: X) B# H1 l8 l& Y( _; w
: s( [+ Z$ q! U6 s X; W
if(result == EDMA3_DRV_SOK)
, f A" ~, j2 H8 s+ k
{
- O! X0 R/ }. d6 p' K
print2arm("edma3 driver init success.",0);
( Q& L& `+ c7 M k5 ?6 C% `+ v
}
- K ]- B8 E& b5 e+ Q# R
}
, H/ Z5 b0 F$ f# q2 D! q1 H* ?( Z# v
+ O% M' ~' [1 c$ T9 A; [
# P: n3 H8 d0 `! r
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
& A+ ]/ R9 C" }: f
& |/ _" N" m# [2 ~$ ~
8 X. l# m( y9 e" t$ P. ?
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
8 M8 D T* r- ~
每次DMA传输完成后都要再次使能传输
- T& V( L# H- ?$ T) g3 |9 @
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4