嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:% a6 S8 J7 n2 M" P5 k
#define  PING_PONG_ACNT          1) j9 L- W4 q3 I
#define  PING_PONG_BCNT          8*32*40   h* M! c& u% z7 U* w3 ]+ @5 _
//#define  PING_PONG_BCNT       1 1 O: L4 X  s' I5 o: J) I
#define  PING_PONG_CCNT          1: K- W( L+ k( s
#define  MCASP_BASEADDR          0x01D00000
  c* ~5 P- \; j2 x#define  Mcasp_RXEVENTQUE        (0u)
+ x1 H% t$ F! H* S0 K& ]- y9 j9 t7 G& m9 t/ K6 q
/* OPT Field specific defines */
' \* @& f0 M6 b  Z( i#define OPT_SYNCDIM_SHIFT                   (0x00000002u)& }4 e+ h9 {: W1 }
#define OPT_TCC_MASK                        (0x0003F000u)$ T* I# X1 b* |( y
#define OPT_TCC_SHIFT                       (0x0000000Cu)( d' x0 P, `) o: b# T8 ~
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
4 J3 _1 H& q9 z) f1 Y; ]+ v( K#define OPT_TCINTEN_SHIFT                   (0x00000014u)
8 N/ W$ ~9 R, u- M4 m/ w/ L" {, w
6 R$ o$ X8 k* Qchar ping_buffer[PING_PONG_BCNT];
7 @1 r3 I1 Q& H! |( Cchar pong_buffer[PING_PONG_BCNT];# N1 v" e/ ]7 r3 i& {9 z+ s

7 o1 r/ G7 w% e& n
3 P2 V, e+ f% w9 V9 A) t' H( P
5 F$ _6 O, Q. N% J) m7 e6 Q# I# _9 n+ E* d, H; C
static void ys_edma3_init()  k; u, b% M1 x, G2 G
{
7 W* y  S2 c- K( r0 q        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};) g. ^! z" [# k0 ]
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;( ]4 a  M( `7 W$ K
        EDMA3_DRV_Handle hEdma;% o+ z, j; j$ ?4 o9 {6 ^
    uint32_t chId   = 0;1 K. q. l+ E# s* v
    uint32_t tcc    = 0;
8 e/ S- r. x! S7 Q; a/ L  B
  M. v/ @+ s( Y6 M    print2arm("edma3 driver init...",0);. \; }" m9 E( F
5 b" k4 ?6 F- z
        hEdma = edma3init(0,&result);9 b9 m* N! Z+ M8 D, c
        if(hEdma)" j3 J- h3 W1 q- `
        {% F/ f. A& n% e8 b1 {
                print2arm("edma3init() Passed.",0);. x/ J6 o3 O) {) L0 K. t
        }  L. j$ A8 X# V9 q
        else) b0 U1 |8 H' {% z& x
        {
' [/ y% u- U) V7 R                print2arm("edma3init() Failed.",0);( ~4 y, M! P8 h# F9 U/ t) f
        }- H/ Y+ @5 O+ {1 d
       
0 d- W2 \) Y+ z$ H        if (result == EDMA3_DRV_SOK); h  y; }# @, ]
    {
8 v+ p% A+ j% C0 p; j1 `  I                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
5 L4 w8 P( g3 u$ D                                                       (EDMA3_RM_EventQueue)0,2 p: S5 h; l9 g5 C
                                                            &edma3_isr, NULL);5 v" F# R: i  X; K
    }
- t. M! L" k6 p+ l       
, K5 i$ d8 v& d& N, y        if(result == EDMA3_DRV_SOK)9 ~3 c; J, q( H/ g
        {
8 s4 |( S1 F2 |                paramSet.srcBIdx    = 0;
* s% c: X5 t, f2 x$ G' o                paramSet.destBIdx   = 1;
. G! Q3 N1 C5 |5 s7 d/ F                paramSet.srcCIdx    = 0;
) y6 ~: r2 f1 D" }% l& K                paramSet.destCIdx   = 0;
9 Q  A2 T) N4 _# o3 W7 ?                paramSet.aCnt       = PING_PONG_ACNT;
- {" b, s% {# z8 P                paramSet.bCnt       = PING_PONG_BCNT;
1 k' G7 }2 N" U4 S                paramSet.cCnt       = PING_PONG_CCNT;
6 d: ~% G1 v* E6 I( o                # h/ x* \, P, }' K) g% w; T
                /* For AB-synchronized transfers, BCNTRLD is not used. */
2 Y7 {/ X6 c6 X8 l5 s3 F( A7 P( C                paramSet.bCntReload = PING_PONG_BCNT;
" f! R" ]  `5 C+ W6 V
% k, D1 T! L. u/ p: o. n" a$ a                /* Src in constant mode Dest in INCR modes */' A/ L0 ~7 V3 y' V
                paramSet.opt &= 0xFFFFFFFDu;" {; V* t  A) h& a3 o& j
                //paramSet.opt &= 0xFFFFFFFCu;( J- G* f2 o' p# Y2 b. P
                ; T. H1 R, m8 r8 C. W
                /* Program the TCC */
7 o0 Q; P- m" B' B  A- T; O                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);" R6 A: ~" ^$ g$ t5 \, i7 x! F

! z9 A. v  [% R- V$ P" {0 i                /* Enable Intermediate & Final transfer completion interrupt */
' t8 ]  |# d* j9 ]# z                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
( S* h+ H2 X" ~& t                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
3 q- Y' A# X, x, \$ ^5 u+ j$ _+ _! ]* B, |# D9 H2 Y4 X9 `
                /* AB Sync Transfer Mode */
" o+ Z" P' j  i9 P+ n                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
$ |/ t9 V; C( w) u  R' |                5 S4 [# V( F. D6 l9 m
                /* Program the source and dest addresses for master DMA channel */
& K# X! F, l, \( N$ w9 j! F+ s                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
1 \2 }. \/ P( l& i1 Z2 c* O; h% z5 p0 z                paramSet.destAddr   = (uint32_t)(ping_buffer);
* n' a% Y; @& r" v+ M& G4 {# g
, a6 f8 X% W* }! W                /* Write to the master DMA channel first. */
; L8 p9 Z* T8 @$ a4 C                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
3 s/ Q% f) \+ G, k, W0 H2 v% e1 Y% s    }      
3 q4 U* z9 v3 R. V- z
1 T/ z. Z6 N9 n: \9 K$ ~        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);3 A. N# g+ |& G2 R8 L1 z, L9 L; Z9 t. W
       
  I+ S5 O0 |9 f- a) S$ z- f' N    if(result == EDMA3_DRV_SOK)
  T3 S  o: w* W1 Q    {
6 L/ p6 D* n7 J& q! I            print2arm("edma3 driver init success.",0);
! B  r) o( [1 S+ F: E7 I    } 5 Q% g- M, d% e% [
}" k2 A% Q) y9 O9 J6 F9 G

0 `4 r# m, s8 }4 {4 m1 f: [. e- A' ?9 c/ }7 {) H. T) a. s6 \
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
) `& \+ j2 a- p7 ~: l+ u+ \1 n: u% N% {9 ?; ?' I: i. c

$ q, n! r# ]! q8 T8 r' y$ \; O4 _
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
+ U$ `2 a. _7 |每次DMA传输完成后都要再次使能传输
5 R. ~" [/ M  m& K6 n2 s
原来是这样,我明天去试试,谢谢了!




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