嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:9 _. W: I8 }: Q& G6 E0 s, |
#define  PING_PONG_ACNT          1$ n% y4 \7 N5 U6 |+ N8 S
#define  PING_PONG_BCNT          8*32*40 / |6 b; ?1 j1 U3 W
//#define  PING_PONG_BCNT       1 & Q7 y: M' B' `, f
#define  PING_PONG_CCNT          1% l+ `9 S* N; g. Q: X' }" \
#define  MCASP_BASEADDR          0x01D00000; [# f  H- W5 f- ]& |
#define  Mcasp_RXEVENTQUE        (0u)
6 E7 V" w4 Q& h$ g
( j/ l! G: C. d& q7 \3 Z7 K6 \/* OPT Field specific defines */( i* b, k3 d, `' [0 h1 p
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
4 m# `( S. u, c0 G7 a( Q#define OPT_TCC_MASK                        (0x0003F000u)0 b1 R( ?. E) q5 l" U# p9 W5 V) h& s
#define OPT_TCC_SHIFT                       (0x0000000Cu)
! b9 O$ U0 P0 O4 e" R% ]  G#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
8 [: ?2 J8 t1 x" G#define OPT_TCINTEN_SHIFT                   (0x00000014u)
3 y* s7 Z1 d$ I9 }. V6 Y( Q" E
% r) p) r. u1 cchar ping_buffer[PING_PONG_BCNT];
; c% l) e% u. K% Q) R0 kchar pong_buffer[PING_PONG_BCNT];  a$ l6 [1 T4 g4 m
  g) O: |: [! k, r1 N  I* j0 d

$ \1 L; b7 x/ j0 ^. u4 Z
( [6 r! K# f3 J* B- K' `! _
9 D8 x0 w7 R' k/ q/ wstatic void ys_edma3_init()) U. g! X& A- R( v! X  H5 R
{# }; t, x4 v6 k: i$ A
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
7 }# m2 b0 b' Z$ ~6 O6 F" q6 l( e        EDMA3_DRV_Result result = EDMA3_DRV_SOK;+ ~" T; q. ~% }+ s* G" F
        EDMA3_DRV_Handle hEdma;/ {5 o; R  ]* n
    uint32_t chId   = 0;
& [+ z$ k7 V, r# E/ e0 w    uint32_t tcc    = 0;8 O2 }# p& b9 T8 u9 e  Q
  ?$ I+ B8 m7 {9 E/ f' |
    print2arm("edma3 driver init...",0);
1 L2 Z! G- E" D4 K- ^: w: G( ~1 f( Q' U5 H" a& f$ k
        hEdma = edma3init(0,&result);
2 |, c3 T# S- T8 n# U. Q, `        if(hEdma)
# [% s; l) W9 {/ j& i        {
3 N2 x/ L# t  w/ |                print2arm("edma3init() Passed.",0);
* g6 e4 p% E* S' y$ o2 N. V        }
( i8 @2 [% d5 k' d, @        else5 W: Q) s2 e2 i
        {
1 h$ g( a7 f; ]) T                print2arm("edma3init() Failed.",0);* l5 J. K4 s4 j5 n: Y! t, R( B+ h2 B5 D* ?
        }8 r' U9 j& [+ e% M/ U
       
! H( B6 F; W  r, O        if (result == EDMA3_DRV_SOK)
' h% u3 H7 c: R, t% X8 s8 z    {
8 d3 ~$ Q& ?- c1 A4 b0 r5 R                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,* g( `3 ~0 d- k, p* h$ u9 d. C
                                                       (EDMA3_RM_EventQueue)0,! i4 [- u7 l( S
                                                            &edma3_isr, NULL);
7 u) G! h3 Z+ U8 ?    }) i8 |& P% h/ K2 q% H& f- C
       
  T, D' u& T6 q" e        if(result == EDMA3_DRV_SOK); u# E7 E8 F, {9 S* W
        {  i4 `* S# B6 E
                paramSet.srcBIdx    = 0;
5 U" ~% N9 L9 ^, t+ A3 A                paramSet.destBIdx   = 1;7 t% G! |0 z) N4 g2 y
                paramSet.srcCIdx    = 0;
# M0 M% c* }! e! {- ^                paramSet.destCIdx   = 0;
# W1 O1 u3 X- r: |8 [1 g                paramSet.aCnt       = PING_PONG_ACNT;
4 e4 t, H) _" U& z7 T' q                paramSet.bCnt       = PING_PONG_BCNT;4 g) M) [( A1 C3 L6 o
                paramSet.cCnt       = PING_PONG_CCNT;: \, l3 a3 }. s8 F1 z6 B' @. M
               
8 F8 o7 K, Z- |3 {2 G8 ]                /* For AB-synchronized transfers, BCNTRLD is not used. */
" P* a# m2 _' Q; `                paramSet.bCntReload = PING_PONG_BCNT;
  B  u6 q% x6 c) ~1 k$ X7 q
' ~3 T# L1 T6 {1 S! D; q                /* Src in constant mode Dest in INCR modes */) o6 I5 v& G3 o. ]% q% Z0 A# y7 x/ O
                paramSet.opt &= 0xFFFFFFFDu;
9 \; p( Z! T) M                //paramSet.opt &= 0xFFFFFFFCu;  Z0 u$ }* u( D
                8 [8 V. Y' E  Q* q
                /* Program the TCC */9 Q# P0 j- ~7 G! \. P
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
( o' w% _0 W3 E  b* Z0 g4 ]- e$ H; g# \5 X% k/ d9 Z+ H" W8 t1 m
                /* Enable Intermediate & Final transfer completion interrupt */
& j8 S' k/ g9 L7 V- v- W' |: m                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);! K6 e$ w* r; e& F: \
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);* e  k% S$ h" {) U
0 x, m. d+ {" X& d
                /* AB Sync Transfer Mode */0 r4 L- V( S4 A% U% a4 K
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);' @. y+ K/ b8 P+ b2 H9 o4 w
                ) e$ V# j& y# i  y8 e' r
                /* Program the source and dest addresses for master DMA channel */9 ]& }, o2 Z. f- j1 m" }4 L
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
% R8 Z# z! c  Z- \8 Q3 m1 z: _                paramSet.destAddr   = (uint32_t)(ping_buffer);
" @: u' w8 |' ~+ V
8 o& K8 P& P9 [0 x! g0 H                /* Write to the master DMA channel first. */
3 Q! \; r! T) w8 r                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);3 ^& @. ^! B. P
    }      
2 r) T5 L" X$ i8 G/ c4 F) h6 r) E5 C- }
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);, a- I+ p) u5 \5 G  F
       
/ q8 E7 Q$ X% z7 M) J    if(result == EDMA3_DRV_SOK) 5 g2 t$ L2 E* x6 w* ~
    {# ]' f4 J8 ]9 o, P4 T1 v0 ?* c
            print2arm("edma3 driver init success.",0);
8 G8 ^* t! ], M( x4 h    } # P8 Q7 S/ B. H: y
}: {6 \6 T7 q$ F! x
2 {& v& S' n2 M  t7 r$ f
* |2 a' z9 \: y) z' g1 w1 b
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
2 @4 w1 v5 `2 x' S; u3 j; d0 x9 V6 ?5 z5 v

7 r- h8 a6 c3 N& e4 ?
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47! P+ [  W6 p3 x5 p6 X
每次DMA传输完成后都要再次使能传输
1 u( G6 F, U. \; E3 I; |
原来是这样,我明天去试试,谢谢了!




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