嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:! U) K( N0 E7 g8 F
#define  PING_PONG_ACNT          1
$ Z% B7 Z) Y1 T5 o5 Z$ L#define  PING_PONG_BCNT          8*32*40 : z' [2 {) b  Q: j
//#define  PING_PONG_BCNT       1
- V' F0 J0 g- Y; l" Z9 z* e#define  PING_PONG_CCNT          1, e5 p3 L+ u' P8 F9 a
#define  MCASP_BASEADDR          0x01D00000
' |5 {! M  _; `2 K5 T: d( I#define  Mcasp_RXEVENTQUE        (0u)
8 O8 H0 L; Y1 N" @& T6 j+ r2 T# P
& K+ J$ B, }2 r/ z" N/* OPT Field specific defines */
, Z* }, E7 Q- `9 G% R#define OPT_SYNCDIM_SHIFT                   (0x00000002u)# t& m; q$ ]8 G/ r  Q
#define OPT_TCC_MASK                        (0x0003F000u)
* {- Y0 \5 X$ v1 A4 i/ a2 n#define OPT_TCC_SHIFT                       (0x0000000Cu)) }: o: U4 V3 p6 c& L7 N5 q/ `: @
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)% b0 S  |+ e/ t% r
#define OPT_TCINTEN_SHIFT                   (0x00000014u)  ^+ O, }7 n+ P. E* r5 ?

1 j5 e5 m3 O% r2 {) dchar ping_buffer[PING_PONG_BCNT];
( D$ o$ f. b/ _  {4 {3 Ochar pong_buffer[PING_PONG_BCNT];3 S1 r+ m9 ?5 S( [. f' N8 y$ W

  w7 I/ F# Z; A9 m8 s8 c4 c# h9 @" q# O: F

. `. C/ v7 ^0 O' S. `
' v2 q; V% N! r5 N7 mstatic void ys_edma3_init()  c  O0 @, v" L8 i% ~+ o
{( w( }; q1 C* _: m
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};5 ~, Y" l1 O$ y) i# d: x3 \, X1 e
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;" y& T" U& ]$ N
        EDMA3_DRV_Handle hEdma;) T: ]8 |# W, w+ ]
    uint32_t chId   = 0;0 n9 \! S  k( N8 N
    uint32_t tcc    = 0;# e$ d$ e1 `: E" i) P

# ~3 z7 Q* t, U# z8 q# A    print2arm("edma3 driver init...",0);: [* u, A+ l3 M. ]
7 i* r# f; {& t  o% n6 Y
        hEdma = edma3init(0,&result);( j7 t* L* V+ e* U! Z. V, l, q) U
        if(hEdma)2 N: x* L" h8 [  p7 \
        {
& w# I. y! {! b& o/ \                print2arm("edma3init() Passed.",0);" V& i, N  Z+ _0 I5 b- @! L
        }
& K( S" @, v0 t& c8 Z! V6 g        else( a1 L9 f9 \0 I. E
        {
  `% h3 v; D6 I+ Y                print2arm("edma3init() Failed.",0);
0 p+ T4 O* h) s- I2 \) E% y        }
! b* X" G% E, J3 e, }; d% B6 {        / K# Z( a1 I+ f: j. f
        if (result == EDMA3_DRV_SOK), K* L' L) V: v9 n8 Z' C) K% N
    {; w4 B4 r# o6 N
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
/ r8 C. y  \. _$ t8 a                                                       (EDMA3_RM_EventQueue)0,
6 i3 \7 F0 _8 M0 X% b& v) T( @                                                            &edma3_isr, NULL);
8 y$ ?. ^0 x7 E6 E    }
% v3 x, j! |& H3 N/ L/ ~       
2 y0 ~) O* p6 K& c4 M" c        if(result == EDMA3_DRV_SOK)
# t% |. m; z; ^$ [- p8 B1 }* i        {
3 P) x% G0 b! d                paramSet.srcBIdx    = 0;
0 b$ E! b0 _/ V7 C' q2 ^                paramSet.destBIdx   = 1;
* {7 A" D0 [* L! e; E( G; G3 _                paramSet.srcCIdx    = 0;& X; ?4 C- N$ |$ E( v
                paramSet.destCIdx   = 0;
- Q7 g3 q4 I* r9 V7 I- d( ?3 q                paramSet.aCnt       = PING_PONG_ACNT;
9 K+ @3 c9 T+ U7 _                paramSet.bCnt       = PING_PONG_BCNT;* d8 o! `. H' J+ [( D
                paramSet.cCnt       = PING_PONG_CCNT;
% h: e  D3 G6 [% s2 n               
. g, G1 A4 N) _& U: Z3 a                /* For AB-synchronized transfers, BCNTRLD is not used. */
' L+ u7 ~& z! U3 o/ _                paramSet.bCntReload = PING_PONG_BCNT;
& [% _) o0 T9 i7 z+ ?7 }
: j+ r$ v# p9 i) l                /* Src in constant mode Dest in INCR modes */
$ p- p5 C# n" o; L# B5 l1 B( k  D                paramSet.opt &= 0xFFFFFFFDu;
! c/ ]- a1 N' b8 A                //paramSet.opt &= 0xFFFFFFFCu;: C" E: \- `" i; _! J! D1 Y1 {- m7 D! {
                7 ?2 I3 g" d0 T" Z  `( n
                /* Program the TCC */8 @7 F/ A, r# _0 Z& m( N
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
8 \8 G: s' A8 {+ K; d2 I4 g+ Q
2 Y6 `4 _  n  a6 s! d& C                /* Enable Intermediate & Final transfer completion interrupt */
; ?& k% e, u4 S- e4 p                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
, F/ K- s0 }& c; n; |                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
* Z3 {  W5 o3 I) x$ e  Q1 @
, K( o0 E( U4 x                /* AB Sync Transfer Mode *// g7 S( J2 Q# p5 s
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);0 E# Z+ ]1 K, F
               
; ], a- a: e& M0 r+ a- _& b3 R3 r                /* Program the source and dest addresses for master DMA channel */
/ g' f4 @* d/ B8 ]4 r                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
9 f6 a1 f5 Q9 N5 T/ g8 P                paramSet.destAddr   = (uint32_t)(ping_buffer);
3 t* S) e" H& x* k  T1 K! }7 s$ f2 G8 p
                /* Write to the master DMA channel first. */
$ v; f. _7 _8 F                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);) p: Y4 R( g5 c; K8 \5 {
    }       + T' `$ [% {: O% b4 [3 V, L
/ G9 _3 v6 Y. u) F/ t' I, L- o/ x; A
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);4 i5 I" m8 p+ q3 N& |& T% g
        : S! F$ I, G7 l: {/ g
    if(result == EDMA3_DRV_SOK) , g( ]$ Y5 i, U3 o, @- ~; T) H
    {
# X( q" s" x2 r5 \            print2arm("edma3 driver init success.",0);
' I4 n8 A; g: V5 d5 }; j/ I. C    }
/ `% f4 l3 P! Z( W" m$ V* l0 O}
+ s. }' b/ |, n$ \3 H7 S. q
& u, M" J- p# o. k9 T
6 a# e/ {1 `9 p9 C( C: HEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。6 p3 G3 V+ ~4 c2 U

1 |& M( }& {. ~: |' y4 \* t: M+ i
7 k" o  ~9 H+ d- f4 @( f
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
4 j! C% O, G& R每次DMA传输完成后都要再次使能传输

4 C+ S# z" e" d  e' [原来是这样,我明天去试试,谢谢了!




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