嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
/ F& m1 o  S' L! h! h/ Z2 o#define  PING_PONG_ACNT          1- z, w' L; g- b& y- Z( h- O
#define  PING_PONG_BCNT          8*32*40 8 E$ E/ D1 @: L
//#define  PING_PONG_BCNT       1
- b' |; l+ E2 F' d: y1 O#define  PING_PONG_CCNT          1, \' S$ h$ G& s: N- z
#define  MCASP_BASEADDR          0x01D00000
9 ^# }$ C! i% Z* `7 b% Z3 ~& p#define  Mcasp_RXEVENTQUE        (0u): |) W3 i; W$ O$ r1 U! ~

8 ^% U% p. ~" ^/* OPT Field specific defines */
5 E9 Q! k6 w1 T5 T( |) \% m! A#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
& b' w3 @  C' C( u#define OPT_TCC_MASK                        (0x0003F000u)
- N( h9 d4 Y+ P4 ]2 m) C. c; \$ C" J#define OPT_TCC_SHIFT                       (0x0000000Cu)
$ ^! Y% ^' I" O, S* u: M#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
# N- d8 A% t) C, v#define OPT_TCINTEN_SHIFT                   (0x00000014u)* q' u1 q7 g% {2 r5 D; |
7 v  B; ^: }. }7 V
char ping_buffer[PING_PONG_BCNT];
, y3 L) x* i6 v' ^  [char pong_buffer[PING_PONG_BCNT];* a: a3 a7 E" z% w1 h, `
/ Q, S* P- w+ j8 x9 R
" l; w3 q5 G% O) X7 R$ {1 _+ k" o/ S
, p1 {5 L1 t. Y/ Z' Y
$ }- N' c- `8 `, F! `5 [# c! s
static void ys_edma3_init()
6 [# b; [! W8 A) U{
" ^- K1 e# s! X: S1 @& o        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& ]' ]0 g) v& C5 `8 F2 X        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
4 ?4 U  a/ V: F4 B( {, a& B% h# Y        EDMA3_DRV_Handle hEdma;
+ ~* Q7 U* y: m: w. H% }5 [    uint32_t chId   = 0;
9 w3 J6 c- H  H' m  G    uint32_t tcc    = 0;5 X7 B6 N4 Y& D( N: [+ N- Q

2 ?; \' |& O; y+ k( J    print2arm("edma3 driver init...",0);
. ~6 [( c1 \6 S( T1 x; r( b/ c
0 E/ M% l7 o/ B        hEdma = edma3init(0,&result);
( q% ~, y5 N! x1 c        if(hEdma)
: E8 I' P3 I- v2 M( f8 o        {
, U0 {. s. m9 M                print2arm("edma3init() Passed.",0);
2 r) F5 u4 a0 F8 Y        }. h1 V) ?& s2 g+ L8 M! m2 w
        else; C6 j: D& B; Y/ e) G5 T4 h
        {
+ p% b3 @" ?. x9 D& p3 s' b                print2arm("edma3init() Failed.",0);0 J, u5 F7 r/ {! h) @
        }, t: p3 s% a5 y4 {! ]: ?: l4 N6 n2 P
        1 h1 D+ }5 l* U: @7 i: ]! f: f
        if (result == EDMA3_DRV_SOK)
7 I7 d9 W4 x, @; i0 }5 z+ a2 Y/ d    {
" t& ~( {; T6 P/ P# C  ]) ~                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,, g4 R) T) G3 L9 X) H
                                                       (EDMA3_RM_EventQueue)0,
- i: |  M# z! c  g6 K                                                            &edma3_isr, NULL);
9 c* i6 R3 M! L& y    }
% ]  {2 o6 g3 c5 e/ Q1 s       
4 c  Y6 A; E2 w* j+ B% p        if(result == EDMA3_DRV_SOK)- I4 ~5 A$ [/ M' R
        {- e* y/ G" W# C# E  h* C# @
                paramSet.srcBIdx    = 0;
* T+ O  W( W# s' g: e' Z! K# l                paramSet.destBIdx   = 1;% ^+ [" f) O  N1 c5 C0 W; L- W7 g: {
                paramSet.srcCIdx    = 0;+ s7 S2 {% {+ j) }
                paramSet.destCIdx   = 0;
7 u7 ?& R* S9 D                paramSet.aCnt       = PING_PONG_ACNT;; }# m6 `: `0 K5 P! @8 Z
                paramSet.bCnt       = PING_PONG_BCNT;
2 ]2 n) H6 c( I& V                paramSet.cCnt       = PING_PONG_CCNT;  e% w# ^7 Q( x  X6 b- B; O7 ]7 g
                  j, o$ k: {( e/ e5 f0 ^
                /* For AB-synchronized transfers, BCNTRLD is not used. */
# w) \% c" P# S1 I                paramSet.bCntReload = PING_PONG_BCNT;
5 O% {$ y0 I& v1 z5 J6 r" b& b6 E" V! m9 a) b' X
                /* Src in constant mode Dest in INCR modes */
: ?+ S; ]. x' J5 o$ ]3 u4 V                paramSet.opt &= 0xFFFFFFFDu;
0 E- `1 e4 E6 u. h5 v                //paramSet.opt &= 0xFFFFFFFCu;
, P4 ?+ W& X! y8 S               
$ G4 o  R# `7 e, T2 c8 i1 |1 w% k+ ^- k                /* Program the TCC */
' j+ G& \) U' s6 {0 }5 C3 Z; b                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);. g8 e  ~+ ^2 Q' A. n6 t/ c7 w

, Q3 I" N) Q% `7 [. r                /* Enable Intermediate & Final transfer completion interrupt */5 ?( z) Q) S1 t+ K, H4 A
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
( h% W- Q2 K5 Q; d2 e                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
' a4 M$ _! ~: @& o: H1 G
3 H( _: B4 e6 ~                /* AB Sync Transfer Mode */% s" ^+ e2 ]$ ^: K% u: n
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);. l! V2 ^" a/ i, t6 |
               
" {% K$ X) l6 R# ]( {                /* Program the source and dest addresses for master DMA channel */
8 |' N5 x9 ?; c                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);& J- C2 W% Y2 @+ P) D: X
                paramSet.destAddr   = (uint32_t)(ping_buffer);
: E+ V( _4 f6 W4 V
& Y6 q6 Y/ K; K5 L8 T                /* Write to the master DMA channel first. */
% T) v! j; W' H/ M. Z7 A* ]2 k                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);" b0 x- ~  m# P- r6 q
    }      
% C4 k6 f; |0 N* A" C! s9 ?( p: M$ _$ \/ c
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
- ]& e* A# |' v4 b" @          p8 Y" ~: {# x$ F3 w
    if(result == EDMA3_DRV_SOK)
0 M. x! G$ R' d) q% V( [, M    {
3 x0 p8 @# w  O- x' V( P            print2arm("edma3 driver init success.",0);
5 t* B- u- Z0 Q4 E+ E" S# F, X" }    }
. y8 ]4 s% s) o- ]. X& w}& Q5 M: t: p. J9 t; \9 r  Z5 T  Y* O. R

- S- Y5 I  P5 I. J( l# I6 n' L0 w- m# Y: l' m5 W! @/ s
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。# Y! H1 ~% [2 J3 ~0 g  c6 k0 z
7 L& R4 g4 a  M5 \

( x: }3 T; n" Z# Z
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
2 y- V/ Q9 A0 [3 g6 o% }( S每次DMA传输完成后都要再次使能传输
3 l; Y+ b, S0 X* K! L
原来是这样,我明天去试试,谢谢了!




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