嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:* ], o9 S2 c1 J# P# y; r
#define  PING_PONG_ACNT          1; F8 B, _( e/ M2 [
#define  PING_PONG_BCNT          8*32*40
6 Y9 n2 n) u9 L) L" H//#define  PING_PONG_BCNT       1
4 M& q/ C5 |( C6 U( s& r& ?7 v#define  PING_PONG_CCNT          1
+ W+ j+ W$ p: }" @9 t8 o4 y  V" y, e#define  MCASP_BASEADDR          0x01D00000) n. l+ t7 x. }7 G9 Z5 }4 p
#define  Mcasp_RXEVENTQUE        (0u)
7 G3 O6 H/ n# W0 O8 r
$ e: Q8 }* Y/ e, m# q; r/* OPT Field specific defines */# x1 |1 l3 W( x+ W& z6 M( W0 f
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)' d! a6 Y9 \8 F  \9 G& C
#define OPT_TCC_MASK                        (0x0003F000u)
7 L/ Z* l+ A) e4 [6 K6 Z7 n#define OPT_TCC_SHIFT                       (0x0000000Cu)/ i6 h0 X, y0 e- p- O
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)9 U' |$ S" Y  r( a
#define OPT_TCINTEN_SHIFT                   (0x00000014u)+ h; L/ Z$ i; O2 u% O* v: i& K
  K" c8 v; S- l- a3 l* L
char ping_buffer[PING_PONG_BCNT];
  K+ g. J0 N9 B7 n% m3 ichar pong_buffer[PING_PONG_BCNT];4 ~2 f: ?5 c: g4 m. Q8 p; S

1 `' }% ~0 o& f4 H8 b) [
5 {* n8 q" F9 \, J/ K' k, T5 u" V7 r& o6 t/ _6 \
+ K. F' t$ l3 t: Y3 a) F- n
static void ys_edma3_init()8 N. t. G/ ~5 o. f  G
{
1 e% S+ Q9 l) i* G9 Y        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};! Y, |, V; j, l9 @- x4 p0 ^
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;3 v- Y& r+ J4 t$ b1 F
        EDMA3_DRV_Handle hEdma;1 u1 M2 v0 Q) T2 F' C4 _! ?
    uint32_t chId   = 0;0 P5 C  T8 F% u1 B9 A+ @
    uint32_t tcc    = 0;
) ^8 ]. [- `! ?$ a
+ N* D" x) l" V3 H    print2arm("edma3 driver init...",0);
4 h. J# x; ^0 ]3 |$ Y  e5 e$ A. y% e
        hEdma = edma3init(0,&result);. s0 w& Y5 b  ^7 J$ L; I
        if(hEdma)! U/ F  V" _. g6 p6 c
        {
3 g) Z0 x9 X& }9 W8 o  I                print2arm("edma3init() Passed.",0);9 t& ?- [2 ]$ [/ a9 h0 i
        }
( G/ p1 x9 {2 u        else/ ^/ i& `7 g0 v9 Y  e6 x
        {
5 o2 T4 {: X5 g                print2arm("edma3init() Failed.",0);
6 W, Y: ]8 r# n9 H( r+ Z# W        }
% s; z  ]" }/ x" ?  I3 K9 P       
; }% g5 B( D% Z7 H" m3 N2 O' l0 Z        if (result == EDMA3_DRV_SOK)! f& O& X% j8 ?8 E5 X1 n
    {* c/ N& @2 Q: S1 \
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,8 N, F2 ]' t( R4 ^: G
                                                       (EDMA3_RM_EventQueue)0,
1 M  O( v7 K( U- ^8 K                                                            &edma3_isr, NULL);2 B- S5 y9 C( V( K
    }
$ t" [0 n' S/ L        , h( h7 M% @, b+ r# e# g/ g" l' }$ j
        if(result == EDMA3_DRV_SOK)1 Y: m. |8 b& M( a6 S
        {
2 }& b# y  f& {$ |  \+ L5 Z1 C8 T+ @                paramSet.srcBIdx    = 0;" f( x1 q. z/ B# D. Z, O
                paramSet.destBIdx   = 1;2 Z8 f9 w- Y, h% f" N
                paramSet.srcCIdx    = 0;
. ~5 F6 w; H2 z                paramSet.destCIdx   = 0;3 b  L+ Q8 i1 o+ l# E0 C" {
                paramSet.aCnt       = PING_PONG_ACNT;
% v" B) m. @# L% T6 J1 E                paramSet.bCnt       = PING_PONG_BCNT;3 ^: H- d, y' _: Y0 l0 }8 i! T$ |* F
                paramSet.cCnt       = PING_PONG_CCNT;
; x- I& c% y/ K! z                6 Z# Q3 v9 S2 E! }# E: I
                /* For AB-synchronized transfers, BCNTRLD is not used. */8 u; }+ S" k/ j: B' k6 z; B
                paramSet.bCntReload = PING_PONG_BCNT;5 f; _8 N. ^* m  `# R. o% w
* n1 a6 E+ ]3 f4 b
                /* Src in constant mode Dest in INCR modes */. B& {# L5 T; j. u( X2 z
                paramSet.opt &= 0xFFFFFFFDu;/ G: P: ]: J; N
                //paramSet.opt &= 0xFFFFFFFCu;
8 O3 n+ R) D! h: {- V               
0 `1 R( {2 Q0 {% @                /* Program the TCC */
3 K8 a3 N! Z9 X3 U" k% w1 {4 `                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
( A" ~! Q% C$ |% ^: D. B0 c! t- L+ }- _
                /* Enable Intermediate & Final transfer completion interrupt */9 v$ _, p0 l! g5 N8 {6 x8 ?7 O
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
; a# Y' H9 `2 b, ~7 y                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);# ?# |4 n5 M  n
& k2 n6 {/ j: f" E9 ^" _* O: A
                /* AB Sync Transfer Mode */( {& p3 R9 D, K2 \2 |0 Y4 U5 G: l
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);# M; ]- w7 {+ o( t3 H$ R
                , X' K0 W) E% c6 a- e+ u) O  F
                /* Program the source and dest addresses for master DMA channel */$ p- s5 Y4 g* T4 _8 [- A" X1 ]8 {
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
3 A) y, E- A; J                paramSet.destAddr   = (uint32_t)(ping_buffer);  v% }: Z( {" i9 p

! e$ W+ [% h4 w3 y  V' I9 \8 S                /* Write to the master DMA channel first. */$ U, m2 M8 c0 q9 E$ ]9 [7 m5 G
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
' O- ]% X5 X7 A4 t    }       ; p5 [" N4 `) I: Q
, T; Q+ @/ F% d$ R: j4 t  `, G$ ~
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);% c' k; `& t4 D1 h2 P
       
) `6 e8 r1 k3 N. r, S1 c3 j    if(result == EDMA3_DRV_SOK)
, w( g' r; c, d9 v3 j5 _7 T) T    {2 V9 x0 p% p  T, L% [# j
            print2arm("edma3 driver init success.",0);
( ]. r5 c4 f1 J    }
) W+ j/ g- u. J6 Y, O. h}! A9 }. g: P0 A1 N

' _  w* P  s" r) w9 n; |: q* j% t+ g4 P" O: k
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。  X7 r' u7 J3 y) T+ }* H' }3 d2 p

$ |/ i/ q6 g7 u. ^4 b% J- H- H; }% [4 I) _  h0 X$ i% g. U5 Q, f

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47' @5 O$ ^6 @" N# H7 O) F
每次DMA传输完成后都要再次使能传输

" n1 I' F4 |: m: i& V2 \* [原来是这样,我明天去试试,谢谢了!




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