嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:* y; e- n/ a' J6 k1 _
#define  PING_PONG_ACNT          1$ K0 O1 v& a" `: A
#define  PING_PONG_BCNT          8*32*40
! F; v8 ~$ T0 X5 m* v+ q//#define  PING_PONG_BCNT       1
$ [2 ]' P/ q/ ?#define  PING_PONG_CCNT          1
( o$ T: ]7 N, v+ m! Q; h#define  MCASP_BASEADDR          0x01D00000
# N1 W$ _/ p% M: D! S#define  Mcasp_RXEVENTQUE        (0u)+ H. A+ b# _4 H$ t( v& I

5 U  S) \1 k& A* X/* OPT Field specific defines */
6 J' K0 t# s  Q" M7 R" y$ N#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
4 B" Y9 y  s0 [1 U, z( K6 q7 V#define OPT_TCC_MASK                        (0x0003F000u)
' G* n( }4 P, p+ ~#define OPT_TCC_SHIFT                       (0x0000000Cu)
! t# f9 y2 }, l3 x: ~#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
9 z- A: c) A) a4 m5 M$ \#define OPT_TCINTEN_SHIFT                   (0x00000014u)5 j4 q( Y* Q3 Y3 J! N
3 H! t. X/ K; n3 d  T/ P5 ~8 t
char ping_buffer[PING_PONG_BCNT];
* l( b" R/ z8 |' P/ [$ }char pong_buffer[PING_PONG_BCNT];7 Z8 v1 m, C* Y$ H, c

" L1 k0 x' a3 C+ r6 k" e/ G5 y$ P% t) _3 z0 p# Z' ~4 b
6 ~( ]# H3 z" ~- |5 W6 H

6 C" b- y* s( J3 f: H" d: pstatic void ys_edma3_init()* k$ c( m+ Z" D* M8 W; v, K$ o
{
3 `9 Y" m5 ~8 T1 L1 m: X        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};/ H$ d- W* K  i, X& k' z
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;5 p: }1 G( l/ G
        EDMA3_DRV_Handle hEdma;
1 C$ z& X, |# F; Q: B    uint32_t chId   = 0;6 e! A" Z" G- N: e: `
    uint32_t tcc    = 0;
5 L) o9 l1 a& I" H5 X6 _1 Y3 n' _, O3 B* i
    print2arm("edma3 driver init...",0);2 |4 A3 e4 r" b* k4 A) v

  d) e+ Z0 s( r        hEdma = edma3init(0,&result);
' R- P8 s" @1 }( Y  E' H& x% t        if(hEdma)  A; Y, |( \* X. S: b6 L6 E
        {& I* D' C5 g) X5 }+ W
                print2arm("edma3init() Passed.",0);
' q  _8 K1 b4 U$ z& m$ s        }
- k. F5 W8 B2 K        else4 Q2 K! S; d' L7 I
        {
) E' t) S" n6 j0 Q; v. f                print2arm("edma3init() Failed.",0);
. A6 Y+ p2 Z1 o* I% H        }
/ F8 i8 \( m7 O        7 \- b) r) d) O
        if (result == EDMA3_DRV_SOK)
: c2 X& ~$ a& F% ?3 y0 V    {* c% R  ~- P) k, W* \) U
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,3 I: o$ S# P% o/ c
                                                       (EDMA3_RM_EventQueue)0,
$ \: n1 |6 d. m) W1 E/ S                                                            &edma3_isr, NULL);
0 v" H. M: U# K- F1 S4 p8 ~$ ]! q) j    }% S+ G6 Y* J( |! V! q
        ' b, G: A' C& _  R# Y
        if(result == EDMA3_DRV_SOK)
1 c; D5 M* k! N) e# ~; X4 i        {9 y, m  l3 K$ q8 z) u$ [8 U# y
                paramSet.srcBIdx    = 0;1 H3 K7 `1 I1 n* D9 H
                paramSet.destBIdx   = 1;; A$ l. M- \  E, y; z  V7 A6 I. j
                paramSet.srcCIdx    = 0;: Q2 i: c$ [& B+ c  t5 S
                paramSet.destCIdx   = 0;4 L& G4 {2 Y/ P- a
                paramSet.aCnt       = PING_PONG_ACNT;) I7 B% s1 D( T' {) S
                paramSet.bCnt       = PING_PONG_BCNT;
/ `0 @: X4 |. Z1 W0 X- W  V. Q                paramSet.cCnt       = PING_PONG_CCNT;
- m/ g# c2 h# v/ Z" z& E                & a5 u7 L3 F! `# F; @
                /* For AB-synchronized transfers, BCNTRLD is not used. */
+ h9 V2 G) e- ]; L4 i* [                paramSet.bCntReload = PING_PONG_BCNT;4 s1 a9 \8 h, l4 v' M8 w
4 X3 a1 b7 j5 p- Y; z1 m
                /* Src in constant mode Dest in INCR modes */
9 F) b* ^) z/ z" y" r                paramSet.opt &= 0xFFFFFFFDu;# b0 c+ u, v9 M! ?% v
                //paramSet.opt &= 0xFFFFFFFCu;/ I8 P8 H! x; z- I% ~
                / [) ~5 v3 E' d8 z) b0 ?
                /* Program the TCC */
* s3 Y7 o* ~0 N$ H* [                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
, c7 n! x- f) x' `; p- D: `% P" z' \' w  F3 C; {
                /* Enable Intermediate & Final transfer completion interrupt */& W+ u: J* S; h! S- Y
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
8 e$ F, W. _) s4 K                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);7 S- c# v' G  y& s
, v7 h% }, y; Z! m  M9 m
                /* AB Sync Transfer Mode */
4 }) D( X7 K6 a                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);2 b, B' p4 }3 f0 s* i+ W( @7 ?
                ) N( Z6 b4 E, h4 M4 `* H  a
                /* Program the source and dest addresses for master DMA channel */6 g( I! }0 k* o0 X6 p$ m
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);( `0 y* Z5 S$ \$ u' a9 u+ `9 \) M
                paramSet.destAddr   = (uint32_t)(ping_buffer);
2 `, {7 E9 I3 z5 g2 m& B! b  y& o. G* |4 }) v$ T$ I, t. K
                /* Write to the master DMA channel first. */% N2 S; F2 o5 A' U  D
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
$ y% ~- r4 Y1 H  p& y    }       6 U- z' \2 ^& p' J" Z1 Y/ g9 m* x
3 R4 b, ]1 e& t. x
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);, q6 D! H( t% R* G0 W& g
        1 j5 a% O# Z% j: S. Y1 }1 {
    if(result == EDMA3_DRV_SOK)
" {0 b* Z6 R1 m& D+ K1 P* G. w  m    {
$ [" c0 P4 R) E            print2arm("edma3 driver init success.",0);
4 h1 a. l2 j& [# X    } ' Q1 Z) b/ S5 W0 l7 [, ]/ m% k4 {
}
* \5 y) b* x: q' d
7 i% G: z  ~* E1 h. A' K( U: L, l- X1 e/ J7 x
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。3 U4 w7 K8 d. m% A1 b; u
% {1 q' M9 H) \0 k

2 o5 Q& h4 f: I# T
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47- Q5 Z0 u& |$ o8 h; y! a( I/ U
每次DMA传输完成后都要再次使能传输
. P. j. p+ G% o/ W
原来是这样,我明天去试试,谢谢了!




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