嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:5 W) D4 G4 s7 l# k. g2 i" i& U
#define  PING_PONG_ACNT          1
3 L/ c+ [+ s  w#define  PING_PONG_BCNT          8*32*40
5 h, G8 I! M( s$ S. r7 n//#define  PING_PONG_BCNT       1
( _8 w1 `* d& E' `" b* M/ @#define  PING_PONG_CCNT          1# l4 B4 r" I/ l0 G6 |7 d$ [$ \. C, t6 g
#define  MCASP_BASEADDR          0x01D00000: A2 j# X) a. o% a* z
#define  Mcasp_RXEVENTQUE        (0u)
8 z2 [3 L2 h& X
0 O- y+ \! C! u- r  s/* OPT Field specific defines */
! @  u" v# b9 D/ S$ z#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
) w3 p) f7 u5 U5 U/ k#define OPT_TCC_MASK                        (0x0003F000u)+ w) B  B: E* x
#define OPT_TCC_SHIFT                       (0x0000000Cu), ?+ l/ d+ i2 Z  h9 y. u
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
$ L1 ?2 I8 K9 B, t( j#define OPT_TCINTEN_SHIFT                   (0x00000014u)
) ~1 F' y% W) e# T' V7 o" l/ C. p! o0 M! H
char ping_buffer[PING_PONG_BCNT];# \; V6 Y0 U  O9 m
char pong_buffer[PING_PONG_BCNT];, `, \0 z8 Y) c' h( Z6 b! A' M
# ~" N" U' u; A

  g# z: @/ N# `9 `% s6 }+ z
- ~  {6 \) I6 _
" N9 Q; V' w) R; r& p- d' x# Jstatic void ys_edma3_init()5 C; ?/ _9 \) j7 ]
{
2 ~; ^1 j0 S5 W7 ^* X# ~3 y) C& x: |        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
1 W8 `% F5 |5 C        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
4 d$ d1 |' C2 D4 l* s% I$ X) V2 G        EDMA3_DRV_Handle hEdma;& |% @2 J9 N- r( Y' M- P7 K
    uint32_t chId   = 0;
! L9 W5 R$ K: O- p/ g+ v8 z    uint32_t tcc    = 0;
0 B  z) u7 O3 L# u" ]7 L- c
( b# s3 ^* x, I    print2arm("edma3 driver init...",0);, d- |  T! ~6 m/ B  z
3 u1 a; i0 x( A2 @1 w" {
        hEdma = edma3init(0,&result);2 g$ ?; @0 q* S: d% h. _+ r
        if(hEdma)) W3 E  o# b) G$ z; [4 I; G- `
        {
9 G- y* C3 r  Z                print2arm("edma3init() Passed.",0);
4 _  h' D/ ~/ Z* C        }
  X7 |: U$ D$ q' p# w        else
5 n+ i& X+ V3 j2 E! q& R3 m( ~        {* [3 ]2 |* e+ Y6 @1 X0 h
                print2arm("edma3init() Failed.",0);1 I% M  M9 f( ~- k1 N& h9 L+ P
        }
1 x- u8 r: b( g5 k        % o; Y) O: Z# O. s
        if (result == EDMA3_DRV_SOK)
6 n1 }, s& ~5 ]+ x' ]1 A8 H% V4 m# _    {" w0 [# J* j9 [' a; ]) B- o
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
( K2 H: C- `/ r! k! B  l. y7 M9 M5 R                                                       (EDMA3_RM_EventQueue)0,
! {) W3 M& c; U5 ^                                                            &edma3_isr, NULL);
6 o/ m/ _& Z) M' N$ t' d2 Y  E    }& o4 Q+ p, b! P8 m( W! s
        & ]' g+ x$ y( X2 _: Z  e
        if(result == EDMA3_DRV_SOK)" h/ E! w* t4 e  q5 X6 Q, N9 r# H
        {) s- s' K& D' t; t2 H
                paramSet.srcBIdx    = 0;
: O' ^$ Z% F; `  t, U+ v5 [. U- e                paramSet.destBIdx   = 1;
  L5 f6 g& U4 G7 f* i2 d                paramSet.srcCIdx    = 0;# F/ U7 Z1 ^+ ?* v8 Y; f. W4 f
                paramSet.destCIdx   = 0;& Q  H# W/ Q; F) C$ i
                paramSet.aCnt       = PING_PONG_ACNT;
* y8 \6 K$ t& H  m  |8 z! P                paramSet.bCnt       = PING_PONG_BCNT;
8 U" _( Q5 s  X( H- l                paramSet.cCnt       = PING_PONG_CCNT;
/ n2 Y; \+ @1 j$ l0 N               
" D2 \( G% c$ u9 r, y" C# x                /* For AB-synchronized transfers, BCNTRLD is not used. */9 H/ v: S& F3 F) E- z
                paramSet.bCntReload = PING_PONG_BCNT;3 y) e/ ?' B% x% G- Q7 b, C

# P/ K1 ?8 V/ R& b, m6 v+ v                /* Src in constant mode Dest in INCR modes */5 O3 `; i9 j" w3 j
                paramSet.opt &= 0xFFFFFFFDu;
( P. n. B/ M+ {% E) [                //paramSet.opt &= 0xFFFFFFFCu;1 u0 _) R2 r0 J9 t1 ^) Z1 `- H* d
               
) C, d0 I# C1 Y( M                /* Program the TCC */# A4 b. ]$ n) |# e  F' M" Q$ h1 K
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);/ \$ z4 F" h% z# w# a* b3 y0 j5 T% {

. }0 {; o" }9 Q% l! o$ Y                /* Enable Intermediate & Final transfer completion interrupt */( d6 v# R; K' K; ^$ o
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
0 o' K' U4 F! _9 g                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);9 \! L/ ^1 ^; {; Q

* S* N- O" P2 P. W                /* AB Sync Transfer Mode */1 b) `; y! W# W" Y4 d
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
1 ^& I7 Q9 O: I( h! b                : X* O6 C5 L- O8 \. L2 r
                /* Program the source and dest addresses for master DMA channel */
5 k5 f1 g/ |' c5 e+ f4 w                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);; }6 [: v1 {: \
                paramSet.destAddr   = (uint32_t)(ping_buffer);- N  {3 @! H" U6 t4 j* }

, B. K( U" u# y                /* Write to the master DMA channel first. */
$ Q, o  [+ A4 v+ U$ @" @9 k, K                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
  l! B9 J, c: h8 J, b4 r6 R8 {    }       ; r) ]$ ]8 t& i6 |* C6 D

, }! o- G/ {! {4 p) z0 z        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
  T. Q8 {  v: W: }: C8 b. x; c          S* k9 `% O# g5 @( l
    if(result == EDMA3_DRV_SOK) ( u+ c/ n2 i+ r7 Z: J. ]
    {4 W1 A. u5 }* D$ B$ q6 V
            print2arm("edma3 driver init success.",0);  s* @* c% ^1 C% Q( C
    }
8 X2 ~! B0 T% n}
- e' T, s) b* r3 ]/ \' b
6 q+ x9 u2 w* w
- @% Z6 m5 p, K: @  Q3 ZEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。% \1 F2 C0 z% ~" J9 ^
9 `: C8 X2 J' T! ?3 F/ ^
' m( b' `  R( s$ x+ }$ M

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
. X8 U, ]" ]0 Q) D每次DMA传输完成后都要再次使能传输

0 k) A/ q$ Y+ a  a6 I, b3 |5 W原来是这样,我明天去试试,谢谢了!




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