嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
1 I" I) i% f& N0 D#define  PING_PONG_ACNT          1
$ a, L, n3 t. s" P) e" o#define  PING_PONG_BCNT          8*32*40 . Y* [) B: y! W- k& R2 [9 @
//#define  PING_PONG_BCNT       1
- V& p$ ?( t2 P, d( x8 c#define  PING_PONG_CCNT          1
" i; o( q" d* m3 w& y. T& ?+ `* G#define  MCASP_BASEADDR          0x01D00000
9 v  Z* f0 F2 T! K0 w& C#define  Mcasp_RXEVENTQUE        (0u)
8 ~0 e, Y8 w' P: n$ c! z( I8 N0 z% }  l
/* OPT Field specific defines */
* K9 ]5 @; x" s! U9 G! D#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
; }. U% E4 P0 t9 a8 y* Y( m#define OPT_TCC_MASK                        (0x0003F000u)
( {* u" n# ~% b/ W#define OPT_TCC_SHIFT                       (0x0000000Cu)4 e) |1 t7 h7 ?' ~/ u
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
7 E5 o7 {  b, l% b4 D* l2 W#define OPT_TCINTEN_SHIFT                   (0x00000014u). {( j- k' h) R- c7 L3 J

* ?( e- ~6 U3 y4 e7 O: Zchar ping_buffer[PING_PONG_BCNT];  N4 V" e( u, S  h+ V9 Y
char pong_buffer[PING_PONG_BCNT];  v2 {/ `% U( c# q9 s
7 [1 X- ?, x5 y! S" Q" n! t. C

$ i# n3 T6 P+ s- M  H4 n! K7 v( ]0 O) M( J& i7 c

4 L  F4 z1 H9 e, K; @: u7 Zstatic void ys_edma3_init()  ?: h4 V+ H; q9 R8 b  n
{) D4 P: c/ T* ?
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};& l5 h; _: m/ r9 y& f' c
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;7 C1 @6 T. `5 T4 I& K2 k9 F- k
        EDMA3_DRV_Handle hEdma;
) v' H% X! ^9 n1 `( J4 [1 O1 l! k    uint32_t chId   = 0;
3 ?6 d- u& X9 m1 F6 n; c; ~- m) k    uint32_t tcc    = 0;8 N/ g7 C3 {& Q/ U! M
/ b9 R, h0 N/ W1 U
    print2arm("edma3 driver init...",0);8 P" ^7 @! ~: a2 H

* y, d; z1 o+ o) z+ _        hEdma = edma3init(0,&result);" x* V+ P+ S9 i- f/ K* j, _& w
        if(hEdma)
- T  h3 O, H. ~" e        {* m% ?7 s/ J+ G3 o( l
                print2arm("edma3init() Passed.",0);% H5 f3 ~% n0 K) S
        }
2 F7 E# `; r  N$ a2 W! h        else2 @8 i  i/ L* Q
        {$ c' R: _& n6 O5 h* E0 U
                print2arm("edma3init() Failed.",0);
* r. u/ F5 m8 R        }
) o! r2 I3 g7 t  x) L4 N       
8 f) V- N5 }( e* z5 v( A( P        if (result == EDMA3_DRV_SOK)
! v  b4 l4 b4 v; ~, F* y    {2 k0 Y6 k, e1 a8 Y% K( @+ N
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,7 G0 _* O! L2 R2 |: u) X! p( j
                                                       (EDMA3_RM_EventQueue)0,
- b) B& ^  n1 `* B- A                                                            &edma3_isr, NULL);/ p- `' C2 Q% N4 W  R- m) \5 d
    }
: l  R/ O- w+ A7 P       
) U$ N  |; I: B, Z        if(result == EDMA3_DRV_SOK)
& Q. k! `6 V; g: D        {7 v- d0 W3 B8 }" D; \. o
                paramSet.srcBIdx    = 0;
/ e- C  J/ K3 b5 q8 T. T* o                paramSet.destBIdx   = 1;4 \* j8 S: v" F7 T% ]
                paramSet.srcCIdx    = 0;5 @& F5 {- U  c" z4 Z
                paramSet.destCIdx   = 0;8 j* y# |( H5 w6 ?
                paramSet.aCnt       = PING_PONG_ACNT;  c6 t# A4 i, w- F5 z/ Q' _
                paramSet.bCnt       = PING_PONG_BCNT;
$ `9 N6 L! w& t                paramSet.cCnt       = PING_PONG_CCNT;
% L, }6 R! o( G; ^               
% X* ]1 w- U& [/ Y2 k* \                /* For AB-synchronized transfers, BCNTRLD is not used. */
) O! I0 k) I! I% J9 t                paramSet.bCntReload = PING_PONG_BCNT;
! o8 ?; O. [" b" N6 ]
$ s7 G. y  S% T; y, f                /* Src in constant mode Dest in INCR modes */
. ]" P0 D+ s/ _2 Q' _+ {                paramSet.opt &= 0xFFFFFFFDu;# \3 P% h9 y1 l* S7 a
                //paramSet.opt &= 0xFFFFFFFCu;; W3 X7 f4 a; P; p8 e
               
3 N% f3 O3 y0 ?2 i7 s' V$ q% \                /* Program the TCC *// d3 y1 X% p9 D7 Y
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 X& b! g7 L6 r! M- u
+ Z4 v2 L' Q* ^' I6 I+ G4 i                /* Enable Intermediate & Final transfer completion interrupt *// N* \- q/ V  c/ S4 b5 i$ p
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
+ N6 L7 F& O5 K+ ^                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);' M- O/ }, Z/ p" S3 T( d! O

, V3 D: P0 J0 e9 O5 u$ p- n                /* AB Sync Transfer Mode */1 f# [: l; c( R* r# K; @4 o2 n9 q* m4 [
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ m# Z: z* \" V2 f               
6 W0 x0 {1 Q# V  y* w4 K$ O3 ?                /* Program the source and dest addresses for master DMA channel */6 b. z$ ^3 a% @0 z+ s
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);6 B! x- B% p- C& K
                paramSet.destAddr   = (uint32_t)(ping_buffer);
) @' w, s0 B9 c7 z) W8 Y1 \
/ H: A  d& r5 a% h0 [1 ^, g                /* Write to the master DMA channel first. */' \& m4 ]7 c- T) m' P: O" Q
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);; v4 R3 K) \: t9 @1 b
    }      
% [* @" W" B" ~: w) B3 W' m) _3 P, Z6 |! z
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);, T$ z  N1 ^# @) Q
        ! y* Q5 R0 o3 f
    if(result == EDMA3_DRV_SOK)
3 k. A$ E4 I' T$ ?, U7 H' i    {$ E% L# J* y$ o4 }
            print2arm("edma3 driver init success.",0);
4 j1 v! \$ h) M% o6 d    }
+ t' b+ A$ g9 N/ n1 Z9 ?}. u8 ^" }: a1 p, U" s
  k: M# t5 G7 b

& j, E' e6 l- cEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。. }: ]: n2 k2 R! @$ `$ d1 F. x- O9 Y

* X$ E2 l# ]9 L% z
% I3 h, {# P) ?* G& B- o
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:470 N, b* e/ o+ O
每次DMA传输完成后都要再次使能传输
" v9 [# i0 o% S6 S4 S$ a
原来是这样,我明天去试试,谢谢了!




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