嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:* m$ v9 t$ {, d# q7 h5 l
#define  PING_PONG_ACNT          1! I# [- T1 N( f$ s2 |) q/ K
#define  PING_PONG_BCNT          8*32*40
( |2 R" Q+ ?3 k5 [) x4 c$ R//#define  PING_PONG_BCNT       1 ( G( y- ]/ X9 D( v5 p5 A( o# w- `
#define  PING_PONG_CCNT          11 ]  u/ D; @( F" K5 L) Y) q) r7 b
#define  MCASP_BASEADDR          0x01D00000: n# Q8 m7 E% n' v/ J& x
#define  Mcasp_RXEVENTQUE        (0u)2 K2 r) U; w; V7 J$ |' p" G
; U/ \6 z9 [. M: w( r+ M
/* OPT Field specific defines */
7 l, b8 G8 ~0 H! P#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
  _% @" X6 g' g2 }#define OPT_TCC_MASK                        (0x0003F000u)2 v' T9 h( Q( t$ N5 v0 M
#define OPT_TCC_SHIFT                       (0x0000000Cu); g2 y' o5 ^% a( B
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
: B( ~/ }) ~8 w* G$ V#define OPT_TCINTEN_SHIFT                   (0x00000014u)! `" v% Y# \5 N( M0 U" {
9 U1 [( f" h; W. t
char ping_buffer[PING_PONG_BCNT];6 A! e2 i1 L$ f8 S/ Y
char pong_buffer[PING_PONG_BCNT];' t5 B/ M% i- U, v5 m8 m$ t5 B
: V6 r/ E0 n1 N. D4 L  v/ n: n" ~" f

& a  }" x' ], m0 i' f& ?+ c% W: b/ M/ z# w5 J  |) T

5 u% ^* s0 d6 [0 S' h* s  Fstatic void ys_edma3_init()7 b2 R4 Y0 p/ w: x& P. h% P
{
% `" C6 q; S1 g        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
3 D7 I/ h" ^! N1 E, T' S4 i        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
; F$ o4 g2 J) i! r) i        EDMA3_DRV_Handle hEdma;: }+ ]) i* y  c( v% R# F
    uint32_t chId   = 0;
( v- f- H5 C4 {! O, C    uint32_t tcc    = 0;7 P9 y* }7 Q* Z

: @) ]1 O  J- A2 _  y7 s% T, ]    print2arm("edma3 driver init...",0);
3 ^' V4 i" X' }
/ n' f; ~) {" S5 t+ M, D0 K        hEdma = edma3init(0,&result);
3 l* A2 h' o2 a. z        if(hEdma)/ X$ I9 L9 b) p, Z$ d0 \
        {5 ]" M- R( D& S: ?8 v5 q
                print2arm("edma3init() Passed.",0);, G$ _, w, {6 Y/ n; }
        }
6 J! [3 Z8 W4 R9 V        else  ^- n( C9 l4 w8 D$ i* N
        {
1 `; Q8 j& C, s* K! Y, i; t) e                print2arm("edma3init() Failed.",0);
. s1 n: @6 I/ F7 \        }
: ^5 o! D9 r3 f' M* K8 f       
0 L  c; h% W5 g6 E$ l' P4 P        if (result == EDMA3_DRV_SOK): s) d( _; o! k3 ]7 O/ k" m
    {- o7 T6 s3 [$ Q0 ^0 ^: p* }
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,% v9 i  U" ?  ^% @( k* v$ G' E
                                                       (EDMA3_RM_EventQueue)0,
6 W% Q( k3 x  V5 \                                                            &edma3_isr, NULL);3 {0 M! w0 |4 N% N
    }2 ?. n# y" L* o
       
0 x% u7 q- F: ^' k) D        if(result == EDMA3_DRV_SOK)
3 g7 M/ P+ {& i0 H0 b        {
: S/ M* s# k5 m8 V                paramSet.srcBIdx    = 0;
+ n: ~' }2 U: B5 j' Q/ d* \1 O                paramSet.destBIdx   = 1;0 E% [! m. N$ }" a
                paramSet.srcCIdx    = 0;4 r. L  K! X+ ]- z: q( l7 D
                paramSet.destCIdx   = 0;  \8 R3 W" g- Y) _3 ?. X
                paramSet.aCnt       = PING_PONG_ACNT;; _" j/ m& g" D: B3 N
                paramSet.bCnt       = PING_PONG_BCNT;/ ~# h1 G. @$ y/ ^, M: e4 ?. G; k
                paramSet.cCnt       = PING_PONG_CCNT;; v  I1 ~, z( h7 h" W
                " H+ j6 A0 Y' D+ m" A9 z
                /* For AB-synchronized transfers, BCNTRLD is not used. */: k* P8 g6 H9 Y6 z8 ~1 f- \
                paramSet.bCntReload = PING_PONG_BCNT;8 h2 V/ Z* j- L  z" V
0 ~7 w5 O0 d0 o2 S
                /* Src in constant mode Dest in INCR modes */0 J6 W, a& S% d; @. w
                paramSet.opt &= 0xFFFFFFFDu;1 ~( |1 |3 Y; |* G
                //paramSet.opt &= 0xFFFFFFFCu;
+ Z, Y* p% g8 }# F. D! C. F               
( e/ \% p6 S1 W' c# ?                /* Program the TCC */
; w) X% C& b+ @( Z2 [6 a, f                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
) S% L- }& H, K4 [2 C
" z; l5 j3 B) h, k                /* Enable Intermediate & Final transfer completion interrupt */9 Y4 `) D# @' ^( I  i& K8 Q* \
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
/ E7 I% T, _  H' L                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);# N: t6 Q- ?3 I0 H) h' G( V9 H
9 b9 @- j1 v8 f9 D6 O
                /* AB Sync Transfer Mode */
% _* H" e2 a+ s                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);& G4 c5 B; v' w! I
               
1 v% S+ n; I8 S: ^1 E! _                /* Program the source and dest addresses for master DMA channel */
6 s" ^/ P1 T2 f; Y$ r- A& Z                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
$ D4 X- }1 m0 |& F0 z. @! n, x                paramSet.destAddr   = (uint32_t)(ping_buffer);
2 X2 h; m$ o% r1 q/ d$ b  J6 G2 D" B2 i6 H1 F8 d1 S; A
                /* Write to the master DMA channel first. */
2 |* ]. X' K: }* ?& f/ w                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);6 U, V; s8 w* O+ ~% o. n5 p
    }      
3 k/ R8 e* g. J5 {0 B) ]
7 p' o( j- z" d( ]3 m; `* _; L        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);# X& S3 q. K, j, h. k! O. @
       
4 X4 Z. v7 R9 N( k' D- _    if(result == EDMA3_DRV_SOK) 8 }! g" E/ _3 G/ f' z( }! q
    {
  W6 Y5 V/ O4 P0 u            print2arm("edma3 driver init success.",0);
2 f. k! V( K5 b5 F5 j3 E    } 8 ?) T  v% l+ J; e0 E! Y! E
}+ i; `6 [) r! Y) @4 e2 h
' x0 k% I4 v# `+ p

) R. r2 n  d% _1 N& S  |8 C  L: TEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。* c& a4 A( S1 @2 _
2 q3 Z5 u$ L. g! F/ c  s- W
, R/ r2 T$ W% P% P

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
- b- A. i* U1 q: O! c每次DMA传输完成后都要再次使能传输

+ _, B& G; p5 _! n% U原来是这样,我明天去试试,谢谢了!




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