嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:2 N+ v/ j. _+ |, }/ n% l
#define  PING_PONG_ACNT          1
3 _; {* m4 j: Z  `) t0 p#define  PING_PONG_BCNT          8*32*40
7 C  d; d6 d9 {+ j: \//#define  PING_PONG_BCNT       1 0 g4 s4 s; v7 i( T1 A  d
#define  PING_PONG_CCNT          1# @/ o+ v+ ?2 S4 Z. Y
#define  MCASP_BASEADDR          0x01D00000
! h7 d7 q+ q% E0 i#define  Mcasp_RXEVENTQUE        (0u)
6 k" t2 Y2 W& ~& P9 j6 ]' S0 D" z% O3 R1 s* `) e& l2 P
/* OPT Field specific defines */
. @( `7 L% ~5 E8 |* n2 r#define OPT_SYNCDIM_SHIFT                   (0x00000002u)% `# e" L+ }! D& f* T5 K3 F
#define OPT_TCC_MASK                        (0x0003F000u)$ P8 D! W; S$ j+ ^! |8 o
#define OPT_TCC_SHIFT                       (0x0000000Cu)5 I4 P% g  ~3 g& B: ~8 L
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
, C8 r# R3 k2 H! k, L- N#define OPT_TCINTEN_SHIFT                   (0x00000014u)4 }# q5 h# P2 `+ B! _9 c1 x
. G+ _" X0 }. y- a4 `0 w
char ping_buffer[PING_PONG_BCNT];
6 d3 H& p0 v8 g0 A3 \0 A) @char pong_buffer[PING_PONG_BCNT];2 b2 s! V. G9 |" p, m4 X

( A& F3 E! F4 ~# }3 q: p, t
4 _. x4 |( `7 M9 y* \' v! g4 U0 ~; E8 u; S: r3 V
5 v% _" O# f2 B1 B4 @1 V8 u# x
static void ys_edma3_init()# X% x; k! }" K  q) \
{
0 D" v5 b0 B9 w9 j; c8 ~        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};- |2 E, s  N/ q  G" n* o& T$ _
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;/ Q; Y7 w) z' n
        EDMA3_DRV_Handle hEdma;0 y. J" G% s: F) x9 N9 ]; J: u
    uint32_t chId   = 0;8 Z% `# F7 I! E0 R9 d
    uint32_t tcc    = 0;  \' W2 _# W! E' D+ ?6 W$ `) \

" F& }- f7 n: H0 O3 x3 s    print2arm("edma3 driver init...",0);3 }- c' |2 e. m1 @

* p4 ]- J% P$ L2 E& @/ D, |        hEdma = edma3init(0,&result);1 I" o4 j- {: w+ l! ~3 L
        if(hEdma)* K* n2 `+ k3 ~8 ^
        {
' Y+ U$ K4 p$ x$ E. }' ?! h0 ^0 w4 ?                print2arm("edma3init() Passed.",0);6 [: ~2 g8 h+ Q, X: _
        }
- x0 B' K' u8 s+ P% ?9 K' F        else# N, G5 ~9 ?2 |  z, M1 w( Z: [
        {
3 m0 c% z$ x8 S) q+ A                print2arm("edma3init() Failed.",0);$ O* x: K; c; f6 s* a
        }" D* t0 R4 l& \) R" K  R- I0 ?
          p, `* g/ {6 f9 }- F/ z
        if (result == EDMA3_DRV_SOK)
! g9 D' L  p  w$ m, T    {5 P! E2 E$ S6 _0 {& z; g0 z
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,) Q, [6 U( J: L
                                                       (EDMA3_RM_EventQueue)0,6 h2 G6 q, b3 s
                                                            &edma3_isr, NULL);5 V8 ?/ E* k8 c2 c& f$ P1 x9 S
    }
' H$ v; D  P  R% p1 W+ i       
4 K, |) l+ J6 k3 c9 F! V; L        if(result == EDMA3_DRV_SOK)
2 G! ]- F% R. p% z        {: ^: b8 L. I  }% D/ O- ^8 o7 y6 Z
                paramSet.srcBIdx    = 0;$ K5 b6 B7 w3 h) p. |( t" M1 z
                paramSet.destBIdx   = 1;$ g* h3 E4 V) q) F
                paramSet.srcCIdx    = 0;
9 c" D" B+ I  y9 D5 R                paramSet.destCIdx   = 0;. o; l# R( T) o! ~; l& v0 _) i
                paramSet.aCnt       = PING_PONG_ACNT;
( E- b) r, h( ]7 Y9 {2 M                paramSet.bCnt       = PING_PONG_BCNT;( w' N& n6 }4 O1 f8 H: [% q# i- G
                paramSet.cCnt       = PING_PONG_CCNT;  A2 t/ H! u  F* t9 ?$ F2 u8 X
                  s' l: F4 N# \$ {" T
                /* For AB-synchronized transfers, BCNTRLD is not used. */
1 s. G$ z7 U# E7 K0 n9 L5 {  J1 M+ U                paramSet.bCntReload = PING_PONG_BCNT;+ @* H5 O" a7 p
2 L1 z& s1 c' w: l: ]0 Q9 z  z
                /* Src in constant mode Dest in INCR modes */
6 Y2 t7 n6 Q  C& G5 W! L. Y                paramSet.opt &= 0xFFFFFFFDu;
2 }) f: h+ r: x                //paramSet.opt &= 0xFFFFFFFCu;
  ^- A- L& J! ?! x               
: D5 ], V! }2 d: S% H                /* Program the TCC */
) r# Q) D. |% a4 P                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 ~( {  E4 n! ^9 c4 x4 d# E7 J( k
8 O$ e9 M0 X0 |9 [$ }+ v  a8 M8 h                /* Enable Intermediate & Final transfer completion interrupt */1 I2 R/ y- G1 C" v
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);. N! r' a# S' _- O
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
5 l7 j( X$ P# a1 ~
3 E$ ?, {4 y5 v% \* S; F5 d' b2 U& z                /* AB Sync Transfer Mode */
* R+ r: d# \: k0 X                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
9 `- H  i) g$ r. d& T: Z               
5 X/ }' ^9 @# m1 X) e. e                /* Program the source and dest addresses for master DMA channel */  |' S: a6 c1 V, _$ V: K- r
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
; b$ _8 ~3 g4 }% d2 {                paramSet.destAddr   = (uint32_t)(ping_buffer);0 d1 N) K$ I5 B! Y4 y6 R& r7 k, |

0 @& L1 P# ~" i                /* Write to the master DMA channel first. */3 S/ m1 [: P4 z# o! V. ?- i
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);; I) B6 R$ ]0 k0 n
    }       8 N4 |9 r: h& H( f

6 Q' Z; S( k9 N6 j4 [0 J9 j+ G        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
; i& q6 T) R/ r3 Y; S* R        ! ?$ c& x+ T) P' Q
    if(result == EDMA3_DRV_SOK) & G" Z: @2 |+ b2 r2 L6 X0 ~: I+ l
    {( Z, W/ {% n# O1 m
            print2arm("edma3 driver init success.",0);
# V( v) ^! ]# s9 H9 t: c    }
" G* G0 x3 w" s, C}5 S5 K9 l' M* |- r

6 F9 g- h1 v5 [1 G0 z0 u" Q2 x; d+ m( \6 {. q
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
$ J4 E* G$ p/ G" F; i
. o* b# |' S! g& L6 z8 t% r, [5 {7 J" M! x! T: s7 U. `5 r5 _

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
3 a+ L) l  w* M- P+ {) Q每次DMA传输完成后都要再次使能传输
+ a, y8 Q3 T+ Q- D5 B9 ?/ q
原来是这样,我明天去试试,谢谢了!




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