嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:. f" s5 N" j( X
#define  PING_PONG_ACNT          1
; B  P4 O- w6 x! A+ S! |#define  PING_PONG_BCNT          8*32*40
& O) u% u; H+ B0 R//#define  PING_PONG_BCNT       1
* R* ]4 O4 A7 W#define  PING_PONG_CCNT          11 I+ p/ m  I' Y; |0 g
#define  MCASP_BASEADDR          0x01D00000
% i8 w" s% P# W3 I0 ]! M#define  Mcasp_RXEVENTQUE        (0u)
! E! i9 J# E; q. p* \1 T& U' s! F' L+ N. P& _
/* OPT Field specific defines */
  U7 J4 @/ Y( E+ K5 b#define OPT_SYNCDIM_SHIFT                   (0x00000002u)5 w+ V0 T, G' _8 r, F2 t" b" m
#define OPT_TCC_MASK                        (0x0003F000u)
. G+ F' t! @; j8 W0 w: j#define OPT_TCC_SHIFT                       (0x0000000Cu)
% c4 _" _7 J! C& |! D/ ^! Y#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
3 Y9 _% z& Y5 V5 x#define OPT_TCINTEN_SHIFT                   (0x00000014u)
4 n: w0 L! T2 B2 U+ i$ ]
1 s! i  b: P  Y; V2 f" r1 zchar ping_buffer[PING_PONG_BCNT];
& ]* ~' f6 g" A# k) u5 |char pong_buffer[PING_PONG_BCNT];
% c& k; Q3 B* \) k! W- m& y: F6 e# Z; l
0 H6 h- o9 c( Z2 z8 J8 U4 C

" d! a6 O+ s* u+ Q) q# G' A# C- d, @) V" j, r
static void ys_edma3_init()2 j+ z' J9 s# S
{
- m+ ?+ P1 h! b8 |        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
0 k2 I2 A- _) {- ?5 X: S        EDMA3_DRV_Result result = EDMA3_DRV_SOK;" p8 W% r4 T0 O6 L* E$ A
        EDMA3_DRV_Handle hEdma;# G0 o0 _) n! o/ {( l4 R2 j
    uint32_t chId   = 0;
1 @- c' v' v7 z& F* G" Q& G    uint32_t tcc    = 0;
- h7 \4 I0 r; V- d2 E- l* w# K
! L1 T# H# N# P6 N- v7 C    print2arm("edma3 driver init...",0);; \* V5 q6 J, O7 P
9 e4 L. o5 r9 @) I/ \+ n1 E+ P2 \
        hEdma = edma3init(0,&result);$ |+ X% u5 K6 C
        if(hEdma)
: B  c. w0 U' u! G( x0 u: q9 |) m        {
! u7 U$ D) l* ?8 g% _6 e                print2arm("edma3init() Passed.",0);  R1 A" Z: t# g, f
        }" o) u- k4 x/ w3 ~
        else
* T( u2 B9 Z8 x: y4 a, }        {! v- L3 |" m& u+ C+ |4 x. `; ~
                print2arm("edma3init() Failed.",0);
% t1 M6 V, b3 T        }
* g. q, y; F: V! y        7 s+ I! N  b$ R* X$ w7 K! a
        if (result == EDMA3_DRV_SOK)8 r0 |% V* g/ U% k8 A) l
    {
/ A8 L0 t) U$ k( B4 p* Y                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,  u# Y( V0 ~- r
                                                       (EDMA3_RM_EventQueue)0,
7 \) c' C4 Y  k$ F8 d* E                                                            &edma3_isr, NULL);) T2 @1 o# o7 z! X2 ~
    }4 A' K$ S- }9 a
        ) k2 l/ f' ^0 R0 y' ^$ G1 v
        if(result == EDMA3_DRV_SOK)
0 r9 ^- Q9 X5 f# M1 S        {
# \# t! d7 R- n1 d& z( R+ Q, W3 k! Z                paramSet.srcBIdx    = 0;) L1 n9 E+ X. Y3 k
                paramSet.destBIdx   = 1;& F+ \$ D+ c0 ]% d" M
                paramSet.srcCIdx    = 0;
4 }/ y' y/ Z, M: D4 }: k% q6 A+ J                paramSet.destCIdx   = 0;
; a9 j7 b. O- b                paramSet.aCnt       = PING_PONG_ACNT;
6 z/ s0 E' H; z4 Z0 o                paramSet.bCnt       = PING_PONG_BCNT;4 p/ ]3 n- M2 {% q
                paramSet.cCnt       = PING_PONG_CCNT;: R' s$ O. A# }4 U1 c0 j0 |( N
                7 q! v* r  l* m9 }% X
                /* For AB-synchronized transfers, BCNTRLD is not used. */
; q+ k0 C+ Z2 i8 n                paramSet.bCntReload = PING_PONG_BCNT;. S$ i2 \8 K# k9 b0 c$ T$ v+ ]$ S1 V

! S. b- Y9 R  ?6 B, J6 ^                /* Src in constant mode Dest in INCR modes */
+ v8 J: {2 P5 ]1 e                paramSet.opt &= 0xFFFFFFFDu;$ a# M6 u4 N/ X
                //paramSet.opt &= 0xFFFFFFFCu;+ X+ O, E8 _9 ^. t2 B+ Y# M
               
) @4 ?$ s/ H, U: o                /* Program the TCC */
, Z! Q3 I: y3 C0 p  o; r) z9 x2 G                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);& k/ Z; F& @# R/ S

: e4 y4 f/ c( N$ m                /* Enable Intermediate & Final transfer completion interrupt */* o+ y  G6 W2 O; v3 k
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);  x: f3 _1 u6 u: A! ~- q8 a
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);' T& `- v) T( b. P
) w8 D, Z; N2 s4 Z; @9 V6 I4 N0 s
                /* AB Sync Transfer Mode */
5 `  Z" U7 f! f, J% S5 u( l                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);1 u' E. X: E# d& h
                ' O6 F4 q: {6 k. g6 o. g
                /* Program the source and dest addresses for master DMA channel */( v6 k' q8 d. }5 h/ h( `
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
" E$ @6 Y$ |' {1 p3 U3 \                paramSet.destAddr   = (uint32_t)(ping_buffer);5 P1 m& J% x7 ~% V/ J

0 p1 ]8 V# u) ~6 f5 s                /* Write to the master DMA channel first. */
$ W* r# z% U- c; C$ w                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);1 I1 _1 {4 E5 N8 w& ]
    }      
! c8 q- Z; c% F2 w2 r
# d# U7 [# w; |        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
$ K* k$ f. B4 B0 l0 i        ! o! y& v" a/ w2 R1 w
    if(result == EDMA3_DRV_SOK)
. P# G" {: k7 t' e0 I$ A+ Q    {5 _* S! W) l' f/ I6 X6 d. J
            print2arm("edma3 driver init success.",0);
; B0 B. A8 c% w    }
+ D3 p9 a1 J/ ?, O9 q) A6 J}
3 _; \" d! q, t8 R  C
+ V4 K7 h# |( J7 {; w# X- ]/ D2 K% W0 c
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。7 u3 u# t9 a* B8 n+ O

3 y7 J2 f& @5 o6 o
0 ?# ^& K$ }8 D+ S/ ^6 {- |
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47& ]5 K9 \0 A' S  x
每次DMA传输完成后都要再次使能传输
5 C) E' _# K* H/ ~8 M
原来是这样,我明天去试试,谢谢了!




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