嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
6 R/ x3 `5 i. k" h! b0 w#define  PING_PONG_ACNT          1
2 J$ R( A5 q" P0 z#define  PING_PONG_BCNT          8*32*40 . u- ^- a7 i1 e: s' ~! B! L' r7 U, C! I
//#define  PING_PONG_BCNT       1 6 {: |0 R, F. x  W' {$ I7 U& h
#define  PING_PONG_CCNT          1- R) l2 V/ ?0 |5 r
#define  MCASP_BASEADDR          0x01D00000% O7 x1 @6 Q6 P% g  Z! _# G- L$ s7 d
#define  Mcasp_RXEVENTQUE        (0u)
6 t' R$ K: e+ h, u+ E( L' v' E  ?/ W; K9 s% z- K% k
/* OPT Field specific defines */2 a5 B/ D6 i8 s  Y5 u: ]* `
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)0 I. K& r6 h* B: p% g. Q
#define OPT_TCC_MASK                        (0x0003F000u)$ u2 g# T6 P' Q4 C) U
#define OPT_TCC_SHIFT                       (0x0000000Cu)
9 ]8 v( n9 e6 z" E* ]' r% }2 ~/ Y1 N#define OPT_ITCINTEN_SHIFT                  (0x00000015u)8 c- K2 L2 Y+ T- Z2 P
#define OPT_TCINTEN_SHIFT                   (0x00000014u)* k2 v4 l& ?; W! T5 [$ `! T0 p
, g3 w6 G0 A0 @$ u
char ping_buffer[PING_PONG_BCNT];+ T) F7 s: M& |& X0 C
char pong_buffer[PING_PONG_BCNT];/ M1 Z3 _+ ~' \" W/ W) c
& m' N6 B1 g2 j0 |
0 Y; R# o4 G" A  Q! N. k

+ q* x( c2 e3 m# C( h% a5 q5 C. c# l; m; F
static void ys_edma3_init()& R8 ]" ^2 I. V& p) V
{
: n8 r% o$ d7 s: ~5 H5 |9 N        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
+ o# U, p' y5 t7 U        EDMA3_DRV_Result result = EDMA3_DRV_SOK;% |0 ^2 [- h! N9 ~7 H
        EDMA3_DRV_Handle hEdma;7 J1 C5 {0 j0 Q2 y5 I* x. R% W; `9 d
    uint32_t chId   = 0;
( X0 {2 E% _9 l& x% ]# ~' R    uint32_t tcc    = 0;
1 Y& l* ]# @' h! k$ ?3 {
3 r1 E" t6 g' J( F5 h    print2arm("edma3 driver init...",0);+ T. G$ Y# y) R# L
4 Z$ u" P! n! W: \3 a7 ~$ E
        hEdma = edma3init(0,&result);
9 b+ Z3 c4 |( ?  H- ?- I8 ]+ V        if(hEdma)
+ L. O3 f- |4 L& U4 f- `: D3 v7 Z        {
2 {$ ~* M& v- N! x/ B2 c; Z, [                print2arm("edma3init() Passed.",0);
8 a% U3 `/ V; w: B        }+ b! ~+ T8 }& I% q
        else
1 T+ v5 s7 v# y        {
) p$ t) @$ T5 l' I+ ]  O$ M                print2arm("edma3init() Failed.",0);) _, J! B2 Y9 Y! j8 e  K
        }" G: H, W! Y# z( ^8 D4 b
        & g) \) f9 f+ ^% U3 }
        if (result == EDMA3_DRV_SOK); h* O3 _3 A4 k# m
    {
/ b+ @) g1 l0 W, l" j                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
: _! K9 ?) \4 f7 ]! W/ T                                                       (EDMA3_RM_EventQueue)0,! |1 j6 P% z; F4 \( j4 ^; Q# P6 a. x
                                                            &edma3_isr, NULL);! M4 y1 j2 m/ a$ {+ r  l5 a1 n
    }. q0 H$ a' L1 H) M0 p
        3 ]2 G. q5 l6 c$ ?
        if(result == EDMA3_DRV_SOK)
5 f+ H7 V. C3 D9 d6 I( p        {
0 ^. g3 W5 F* l/ a& i) b0 a% t                paramSet.srcBIdx    = 0;
  z6 Z" W9 O& j' t4 d+ C                paramSet.destBIdx   = 1;
* j. ~+ I. u2 v( _$ X6 P5 B6 z                paramSet.srcCIdx    = 0;
  }0 ?% n6 i" n+ x% D                paramSet.destCIdx   = 0;
# P+ m5 Q: F) t! y# f3 Q& f" ?2 p% ^/ X                paramSet.aCnt       = PING_PONG_ACNT;
$ M! H2 f+ `: d, s8 k                paramSet.bCnt       = PING_PONG_BCNT;
  O% B7 U% X- E                paramSet.cCnt       = PING_PONG_CCNT;0 E1 j" }9 f4 a* d5 f- k
                5 T0 Y  m3 ]" T' d
                /* For AB-synchronized transfers, BCNTRLD is not used. */
( E4 |' B; r0 G$ D) r& Y                paramSet.bCntReload = PING_PONG_BCNT;
4 }  x% D$ K6 a( p. `" l# d  w1 |" X: @( Q1 z+ f& H2 x# s) b
                /* Src in constant mode Dest in INCR modes */# C6 B* S. b) W. K. X
                paramSet.opt &= 0xFFFFFFFDu;9 g- R+ m; V* s' _
                //paramSet.opt &= 0xFFFFFFFCu;
! s2 g7 u$ [% R2 d" F2 e" c                / E3 i9 |0 t6 e2 f# U; }  D
                /* Program the TCC */- T: V2 M/ o, W3 i4 c
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
/ ^3 \' `& h- q$ S$ p
' t; k8 F( ?" ]- V# m+ I1 v                /* Enable Intermediate & Final transfer completion interrupt */. r! f, w( P& o- b+ v
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);1 L# L7 Y" Y; u! [! o: v+ N
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
8 h+ ~" M$ M  U$ B
, q- O7 e. p( M5 n6 {                /* AB Sync Transfer Mode */
0 e; p1 Y/ x/ B, _% |                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);  u0 W7 N1 o( l2 c
                $ @/ R  T& S0 J5 m
                /* Program the source and dest addresses for master DMA channel */$ K2 }/ C3 N; A9 |: j# u
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);# e5 l; k( F. M) o! y- B: S
                paramSet.destAddr   = (uint32_t)(ping_buffer);
. N' m$ {! Q' o  Q/ l, v( z  D; Q. N; b7 A1 ?- n9 I
                /* Write to the master DMA channel first. */; }/ \7 m1 Q5 d& P! }" P' `( D
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);+ U  O. |1 R& e/ [6 |( y
    }       3 p1 S" @6 B) ?- }5 j0 @% J) J
" P) V7 y7 ~0 l" h
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);- Q7 O0 D( U* l( F, ^
        5 k2 f4 h' f. P' Z  x
    if(result == EDMA3_DRV_SOK) 7 \, U- K* _0 Z) @1 ?
    {+ j8 D1 k& e/ u: k. @% M$ c
            print2arm("edma3 driver init success.",0);
$ \/ o1 Y3 u& o- r    }
% o% Q! y: W( \7 r3 @6 z}. F3 C! ?- l. q
" C5 R8 \* p' Y/ ~) c* _& |

/ A; v& V/ c7 w) O" rEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。# k% U% S& _  L/ i9 p) m

8 m# B; O( U- q/ Q, l* L4 w3 `9 f1 M9 i$ g" c, R, O) h

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
1 r- F9 a  y1 A, W每次DMA传输完成后都要再次使能传输

* a( i3 u' s) t  f7 ]$ h原来是这样,我明天去试试,谢谢了!




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