嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
0 o9 J: k. ?  C5 |2 {#define  PING_PONG_ACNT          1, `' l- r0 P" C  R
#define  PING_PONG_BCNT          8*32*40
, |) ^( s, y* p! Q4 g. w//#define  PING_PONG_BCNT       1
8 F4 s% }) V* W; H$ J( V#define  PING_PONG_CCNT          1# H3 ]2 a2 Y/ u; j( s
#define  MCASP_BASEADDR          0x01D00000
' K2 P3 e; J  |' J* Y#define  Mcasp_RXEVENTQUE        (0u)2 L4 ^0 s) c& j* a4 P& R% c

( u! s9 u$ f1 V5 w/* OPT Field specific defines */  V* K3 H( O6 a& o
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
. _! E: k7 Y! @3 Y3 c( G# |#define OPT_TCC_MASK                        (0x0003F000u)& D2 N+ L  T  ]; K5 ?- p: L
#define OPT_TCC_SHIFT                       (0x0000000Cu)' @+ W9 J+ u0 i- q: C1 I. ~# ]
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)! Q1 {6 ]9 c5 ?  U  C; S
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
3 W1 ?4 ?/ W; a, f
3 z& M8 ]& z: ]! ^7 m" I' ^% j2 Dchar ping_buffer[PING_PONG_BCNT];
: I) z0 D8 V2 }3 }; {4 Nchar pong_buffer[PING_PONG_BCNT];
, k( {5 P6 M2 ~. O+ ^' I( K9 T
$ ^3 ?2 _+ K2 s' X3 B- I+ H. E
  U" K+ b, E" L: z. ?( f: v* z
% V+ F2 _* F- ~4 P% b5 Z* [$ j$ b- S$ j& C" Q8 Q. ^$ z
static void ys_edma3_init()
+ G- K& t( r3 p$ K' Z{2 J. E7 q+ B; M
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
) [2 s+ _* E& @        EDMA3_DRV_Result result = EDMA3_DRV_SOK;9 N) j/ f% ^3 m1 ]9 [
        EDMA3_DRV_Handle hEdma;
! k9 h+ [6 i+ C) [7 U    uint32_t chId   = 0;
3 _" Y' g+ q( I    uint32_t tcc    = 0;
# ?! e' ^% `& F  s. \9 n; l4 n7 m$ m: ~8 \, e$ P
    print2arm("edma3 driver init...",0);
! f1 P* w( k1 X, r1 x8 A
1 }# i3 Z- Q; X- i        hEdma = edma3init(0,&result);
% h4 c" }2 ~/ t( h, u4 p, g* E        if(hEdma)
6 E# a( v# H% l* }# Q' ^        {
0 R0 k# E& u0 N3 z9 g                print2arm("edma3init() Passed.",0);7 C+ U% |2 H4 s1 z
        }
% m8 L3 z. A& @& C  Y        else' M( b3 q  n; N$ l* y. ^
        {4 Z' }9 `( o4 Z5 K  o
                print2arm("edma3init() Failed.",0);' G( h/ C, l) T  O6 h: c+ \, J
        }
$ ]# }" V! K7 c       
. _- Z$ i4 z: C5 o: c        if (result == EDMA3_DRV_SOK)
# M0 u4 T! B8 a9 u7 V/ d    {
* x* T, r+ P0 ^0 {                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
) `2 X( R+ j) i                                                       (EDMA3_RM_EventQueue)0,4 Q% E3 h. N1 E$ B1 V, n9 e
                                                            &edma3_isr, NULL);
5 O, _- D7 X* d* M2 y4 x8 F1 ]    }
4 w! v# m6 A4 j  c  C) n' A2 X       
, u2 |. M7 R/ v: \8 k( I- c        if(result == EDMA3_DRV_SOK)
" U2 W* p0 g0 }" v' i2 M        {
( ?4 n, V% z8 U                paramSet.srcBIdx    = 0;' S5 m! n  c% x: R% ^/ p' }* k6 v- e, _
                paramSet.destBIdx   = 1;
" \, ~( \+ q  X( r; ]                paramSet.srcCIdx    = 0;
! l- x; q; H$ B1 O3 L0 C8 x                paramSet.destCIdx   = 0;, t: o0 `/ s# }1 }0 O; A& L
                paramSet.aCnt       = PING_PONG_ACNT;
# ~. {# {5 ^; Q! {3 |2 }                paramSet.bCnt       = PING_PONG_BCNT;. m( J5 S. G! C8 ~  r
                paramSet.cCnt       = PING_PONG_CCNT;  c: e8 E# |8 F. Z! D
                5 }: W% Q0 Z# a' q
                /* For AB-synchronized transfers, BCNTRLD is not used. */- g: C9 E9 p" a: Q
                paramSet.bCntReload = PING_PONG_BCNT;
6 m5 b, M) Y: C& ^8 ^. i
) `9 Y5 T8 E& k# W0 Q/ i                /* Src in constant mode Dest in INCR modes */
. |" y% Q8 y& h/ P                paramSet.opt &= 0xFFFFFFFDu;
* |: p0 V1 e* J2 e+ J                //paramSet.opt &= 0xFFFFFFFCu;& x" o  _* c" [4 e  o4 ~( N
               
0 ?+ C4 Z' _1 K/ q                /* Program the TCC */) g: {% ?% q- A& k- A
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);3 n8 c8 l: f- ]7 h- O

  S% R6 {6 }" `& v                /* Enable Intermediate & Final transfer completion interrupt */
4 X0 m2 `9 b; {, T5 B5 p                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
( H/ N, n+ Y8 a. o                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);3 T4 s, C( h) s
: [, ^- ^- x3 b  [
                /* AB Sync Transfer Mode */
+ `. H) j" \; a7 O! R                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ q! \6 H  g% a" Z9 z2 B% q               
* `' ^# C% p: y4 M5 \                /* Program the source and dest addresses for master DMA channel */
) w7 c+ Y* [0 y                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);3 @4 S  p5 `5 F- q
                paramSet.destAddr   = (uint32_t)(ping_buffer);; s; A4 t) H  Y& X: p7 ]# x0 R

. Z8 }1 ?" c+ R& D* k                /* Write to the master DMA channel first. */. s) p. w6 h) e
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);9 M& F  p$ N5 ]+ S# B) E% o
    }       $ g  ?% q, z4 M. H/ e# W: ?
0 f; [+ H% U3 u
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);8 f) D- G) {! R' y; U. E. f/ n. o
        ) i4 e/ X' y" G
    if(result == EDMA3_DRV_SOK)
$ }4 h* K7 y1 J    {
6 c: n2 n4 R5 S            print2arm("edma3 driver init success.",0);
  y$ `* f- Y0 V3 O8 u    }
, P9 L1 a2 h8 I9 _$ j4 J}2 O8 N4 n2 \$ L9 w" y# U# ?
+ u! K, [, o! G) {+ ^# O" ~

" `) q& t) K2 P  ]EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。7 p4 s6 ~. S$ E! W+ P9 R
6 z7 c6 S1 K3 M- q1 M( S

2 E- I4 f& F& j! O' h  G
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
! e/ [' L, V" u+ y, _0 k5 D9 J9 i! b每次DMA传输完成后都要再次使能传输

/ _- I1 U! O2 Z7 ]! d$ i, k原来是这样,我明天去试试,谢谢了!




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