嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:1 u! t# d& ?8 I# `, M3 j
#define  PING_PONG_ACNT          1
- u) W  n; Z" A+ {4 c#define  PING_PONG_BCNT          8*32*40
: ?( v7 f9 |9 w5 j//#define  PING_PONG_BCNT       1
2 g7 s& R3 ^* ]#define  PING_PONG_CCNT          1
: R1 v$ U* {# m" ]) i4 `#define  MCASP_BASEADDR          0x01D00000
) P8 b8 p- s: a" r! H) I0 I2 B. n#define  Mcasp_RXEVENTQUE        (0u)+ Q3 n& C5 u2 T, g/ v0 T

6 }1 Q& l% F" z) J, X/* OPT Field specific defines */
; ~1 F7 L! w3 X( R  M  @#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
5 f, T) |# R0 T4 i9 `/ M$ D& A7 B#define OPT_TCC_MASK                        (0x0003F000u), q7 |5 x, i. m7 _: N
#define OPT_TCC_SHIFT                       (0x0000000Cu)
: i4 G5 E! v8 l: L#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
) }, @6 m' [5 R1 m" J#define OPT_TCINTEN_SHIFT                   (0x00000014u)
9 {, t$ [. @2 E- B9 M3 G# y! }5 l9 ]+ P0 l. @
char ping_buffer[PING_PONG_BCNT];
  k. X' m# s2 k% N( S- v- Y& }  schar pong_buffer[PING_PONG_BCNT];5 h: }6 c) s% J; h6 K& F
, @8 K8 V5 H  P: u2 x

2 }$ o. e; A: d. o- Q; F# b9 T. i8 X

0 U3 Z2 j+ V# w# E+ t7 jstatic void ys_edma3_init()0 G. P0 _9 L; C8 ^3 L5 c+ j
{+ v+ |; D$ t% _
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};4 p4 e, P  V  [5 h' {+ |
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
1 k1 G. I& C, Y        EDMA3_DRV_Handle hEdma;
& }& [$ a2 {0 D9 z4 J) ~/ s. I" p    uint32_t chId   = 0;# B; M: I  j0 T# z! r1 V5 o
    uint32_t tcc    = 0;
0 @/ g% `- p( M2 l% x
' M$ C% z( W4 H    print2arm("edma3 driver init...",0);* l& s4 T/ z' e: K) R/ p8 A
$ C' ^8 Z' Y$ K: Y9 V1 n* P
        hEdma = edma3init(0,&result);
# J& |' I" Q- I7 e* M1 q        if(hEdma)
8 s- |5 H. g9 q3 Q        {, i# ], k% I( K5 L' s8 C. b: s
                print2arm("edma3init() Passed.",0);
4 m# V; [  ~% K5 J. U3 p0 ^; f        }
' A. `  w+ z/ Y* B1 M/ u; A0 y        else+ ^; y4 p4 d+ Q- D
        {$ ?! g" B! g7 h( [( P
                print2arm("edma3init() Failed.",0);
. `3 `/ h8 G: K. T- z! u$ s        }! \. e3 z: G" @0 L
        1 q6 J. i+ h& w3 o) x
        if (result == EDMA3_DRV_SOK)1 y" ^/ X% n: w
    {+ b( h4 Z7 ]- F. L& Y6 m
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,7 F) [* f! ~+ s. [8 |5 G, ]
                                                       (EDMA3_RM_EventQueue)0,) P$ k1 L: z/ X2 i' G! P% D
                                                            &edma3_isr, NULL);
8 c% Q4 |( g/ b4 j. C6 ]    }8 Q( B6 j) ?  {1 l  r# ^% H. h% G; @
        3 f! E9 v- D5 k
        if(result == EDMA3_DRV_SOK)
/ x4 u+ u" v) Y; k$ w: @. \" }        {2 z3 ^! R9 Z, ~6 A
                paramSet.srcBIdx    = 0;$ C7 g/ D- Q0 t6 t+ F9 x
                paramSet.destBIdx   = 1;9 r! O6 q9 i9 `1 }1 f6 h
                paramSet.srcCIdx    = 0;
" [8 N. V; y( Z1 s) v                paramSet.destCIdx   = 0;
' P8 V4 W1 K3 o                paramSet.aCnt       = PING_PONG_ACNT;
4 o3 C4 w4 h3 Z! D                paramSet.bCnt       = PING_PONG_BCNT;8 V+ s) F1 C5 @% U3 t/ z
                paramSet.cCnt       = PING_PONG_CCNT;
+ o" g9 h" l; Z6 U0 E1 w/ _9 p               
- ?6 i" ^9 O# X+ W  F5 g% O                /* For AB-synchronized transfers, BCNTRLD is not used. */
) `3 `$ P! k4 z8 _/ W                paramSet.bCntReload = PING_PONG_BCNT;
9 i# c; R8 K0 n9 w6 n/ L2 m8 u9 l% Z" \9 r- v
                /* Src in constant mode Dest in INCR modes */$ v( C! b. Y. x2 `- z5 U
                paramSet.opt &= 0xFFFFFFFDu;$ Q) O/ Q% z4 s2 U3 a! l3 B
                //paramSet.opt &= 0xFFFFFFFCu;
  `( ]1 c, i6 r                - C) x! O& \: s* m( O
                /* Program the TCC */# d2 X* I) S/ \. P: X( \
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);0 u% l0 j. U' {5 g# Z% d6 ?
3 C6 g. f" e* g( p, t( g7 s! Y( t
                /* Enable Intermediate & Final transfer completion interrupt */
& B' f' \- A5 c0 D2 L! l                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
" y& ]8 B- _/ Y8 j6 g                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);6 L' }, O( q" _$ f3 ]/ w# P5 v

: D9 E+ m2 k& |                /* AB Sync Transfer Mode */0 j* Z; c+ c! W# u8 a  E# Q
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);! K1 J2 O* \3 Y
               
/ H5 e/ i% o: f4 K2 N                /* Program the source and dest addresses for master DMA channel */
- B0 y9 Z  F  E0 }                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
) I, J* K* q3 b! C. ]& f$ m                paramSet.destAddr   = (uint32_t)(ping_buffer);( j4 p/ B7 I: Z8 D5 }" g9 [' \
/ x# A* U0 o" h8 ?
                /* Write to the master DMA channel first. */, F; x% G7 L: O  e& f; n4 X+ z
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
' s( w" m# }6 K6 L$ g5 Z$ {' a' h    }      
( @9 b3 @6 z: g+ U0 A3 r3 Z' [/ F+ _9 _1 b, Z- N( y
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);. P! P3 R  h5 ?0 Q: d+ T, F' |  y
       
  |" J8 e+ l  a( e1 L& X* V4 j    if(result == EDMA3_DRV_SOK) : E9 U2 U1 T' |( R" P0 W( Y
    {1 A9 F+ O) F- O# G1 @
            print2arm("edma3 driver init success.",0);
& x& O- e- O/ W& ]% R( l    } 0 @2 {0 o; C% k* ]& _0 C+ Q: Z
}
* ^* r! c, o, {6 ?( O6 }, E; u/ e( ]% E( ~

4 D: X. G/ |0 j0 `EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。9 A" ~( U" b6 Y6 y# g  J

4 o' S- a  r7 l0 h) i: W
8 b( c6 F2 `0 q& H4 [, f5 B
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47* h0 H0 `. U5 D6 N! k1 r
每次DMA传输完成后都要再次使能传输

. E8 i2 z7 J: S! w$ r! @0 J原来是这样,我明天去试试,谢谢了!




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