嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:. f- }/ `; \2 [+ }, \
#define  PING_PONG_ACNT          1
% L! N6 F! ~  r* e#define  PING_PONG_BCNT          8*32*40
& k  U8 \6 K0 O! [//#define  PING_PONG_BCNT       1 0 f0 A6 Z7 U* h6 Z, H6 m
#define  PING_PONG_CCNT          1# C- z% q% B( H4 I
#define  MCASP_BASEADDR          0x01D00000% w9 B( `! J8 _6 g; k- @
#define  Mcasp_RXEVENTQUE        (0u)( }) r; @9 W% j& g

  t8 u- Q9 d) |0 i$ G; z/ e/* OPT Field specific defines */
: w* \) |' E+ d. m& O* H#define OPT_SYNCDIM_SHIFT                   (0x00000002u)7 W1 ]9 y4 w- a) N% Y
#define OPT_TCC_MASK                        (0x0003F000u)
) d3 z8 A( R/ @( _# D5 Z8 E#define OPT_TCC_SHIFT                       (0x0000000Cu)- n; V; c& X+ t; L% T5 e! j
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
% s, L, C* y3 c* z#define OPT_TCINTEN_SHIFT                   (0x00000014u): k. s" Y/ l( i8 c

1 C; _; a7 d. X* x* ^' ~char ping_buffer[PING_PONG_BCNT];
. ]& n7 R/ B/ _# _$ Y  E1 Ychar pong_buffer[PING_PONG_BCNT];" S9 D; X1 g! K
* }" f! B' e: ~: [

! w8 }( w" |3 \1 a: \' ^( ]9 Y' p
& c  T1 o" T5 v/ [7 r( m
0 h  S6 D6 B) Bstatic void ys_edma3_init()7 R9 u6 ?+ x8 j- a  |; x
{4 s* @6 M' I9 W  g
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
* R1 h' q8 ^5 L. A. J2 l        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
, o& E6 M3 t8 P" i1 k. h0 g, l7 _        EDMA3_DRV_Handle hEdma;  O. H% C% C% I9 E6 q/ y% m
    uint32_t chId   = 0;: e7 }4 ?' _6 O/ m$ q
    uint32_t tcc    = 0;, X$ g. j' P) a. v0 Y8 `

7 i1 O" Y* ^' f( U; G7 h    print2arm("edma3 driver init...",0);
* Y" d1 c  G6 n* V3 c( N
3 {- b1 h% W' Q6 ?4 H* ]        hEdma = edma3init(0,&result);6 m1 w& O" U8 N4 q3 _
        if(hEdma)/ T- d7 h3 z7 S0 u( |; u7 U
        {
$ }/ L! K/ u5 \: \% t, Y                print2arm("edma3init() Passed.",0);
3 N0 ~  a5 p4 r& _( @, b+ A  j        }% \- |7 ~( j/ W$ t( P" @6 }
        else
; I+ y* [5 a. x  `+ [$ t+ L- U        {
8 L7 ^& ]) h9 K7 _- s  t+ w6 Z                print2arm("edma3init() Failed.",0);& o* b0 `0 F8 D  t9 @, S# Q
        }
* u0 x: i: I4 P& w; p. N7 n; V0 w        ' `7 J) P" K' u% p4 Z9 A
        if (result == EDMA3_DRV_SOK)
' w  F: ~6 ?; U  g$ L5 x    {
$ |$ ?" g. v( K7 P0 u                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
! ~) J" l& `2 W7 u" m                                                       (EDMA3_RM_EventQueue)0,
2 l/ Q% e2 M" D0 E/ ?! i7 R                                                            &edma3_isr, NULL);6 ^6 z+ H2 E- t+ F
    }) ^7 O. F& r* m2 v6 A8 N1 h% f- m% l
        . K9 Y2 Q2 Z6 I! S- }
        if(result == EDMA3_DRV_SOK)/ p7 K! z" u( u  z5 _
        {
% H( ]. [6 c9 g: Y" r: P7 Z5 b/ [                paramSet.srcBIdx    = 0;% d& _: u$ {5 p! |5 ^7 u7 @2 D
                paramSet.destBIdx   = 1;
& l8 N* y$ v6 g/ ?' X                paramSet.srcCIdx    = 0;
* |% x7 k; R0 p( w                paramSet.destCIdx   = 0;
9 L/ q7 W+ Z" F- j- P: F                paramSet.aCnt       = PING_PONG_ACNT;
: q7 t9 E/ @* T/ t8 G, U+ r                paramSet.bCnt       = PING_PONG_BCNT;$ u7 [# ^. K5 O! k
                paramSet.cCnt       = PING_PONG_CCNT;
5 R, ^/ W& |, y( d! w* M+ f                ' _. q8 g- ]2 i  b& O9 {
                /* For AB-synchronized transfers, BCNTRLD is not used. */* w. Q2 Y4 B9 Q+ N* y; Z& C
                paramSet.bCntReload = PING_PONG_BCNT;- A2 K" P. e$ u; s4 v

" w7 _; A' ~- {                /* Src in constant mode Dest in INCR modes */* c8 w8 ?* r1 `) D: c3 [# O$ s
                paramSet.opt &= 0xFFFFFFFDu;
5 }$ J6 p! U$ i3 O+ S                //paramSet.opt &= 0xFFFFFFFCu;
/ d2 s) y. Y5 d7 y                $ [  v# d- N+ s4 W
                /* Program the TCC */% t5 y/ L. M! b* R
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
  K0 u+ `/ P3 F  S0 D
- d+ R# O8 T5 J9 r9 i/ r4 i                /* Enable Intermediate & Final transfer completion interrupt */
& p* U0 U! l5 ^                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
% F: U/ ~9 \+ K/ D* p                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);& R: C" ?- E6 e
) K8 ?! v, e" s2 ^; G: A, B/ s
                /* AB Sync Transfer Mode */
3 r4 `+ {2 _+ F8 s                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);4 k2 ^! s3 [  i# ~* p6 B. x
                0 v- h; b3 D/ T" ]( J
                /* Program the source and dest addresses for master DMA channel */
$ H9 P5 t1 [! H9 X9 e, R                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
" s! j- \, {3 W3 a5 S                paramSet.destAddr   = (uint32_t)(ping_buffer);
! A2 e; j" i' Q; o* j
3 X1 @6 E3 g$ l. N0 k: ^  u) @                /* Write to the master DMA channel first. */' X. N' a1 ^% y
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);% A" G! [6 P0 e5 {& @1 `
    }      
+ Z2 ]5 U* u) E5 t  }0 o" |# I+ h+ A% c
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);- E8 V. ]9 I; \8 v9 @
       
2 p0 j# D5 }. n5 F3 h    if(result == EDMA3_DRV_SOK) 2 J7 e. U. v6 D# T8 w, D3 r; Q; @6 m
    {
7 U6 H% ~' W/ x* x6 I            print2arm("edma3 driver init success.",0);% l/ p4 V' D+ _: w( k0 b
    }
/ ?0 L; c4 R3 ^2 }" G+ [}
! m8 j9 e# A. g2 ^/ o' v7 C" {- p4 k& V& v6 N+ E+ N
) d; ~% `' k) r2 R4 B7 y7 K
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。( _) f1 E1 X. B/ |6 a9 ^( p' J( b

. ^5 K( |0 A! z+ K( ~  A
7 t* V7 F8 b7 V. y3 l& ^" G# Z
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
( @% a4 Z: ~% V1 o4 W每次DMA传输完成后都要再次使能传输

% t5 u) Y' l4 J2 Z原来是这样,我明天去试试,谢谢了!




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