嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:6 n! H1 i9 t4 N5 z. ~
#define  PING_PONG_ACNT          1, C0 w7 m: u" L5 O& ^
#define  PING_PONG_BCNT          8*32*40
' k, S! G) G5 G- x" c% M//#define  PING_PONG_BCNT       1 ! N: O1 d* j" d% m% Q+ D7 s% u; [
#define  PING_PONG_CCNT          1
& G4 C! C7 ~& D1 k: j) F" P! C& K#define  MCASP_BASEADDR          0x01D00000
% {$ x3 U. l( z8 y" ^/ {#define  Mcasp_RXEVENTQUE        (0u)
! }2 |6 T. r" y8 G0 x' B" S  ?! X+ }9 d  ?' d- u" T& E0 t; H
/* OPT Field specific defines */
$ L% q- M8 P3 q# Q/ [; e#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
! Q: |9 h# b4 T% A0 W#define OPT_TCC_MASK                        (0x0003F000u)
6 s: u& F& c0 G7 X3 f0 I#define OPT_TCC_SHIFT                       (0x0000000Cu)
* V) `. h) J  E+ y! h#define OPT_ITCINTEN_SHIFT                  (0x00000015u)/ K8 {2 v- Z; f: a* c. j
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
+ \# {% b8 f- r. W& y9 z
* j1 u( U/ p, U9 [$ @char ping_buffer[PING_PONG_BCNT];
' \- ^5 G. u# o2 S; k8 schar pong_buffer[PING_PONG_BCNT];
; S! P3 U+ y7 u9 G4 P$ v' i- H3 j) ~; F

* U& L! _* ~( Q) n* z8 v5 y+ Q8 a1 O3 Q1 T9 V) X6 G1 c+ c# ]) r# e8 u

9 |/ g5 R/ r" E* U. H' Lstatic void ys_edma3_init()
) R0 t# P$ r) f$ g{  J6 z" y' C; v4 O
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
# l9 u/ @5 t* C8 ]5 A        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
, B* X! N' a: k7 @; Z2 U5 C        EDMA3_DRV_Handle hEdma;
  Y4 {4 k4 m0 w" A    uint32_t chId   = 0;2 E4 W' R( b/ i$ W* d
    uint32_t tcc    = 0;
7 J2 P8 k8 M9 s, h% s' W' l2 ~  J9 Z1 ]+ M+ [
    print2arm("edma3 driver init...",0);
% O% L' q3 x% }  X; R) N
3 t5 o# _3 ]# j3 O% j2 Z8 _        hEdma = edma3init(0,&result);
; r* `. r4 N1 v9 U" y( ~0 [        if(hEdma)/ A" ]# }5 I3 Q" h# u
        {
* r: d( M1 g2 \6 G% k                print2arm("edma3init() Passed.",0);
8 [8 w& L! P. Z! p# M0 N% k        }
) M- E; Y. V5 ]  p5 G* ]: y: T& J        else
5 e7 k" }" b0 [' p. w        {
* ]8 S6 R" \9 ^  q                print2arm("edma3init() Failed.",0);
' B- q" o  v; C        }
+ W0 r( B+ ?  H$ ^' H. J! g        . b# j% s2 m$ s( b  k
        if (result == EDMA3_DRV_SOK)( R& A& `6 i3 F( U/ w6 r
    {6 A, g, [! X9 {: h* e
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
, R" y5 {8 y0 P2 v; Z5 t& y+ n                                                       (EDMA3_RM_EventQueue)0,! H& {: X; c, i; @7 D3 Z. t! k4 L- d7 Y
                                                            &edma3_isr, NULL);8 w+ T& e$ p: ]
    }# U' y$ F% [. g4 U" t% J
        * |4 U' W9 o4 o
        if(result == EDMA3_DRV_SOK)
  K, Y: W' l2 |( G1 B7 ]# ~        {1 p; p- E4 D: r: Q/ O' q  I
                paramSet.srcBIdx    = 0;6 ?6 c+ {# C3 q' V) e% r
                paramSet.destBIdx   = 1;$ k8 {" w2 v9 i
                paramSet.srcCIdx    = 0;
9 w& J  H3 B4 m# I- j2 A                paramSet.destCIdx   = 0;
, L" |! Q) u: X) P* W+ H                paramSet.aCnt       = PING_PONG_ACNT;% d) S9 |1 f, q( s5 B
                paramSet.bCnt       = PING_PONG_BCNT;
( o) V9 |! \6 U                paramSet.cCnt       = PING_PONG_CCNT;
# {. u/ {% ?6 ~                - ~; P) z  o# I1 P  r! D
                /* For AB-synchronized transfers, BCNTRLD is not used. */7 v; |% \7 o8 F1 S  @: z, }1 T
                paramSet.bCntReload = PING_PONG_BCNT;
; S; \" B5 s$ e
9 Q9 R' X+ q! ~7 \7 b- a8 `                /* Src in constant mode Dest in INCR modes */
$ l) ^7 u* v( s3 R0 u0 Y                paramSet.opt &= 0xFFFFFFFDu;% @6 Q% C' @$ F. _+ K
                //paramSet.opt &= 0xFFFFFFFCu;& d3 o8 U# v0 a2 q* U+ L
               
) D3 f  x" }2 v/ K1 u5 \5 ]0 k                /* Program the TCC */
, o  f, a1 {' _6 T                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 b! D- Z# i2 V4 V; s
, M! M# ^' j8 W( a0 n                /* Enable Intermediate & Final transfer completion interrupt */
" ?  H9 [/ S- j2 z# ?# }" s                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);! R0 U- D4 t  S# x0 \/ l3 i
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);+ _# O1 I3 W* y: n. Z% ^
8 m8 R; U: I' w3 d
                /* AB Sync Transfer Mode */
! x+ F2 C  e, z5 R1 _( \                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);  K7 b2 H# ?; t& q
               
3 K, ?" k. V. @0 m1 b, ^, W                /* Program the source and dest addresses for master DMA channel */
* n4 \3 ~. s/ e5 @# l                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);) H- ^0 [0 F& F1 m4 r! l
                paramSet.destAddr   = (uint32_t)(ping_buffer);
- w9 q  N  x: o$ Y: p- t, V7 ^
' N, n6 M+ p' G. v                /* Write to the master DMA channel first. */
1 ~5 A" J4 }" ~# z0 }9 g                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
0 Z& C) @' l# Q& s    }       6 Q& K/ @; d6 s4 n% `
* n" `5 Q3 m! c2 f( x) R3 B
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
3 \8 w1 Y$ p. a  S5 S       
2 l; W* f" b" s1 v5 p! @    if(result == EDMA3_DRV_SOK) " r9 T2 u1 x1 R. E1 _7 V) a0 h
    {
5 A! \' z- c. J! A4 O& I, \6 w            print2arm("edma3 driver init success.",0);: P. P% Q" v% `0 m
    }
# f' x  t6 ?" Z8 }  U- r/ `}
  p( C0 ?3 B( j9 ]) o/ _
: s$ ~& D1 o9 t; ?( H+ c4 G
8 ~2 M% B1 _0 x( @6 Y) Y, [EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。( |% g5 x5 g; n& G6 Y7 M

$ m8 O5 F. V3 J& c6 A+ |
; `( g+ J4 a9 ]% E5 S+ I' \
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47: \& q: r& ~6 d% D2 X* O' w
每次DMA传输完成后都要再次使能传输

1 K/ X+ v/ L- x' a* m% z原来是这样,我明天去试试,谢谢了!




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