嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:% Z% ]2 ?( g- X* r6 ~" {
#define  PING_PONG_ACNT          1- l6 l  B! M6 Q
#define  PING_PONG_BCNT          8*32*40
* |0 e# H6 z# j//#define  PING_PONG_BCNT       1 & q' D& ^" i  ~( O/ l% u" W
#define  PING_PONG_CCNT          1
6 N2 y2 H  }: i/ E3 w#define  MCASP_BASEADDR          0x01D00000
: W  o# p. C- \' g8 v7 p& Q#define  Mcasp_RXEVENTQUE        (0u); s) m8 o2 s5 S

+ I! l9 J, I* `/* OPT Field specific defines */8 B0 l" m" q7 P0 }, b" P
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
# g5 n2 Z8 f# x#define OPT_TCC_MASK                        (0x0003F000u)
% |5 ~0 B- B+ {& J0 m. Q. K: I; [#define OPT_TCC_SHIFT                       (0x0000000Cu)' i8 N- ^. \5 ]5 d. e
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
& |. \+ z1 |. ~& j* f; i#define OPT_TCINTEN_SHIFT                   (0x00000014u)% A2 a/ N# e' x8 H
0 G. e; h% W+ a4 G
char ping_buffer[PING_PONG_BCNT];
0 b# L& x5 \( f% \) ?char pong_buffer[PING_PONG_BCNT];
# M5 c- H# x: \# R* `1 l# Q; G
2 U  E4 _  ?9 d( q* Q, H+ g4 H) [- F4 I) s0 q: z- A3 r1 P; `
$ J/ M: O5 B6 k1 X6 s: \1 \+ f
# D2 C- k9 P5 r! o
static void ys_edma3_init()5 N* _- R- |& F- D* a
{
4 R* ~/ L3 h- F, \4 s        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};6 K) N! R! n& O5 h5 L
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
( G1 [: B1 v, h' u+ k! ^& A9 Q        EDMA3_DRV_Handle hEdma;6 |2 s' ?/ n/ C. K  x$ o
    uint32_t chId   = 0;
4 i, k+ y  }! y3 q: F9 _, ~% C    uint32_t tcc    = 0;
9 D  O7 H' `1 C# }4 M1 N& U( ^5 s; r: k
    print2arm("edma3 driver init...",0);" Y2 h7 d$ u* q6 u

* B0 h7 z/ a( b& h; o: O        hEdma = edma3init(0,&result);: J" u: C8 i4 C7 U5 H" y1 I
        if(hEdma)( o6 I; R2 @6 Y+ n% Q* r
        {( U6 @7 n: e! x* A7 X9 y+ c
                print2arm("edma3init() Passed.",0);
. z! O( c, E( H% y2 T6 x. g3 i9 \        }/ j, T" @$ ?# V* H3 \$ C! G
        else, y6 Q$ g  a5 w5 y
        {& C& ]: g- \3 B
                print2arm("edma3init() Failed.",0);2 w" s# u+ j" \, g7 T) \
        }6 G; d  x, L% E+ C. z
          L$ V3 U8 Y2 T
        if (result == EDMA3_DRV_SOK)# {( e6 @4 l/ m
    {* F. \# ]2 [" _+ ^) ^/ @
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
9 t- r( [# I2 ]  R' |' P% N                                                       (EDMA3_RM_EventQueue)0,1 M3 U  K) L) a6 i$ C1 x' P
                                                            &edma3_isr, NULL);
# m8 ~. I) d! d9 M    }5 Q: T! }' W$ r: w, j
        - N4 Y, r3 o: m3 ]3 ?5 C# r
        if(result == EDMA3_DRV_SOK)7 a- M. b* w) G6 T6 q( @/ c2 B
        {
& C) ?/ r# E! H7 Z/ x- D4 {                paramSet.srcBIdx    = 0;
+ h, k9 L% }' Z                paramSet.destBIdx   = 1;
* t7 V( U1 }, s% I6 p5 S2 ~                paramSet.srcCIdx    = 0;
$ x- u1 X1 X2 \# _$ a* i                paramSet.destCIdx   = 0;
' i  ^4 M$ y5 E. N; t1 b                paramSet.aCnt       = PING_PONG_ACNT;4 N  k" g. i7 Z6 N( D) f) l
                paramSet.bCnt       = PING_PONG_BCNT;
) v* ]$ U$ x. ~1 n. G' O                paramSet.cCnt       = PING_PONG_CCNT;) g8 E% S5 H  ~) R; ?3 f
               
' D, {8 p& `( Y7 ^                /* For AB-synchronized transfers, BCNTRLD is not used. */! m( U  v- c6 m# H" Y
                paramSet.bCntReload = PING_PONG_BCNT;
; D2 f1 Q3 ?2 Q, {& W9 I; i/ i( J% G$ ~& s& O) i( a
                /* Src in constant mode Dest in INCR modes */0 I: T- V* {7 D6 _3 ]% o: D
                paramSet.opt &= 0xFFFFFFFDu;
0 ^. I- D% {% _- L1 `, v; d                //paramSet.opt &= 0xFFFFFFFCu;
. }6 A- ~0 K; `* {                7 a3 ^- x: E6 w
                /* Program the TCC */8 K0 H' @* t% B6 X/ ]
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);" B; k+ w7 K7 n# p) r
# {2 i" r# o5 x1 u
                /* Enable Intermediate & Final transfer completion interrupt */
' X! Q( D4 g4 T# a) o2 f                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);, N0 N7 M: O: x. V. f" T2 e
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
% p, w  w) C& ?1 o1 z$ U, W/ S7 T: k# Y: c3 d# u% t3 \; B9 p
                /* AB Sync Transfer Mode */9 v6 e% t1 u; r% ^& F
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ @2 F3 \; q( i" R               
$ l  H8 F1 e4 w6 J                /* Program the source and dest addresses for master DMA channel */
% \4 V$ \# O! t% D" N- Q                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);0 L8 E& |( r' Y" n/ i4 |
                paramSet.destAddr   = (uint32_t)(ping_buffer);2 B6 P. v' |; r& R, c7 X

1 C/ {! M% l; J% r/ J' a                /* Write to the master DMA channel first. */! x0 d% T! S# F8 k6 S
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);( w& U; X+ t- e7 v6 E2 V
    }      
4 q3 N) G1 q( P' U9 E% P: L9 W# l2 m' x9 [+ x7 G: `
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);( N6 H2 M1 F: M" }; _  l* j' @
       
+ P2 Q) t4 [! A  g- E, I! S    if(result == EDMA3_DRV_SOK) % T6 S8 d$ x: ~& d
    {& M& O6 m* r+ E& }& a( r
            print2arm("edma3 driver init success.",0);/ {& i: ]* d* t' R
    }   q4 I) ]: P6 j1 A3 S
}$ U; a7 U# h! M' A3 N3 A

; x- a/ ]: g) F' g% T
0 d4 A6 ?' p; c6 f( r" Y' W5 MEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
# j3 O6 A* C( K# a0 C
4 C+ c  l$ n. A5 m; T3 h, E9 U( h9 E4 F- a9 {/ K

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47. J2 v, i; V" A9 L% e
每次DMA传输完成后都要再次使能传输

# D6 t! W- h! k( I原来是这样,我明天去试试,谢谢了!




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