嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
$ y$ U  @3 Z9 b" M5 Q4 T#define  PING_PONG_ACNT          1& ^, [* O: o0 f& U# ^+ z# m
#define  PING_PONG_BCNT          8*32*40 8 _  M5 H' C- g* m0 O
//#define  PING_PONG_BCNT       1
; n) E# n3 k5 j6 ?/ `3 d#define  PING_PONG_CCNT          1
" t" \% D3 l# L2 Q8 A- {#define  MCASP_BASEADDR          0x01D00000
8 Y' i; V/ Q- g# Y5 l* x#define  Mcasp_RXEVENTQUE        (0u)% a; A; n* Z% g: N0 R2 `5 D

; G- ~7 v$ w  A( t/ h  w! V) l/* OPT Field specific defines */4 P9 r4 u, t5 r+ g
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)% e# |& J4 K( u. t6 i, X( G/ X
#define OPT_TCC_MASK                        (0x0003F000u)
- i6 S! L1 I+ H( v#define OPT_TCC_SHIFT                       (0x0000000Cu)
- \; d" ]7 Y8 d- j/ e2 k* i#define OPT_ITCINTEN_SHIFT                  (0x00000015u)( P' L, i* d: E, ]( ^
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
: S1 T* @5 G4 p- d/ r2 P+ U$ \! G. G( R" Q
char ping_buffer[PING_PONG_BCNT];' i- g6 T, B" c3 |; `: h
char pong_buffer[PING_PONG_BCNT];
4 i& ^; S$ y& }6 s( Y2 I/ b3 J+ S/ C0 g. Y* P% {* ?' q

3 _, X* ~) g1 F) |/ M* U$ A4 G) Y4 P& _, a1 L0 o
7 Y- z3 I' Y/ y3 M, ^' A4 [
static void ys_edma3_init()
$ |/ v; K. d9 t6 Y& q: [{
- |# l0 J9 b- s' I* Z9 J6 z        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};1 P( C6 Q$ @1 I/ \
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;, T7 m8 q1 b" G& h/ ^" Z
        EDMA3_DRV_Handle hEdma;
5 K5 ^- U$ N- K$ }3 k& B    uint32_t chId   = 0;8 ]( r. f6 `5 ^
    uint32_t tcc    = 0;# l- \. ~& g4 G* q, G

1 |5 f: n1 H6 q    print2arm("edma3 driver init...",0);8 N2 J6 ^% C0 u! C: W: A# x" k# C" G
6 F& r8 ^& {% T: D- X
        hEdma = edma3init(0,&result);
. f! D) o6 M; u0 C" N' N        if(hEdma)
- g( L" l4 b) S' ?4 p$ z' c; a1 q% G        {: A2 s# p, M- P; |; b# t
                print2arm("edma3init() Passed.",0);/ [# @, _3 V4 l2 U% i
        }
5 ^9 {: f( q. s' |+ i        else; b) v1 y4 l7 I! H, T
        {- {- a  }: ^: u' n# g! {
                print2arm("edma3init() Failed.",0);
+ Y, R: R) L- b: V        }
  Y5 g2 M3 g# }        " P" }; O* r7 n  r
        if (result == EDMA3_DRV_SOK)
4 R8 U+ b( V- }2 L" b' S" E    {* R! b0 p7 H. L# O. ^! k- H4 O* y
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,7 V5 I0 {' Q2 V; D( j9 t
                                                       (EDMA3_RM_EventQueue)0,
3 p$ Y- s( W5 K( c                                                            &edma3_isr, NULL);, k; |# f, Y; ^: M# K0 g9 w
    }
. K: E! Y  S- c: B; Z       
* a+ I' N- b. f) ]3 E  @+ I        if(result == EDMA3_DRV_SOK)
$ k: o9 D3 A) @5 k        {
) }5 r0 ]1 C; u                paramSet.srcBIdx    = 0;( _! D* w; p/ {+ m( l7 m
                paramSet.destBIdx   = 1;* @" o$ u, ]4 A6 ?/ @; h
                paramSet.srcCIdx    = 0;
# e) P) p! ^4 G$ u                paramSet.destCIdx   = 0;, U0 N! p$ m2 {* E
                paramSet.aCnt       = PING_PONG_ACNT;/ d% j2 g0 ~. f! c1 M9 y2 F
                paramSet.bCnt       = PING_PONG_BCNT;* b2 I. S$ Y! K$ `
                paramSet.cCnt       = PING_PONG_CCNT;( |& V( _0 e( R3 \8 U" l; S
                ! u5 ^5 S% ?. h+ a: ^
                /* For AB-synchronized transfers, BCNTRLD is not used. */
. [2 _: ^$ w0 X  G                paramSet.bCntReload = PING_PONG_BCNT;
( y5 i7 ]' S1 j; z) I# N. w+ I2 ~, q3 U+ n
                /* Src in constant mode Dest in INCR modes */
6 h  Z) R5 [; d                paramSet.opt &= 0xFFFFFFFDu;
9 `" u' X- f, m' }$ g8 P                //paramSet.opt &= 0xFFFFFFFCu;
/ B/ S5 k5 |, U2 F                4 s7 b7 @3 O6 w  }  y1 g$ S# v
                /* Program the TCC */# H1 w: k  L) c
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
* t- w  w; [) ^8 k: b) x9 `" B: V: V
                /* Enable Intermediate & Final transfer completion interrupt */
. H, M% S: p/ Z8 u2 v' P7 e                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);0 ^: ^( `' I9 M: w0 D
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
% S# L9 k3 I' u
, u$ l  n# }  E" ^                /* AB Sync Transfer Mode */8 ^4 d  W0 \9 ]
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);  ]. X, z. F- C9 t  K1 H$ S
               
& ^5 L3 x" g" {' t                /* Program the source and dest addresses for master DMA channel */- b( W% g" ]8 D( P
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);9 h* J8 h  m5 m3 `/ B( o) V$ F$ {
                paramSet.destAddr   = (uint32_t)(ping_buffer);
' y; y7 U, K  i7 H
" l: ]6 p4 `: B6 j, f1 s  q% d                /* Write to the master DMA channel first. */; ~" J% ]) i5 A2 R* |5 T; |8 u
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
$ l" h% K6 |" {2 r" S3 l    }      
: J- X, X5 Q* {- d& V9 E& ^2 W4 R3 m& G2 i1 Z* v
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
0 O! Z6 s8 |& O' O        ) ?) z% c0 j7 Y7 {6 u# r* R* w
    if(result == EDMA3_DRV_SOK) 0 m- a, y- z3 Z) p, |" q1 r
    {
% L* ~9 K5 N7 D$ F$ x            print2arm("edma3 driver init success.",0);4 P4 p% w! f4 B& Q+ g$ X6 V( E& C- U
    }
  r& f6 {& I; i. g* t! q# M}
; G+ }% h! H! ]- o
- O4 A# ], d+ N: W/ o7 V% F) u$ X* S/ D% J+ \9 ]2 F. G
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。3 t. F: i3 k# c' m. K. K
. x4 Y. z# k& J8 T# a+ H" ~6 x
: u- S6 K5 u( V7 a

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47/ c9 i* g" \" p9 T, u: R! m6 I
每次DMA传输完成后都要再次使能传输

" O: n$ {* K2 d- C. S+ l( [- I原来是这样,我明天去试试,谢谢了!




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