嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
7 V+ s7 B( d3 e0 s: i  {7 u) u#define  PING_PONG_ACNT          1  M( }# c8 x8 k
#define  PING_PONG_BCNT          8*32*40
+ }5 y3 \, d# P8 _8 g9 w) A//#define  PING_PONG_BCNT       1 : f0 \) ?5 @- ~- e; D3 q/ u
#define  PING_PONG_CCNT          1' g$ E% o' E+ P: \; |  D
#define  MCASP_BASEADDR          0x01D00000& W' d' u1 `* i/ b5 I% x2 T8 o& Y
#define  Mcasp_RXEVENTQUE        (0u)6 ~& h$ \6 O3 q

2 u) U- q. J& t+ W5 a/* OPT Field specific defines */9 P' L6 `9 @" k& I8 E* z/ q
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)' y. s9 [' N8 l4 E
#define OPT_TCC_MASK                        (0x0003F000u)4 m  e, D8 ]. `
#define OPT_TCC_SHIFT                       (0x0000000Cu)
* K) S! A& Y( C( ]: z$ R2 I#define OPT_ITCINTEN_SHIFT                  (0x00000015u): @- D8 A" ^, j/ S! F2 k0 }& G
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
) M3 v) r2 Q" k$ S( q% d: v; \; C$ l  I+ s/ ^/ n* v
char ping_buffer[PING_PONG_BCNT];
" X7 F) ?% \- F% E  K" Kchar pong_buffer[PING_PONG_BCNT];5 B* N* f& u0 X' R6 S6 G/ D6 d
/ `/ @/ ~5 G8 C  }

5 g) @9 ?! t& \% s6 {7 J5 M
. U1 A9 s; L- F6 J9 R# b, U" j
% r  g. ]4 L) g. R: j, H1 D. C6 ]1 _static void ys_edma3_init(). K. j% }/ W7 N8 i$ m# C' N
{2 V2 D4 T' j3 g( n) t& v
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};: l0 |' I6 t5 n; d- a, D2 m, p0 g1 M
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;$ D8 P+ I8 Q4 q' W) G
        EDMA3_DRV_Handle hEdma;1 }: n3 F7 t3 b! W( M- g
    uint32_t chId   = 0;0 w- e8 T7 l! _" R
    uint32_t tcc    = 0;9 h$ `1 P  w' i$ P
) p: T" d7 `/ Z5 d! s) `% Z& b7 F
    print2arm("edma3 driver init...",0);9 c& J' K4 f1 z" K
2 y# ]' ?+ P5 M+ z+ m% p
        hEdma = edma3init(0,&result);
  D/ Z" }) x% h8 g+ n        if(hEdma)
+ d' F7 |3 r* Y$ H7 B" G        {5 S& L2 {; c# F2 b2 _
                print2arm("edma3init() Passed.",0);6 A5 N* H5 x* `& P+ y0 N
        }
/ q6 @  s0 {8 v7 x5 d& i; T        else2 [$ [8 g1 I3 ]; C0 w
        {7 J& n2 G. S/ r
                print2arm("edma3init() Failed.",0);2 V) ]' |" J+ U9 i- Y+ p% V
        }
. P- y* ]( f) I6 H0 Q1 u$ o* r        , b5 M1 x" J4 t/ ^- {4 I' q
        if (result == EDMA3_DRV_SOK)3 Q/ B8 H1 w3 Y& u0 u% e5 x" ~0 K9 P
    {. c& u; m5 d3 M2 `. Q2 g
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
3 z" X9 V( ?# v" ~! l7 D: y                                                       (EDMA3_RM_EventQueue)0,
+ v: }" u$ h) z' v( H& n# Z0 }                                                            &edma3_isr, NULL);
2 o" }5 t5 V1 u8 u( L' q    }  N! p  \! d7 f; d% z0 Y
        , J; \( U" C# r% C
        if(result == EDMA3_DRV_SOK)
# |% S9 l, ?' O        {6 R) d* J0 y3 |6 b1 c+ a2 [- w) p
                paramSet.srcBIdx    = 0;- `  H, P4 o# s& d* \' P
                paramSet.destBIdx   = 1;0 g5 _5 Y/ L4 P% I
                paramSet.srcCIdx    = 0;* F/ M9 X6 A4 a1 T
                paramSet.destCIdx   = 0;
# e9 [3 ], u6 ~3 Z3 N                paramSet.aCnt       = PING_PONG_ACNT;
; n) R/ d1 T: ]                paramSet.bCnt       = PING_PONG_BCNT;
8 U6 S6 O( W/ J) Q4 X, n# o% B% w  e6 H                paramSet.cCnt       = PING_PONG_CCNT;  F9 m7 |  [2 k1 h7 u! c( r
               
1 w: C& h5 [% L# d( M" J/ t                /* For AB-synchronized transfers, BCNTRLD is not used. */
8 N) X6 y8 }; X0 J( g                paramSet.bCntReload = PING_PONG_BCNT;
, L) }/ `! t4 ]/ k+ h  |* F9 ]2 i8 W; h% B- y9 f& o% K5 K
                /* Src in constant mode Dest in INCR modes */. k/ t1 K) t3 |6 e4 i! d
                paramSet.opt &= 0xFFFFFFFDu;; j" F' b+ J& |5 W- ?: Q
                //paramSet.opt &= 0xFFFFFFFCu;- L& U; V0 b2 q4 p& z7 h
                ' N9 D% E/ E1 P# r& \% G8 q
                /* Program the TCC */
0 J0 f# x  }' G6 a6 W5 O* D                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);+ u# H: O) l+ O% n. O1 t. G
. E" {- y, |) i8 h9 C
                /* Enable Intermediate & Final transfer completion interrupt */
/ P4 }( A" {& X' Q. F/ S                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);7 b3 C: P1 q% N* b) W  Z
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);" u8 J3 @8 ?  C: ?

- {/ C, m+ F$ z2 W) n" d                /* AB Sync Transfer Mode */
0 I1 H* k! }+ V  X& Y6 K$ g                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);& ~, K6 X$ r/ \+ e& G. P3 C! |
               
: f- y" Q  i# m5 u                /* Program the source and dest addresses for master DMA channel */% g' w. k! X/ H: ~4 u  c/ o& Y3 E
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
* R* m. M# p  B. L                paramSet.destAddr   = (uint32_t)(ping_buffer);
! f2 J% h  E+ ]/ y0 A; i+ {; e3 S8 i# C" g# {. `4 U- X
                /* Write to the master DMA channel first. */
- J: ]7 ?1 E  D% U7 D' b                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
5 ]  Z% [$ X& a' K" g    }       ) \7 M0 I+ Y1 Y- f/ a
* C3 S( p% @/ k6 q: Z
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
8 O& L3 l. R, w/ G        6 a# F0 t; U5 S: K" `9 W7 M2 M
    if(result == EDMA3_DRV_SOK) / u3 i3 J# A! I- u5 Q$ \
    {
' z' ]" r+ u: o+ ^9 C            print2arm("edma3 driver init success.",0);4 Z1 E" }" ?$ `9 G
    } 0 A  b4 `- M1 r. E
}
& F* A3 U3 \0 ]1 j, V* B' |+ {& ?6 U, C0 K/ L3 S" I

7 s9 g1 ~2 p5 E; F9 e7 hEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。+ s) l) V2 Q* w  _0 [. g. m  G

: f  ?' o7 U- N( O
( Q! C* E# G6 ^
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47; ?. F! b+ `( [2 P
每次DMA传输完成后都要再次使能传输

0 {8 ~6 d% W" a1 [) u( a9 G" m原来是这样,我明天去试试,谢谢了!




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