嵌入式开发者社区

标题: edma3中断只能进去一次 [打印本页]

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
" X% l- i2 I6 f7 v. ^#define  PING_PONG_ACNT          1
/ ^' H5 _' T7 b#define  PING_PONG_BCNT          8*32*40
% t& ~9 N5 }* O: J. }- P8 K( ^//#define  PING_PONG_BCNT       1
: A9 d, t5 E; ]5 ^#define  PING_PONG_CCNT          1; z+ G6 X3 v% S; K. o8 U' i
#define  MCASP_BASEADDR          0x01D00000
! g3 @7 _! p6 q6 g4 ~: M#define  Mcasp_RXEVENTQUE        (0u)
7 S1 C6 i4 V/ a# K! o) @/ v# N) k8 v" l& m/ x1 U) b! q
/* OPT Field specific defines */
8 m( ]0 g0 a+ v& @; _' Y8 v" f#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
8 E) r* a1 u8 x#define OPT_TCC_MASK                        (0x0003F000u)
7 [5 w! P5 \) c#define OPT_TCC_SHIFT                       (0x0000000Cu)) U1 C$ H0 q" Z8 U1 h2 E6 z( O+ _' H
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)7 b7 i* p$ y5 A: P
#define OPT_TCINTEN_SHIFT                   (0x00000014u), D4 t0 _" W) I& \) a$ M; x
/ ^* d$ w+ R/ M% y# u$ m, Z
char ping_buffer[PING_PONG_BCNT];' J& i2 M3 R$ O4 t; e8 T( Z; M
char pong_buffer[PING_PONG_BCNT];
; e! c7 B* U0 f& g4 T8 c
: J4 ^7 `/ {& }6 b0 ^
" |# D5 d& m1 i) F3 `( z
6 t, X* i- D8 r$ }. W' W# N
& O; [" k! i2 O( b) Tstatic void ys_edma3_init()$ N7 V4 s5 I! I4 M
{
3 w# p4 \0 k5 Z6 u# _        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};; U6 h/ i7 A* Z( }1 g3 j
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
  Z/ S5 O7 C! j1 A* [# z# K7 V        EDMA3_DRV_Handle hEdma;
: ?/ `& m: A3 w) P5 \) r    uint32_t chId   = 0;! n8 R1 G* M# l9 U
    uint32_t tcc    = 0;
- \9 Z2 W/ {  a1 W% h2 x" n0 A
' y9 H1 t' R. H" E& k7 |" O7 J    print2arm("edma3 driver init...",0);
9 @6 C. ?$ c0 g* d
- W- T: Y! h6 g0 P/ @& N0 c  G. w        hEdma = edma3init(0,&result);
$ w# ^5 D5 x. F8 ^  ]% S0 w        if(hEdma)1 {. @) G" h( Q, g
        {, x, W% I1 n2 p
                print2arm("edma3init() Passed.",0);
8 l1 x0 B% m$ L& Z        }
4 T! E' l, e9 ?        else! Q6 X' A0 Z0 I/ b8 E1 S, _
        {. t% Y; l$ z2 q
                print2arm("edma3init() Failed.",0);
( _5 B( B9 K. @7 f4 r5 n" }2 e        }
( q6 v6 o& {% n3 w       
/ e1 ?; b/ J6 `2 }% r% T- a9 h( {        if (result == EDMA3_DRV_SOK)
* P: O3 N% o8 ^) Q' @/ v8 ]2 n1 T    {8 ?- `& t! J! Q
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,6 h0 [" M' e/ v# F( \, Y
                                                       (EDMA3_RM_EventQueue)0,
1 {7 }2 {8 `: [2 E                                                            &edma3_isr, NULL);
& \$ c7 b6 Z( b3 u9 F3 Q    }* Z1 u1 f: p8 T9 j
       
; Q# [5 v! }" a3 p: L1 q3 k1 i        if(result == EDMA3_DRV_SOK)& k* T5 t7 X- ?
        {: ?5 G" x3 R8 _* y
                paramSet.srcBIdx    = 0;" R; Z) n# o. D
                paramSet.destBIdx   = 1;
2 `$ A! p* o" o                paramSet.srcCIdx    = 0;
3 |8 ?5 z$ Q' q                paramSet.destCIdx   = 0;+ O0 i5 Q( ~% m, o+ U" w
                paramSet.aCnt       = PING_PONG_ACNT;) v+ r/ g3 f" B& e; K- I
                paramSet.bCnt       = PING_PONG_BCNT;
; |. N4 f, ?/ G$ F1 W9 u, Z                paramSet.cCnt       = PING_PONG_CCNT;  u& w  O4 t/ `+ q3 L1 f/ J& q, w
               
$ ]: _" f; y. M                /* For AB-synchronized transfers, BCNTRLD is not used. */; @3 B. D3 H, E
                paramSet.bCntReload = PING_PONG_BCNT;
1 @; N- m' ]3 T# c7 f( ^2 n9 E! Q
                /* Src in constant mode Dest in INCR modes *// R) s8 ^; i* D6 X! F+ B5 p4 o
                paramSet.opt &= 0xFFFFFFFDu;
0 M# Q, V+ |) f. I* L/ m                //paramSet.opt &= 0xFFFFFFFCu;
6 x1 r5 ?0 \2 P2 ?               
: R7 z6 f1 P' Y' B& W7 [0 w3 u                /* Program the TCC */
, O. f6 F8 }, ]4 V( l4 V. ]/ `                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
6 j2 L" s2 x: q$ o# x
- I$ q6 q6 ]) c" R                /* Enable Intermediate & Final transfer completion interrupt */1 {  b8 e, L4 B5 W7 X
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);# T. y' O8 l, H! o9 H* c
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);; x  @: O0 ?+ u. M/ L) w
- @+ c" Y6 c: a& {
                /* AB Sync Transfer Mode */: p# V6 s; f% r  p. ~, R3 ?
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);. T/ `; v4 U3 s& f; I3 J" U
               
, F+ r: }: J7 B9 `                /* Program the source and dest addresses for master DMA channel */2 c+ @" y. r' B2 d: S- n& q
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
# |' d4 {8 E$ Q" P7 R& n0 l                paramSet.destAddr   = (uint32_t)(ping_buffer);
1 F$ ?# n% z& y! I, z1 g& q4 K+ l7 S1 o2 \3 U- x+ n7 B
                /* Write to the master DMA channel first. */
1 {( d. S8 w" `7 V$ b8 h# Y- x                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);, l9 a4 Y( O8 T. _: x
    }      
+ h0 n8 }$ K' z8 d' l
9 Z- e# h8 P, E7 S        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);- J3 B" {/ T, E* n
       
# Q2 o9 A* N! U% W    if(result == EDMA3_DRV_SOK)
. S; ^; V0 l8 y' {    {# d7 A, P- j; m% v6 B
            print2arm("edma3 driver init success.",0);" X$ A7 D0 z) {8 j7 v
    }
' p$ W- ]8 ~* t! @8 F}7 Y' X6 i) ?; \% V" d. v& r" N

! |  O( ~' P; W; a) `& k
0 r& X8 {, T4 E4 ?) UEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。0 s" T+ h$ i* v9 s; y0 u
% I8 r* U/ \2 g) ~2 O

: }0 C1 d* }  \* C, M7 a
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
, o  t& @, {& _: N0 n8 g每次DMA传输完成后都要再次使能传输

, \) j; {/ Z( b原来是这样,我明天去试试,谢谢了!




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4