嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
; `0 @3 U/ L; K#define  PING_PONG_ACNT          1
+ x1 T0 o! ^6 f# V) ?#define  PING_PONG_BCNT          8*32*40
$ y+ T& X- S# d+ p" ?- P//#define  PING_PONG_BCNT       1
7 N( f' K" ^& f8 b0 G% m6 `#define  PING_PONG_CCNT          1+ O/ l2 W% l! ~' Y# d
#define  MCASP_BASEADDR          0x01D000006 {: U- E6 ~9 C$ a
#define  Mcasp_RXEVENTQUE        (0u)3 N6 D* s, |# y  z0 m9 q  k1 w

+ G; X4 E  g0 p# @1 Q4 h3 z  U/* OPT Field specific defines */
, R6 n8 q- T4 a5 k#define OPT_SYNCDIM_SHIFT                   (0x00000002u)# g( T1 L" p4 n  h: B
#define OPT_TCC_MASK                        (0x0003F000u); `! n$ w9 h  l: {0 B7 r
#define OPT_TCC_SHIFT                       (0x0000000Cu)) L# n1 r0 \" S$ T  n; n
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
8 m5 m+ s. K! d#define OPT_TCINTEN_SHIFT                   (0x00000014u)
1 N5 [% v" ~& N" E7 P
2 m" C- k2 c6 x  P! E/ D6 d% Gchar ping_buffer[PING_PONG_BCNT];
  `8 }' l" u8 H- Bchar pong_buffer[PING_PONG_BCNT];, x7 d0 C! s3 J0 q5 W
, d9 S  B9 j! D) C! U. L/ w. t
; D, Q$ S6 z% k
5 p( K& O6 \! k* S) l

/ s( U* Y4 |4 c0 Jstatic void ys_edma3_init()
: E, C# E/ J4 S5 X+ W5 S{
% e# s. K" X7 i+ m. L        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
) X  v+ M- a; I. O1 z        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
1 c4 F+ v8 I$ W) Q/ j7 a4 X        EDMA3_DRV_Handle hEdma;
, P" R1 ~7 O% r2 e4 y9 H. R# ~' r    uint32_t chId   = 0;9 Q/ D  `& ^5 v( f8 L5 w7 j
    uint32_t tcc    = 0;
$ I/ _/ G$ H& D* B# _  h" ]& X0 e0 b3 f' ?
    print2arm("edma3 driver init...",0);
9 E1 g& k" \  q8 d) r5 m4 q2 j
        hEdma = edma3init(0,&result);% T2 |- h- P" q+ q
        if(hEdma)
8 T) g3 ~  _- [$ q: [  e9 \        {4 O! S( A4 V4 G
                print2arm("edma3init() Passed.",0);
, Q& c  A) S9 E2 ?0 K        }
6 Q( a$ D9 m3 M  a        else
" O( x6 l6 X. }" ?        {, g4 Z, H' y$ m/ p
                print2arm("edma3init() Failed.",0);
( o1 c# z% v  ^- U- _" m/ l        }! ]( n4 F: |* v/ X0 G9 C, L7 N
       
" f3 i  A! L! b2 C. m% ~        if (result == EDMA3_DRV_SOK)
2 B* A/ ^' r4 k    {' R; n  w  O: X/ b" ?- v
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,5 D3 O( D$ N- e8 H/ e+ U; `. w
                                                       (EDMA3_RM_EventQueue)0,4 |$ H. W" V  B" e
                                                            &edma3_isr, NULL);
' y1 \% L1 C3 y# m1 }* B    }
5 ?' j# f: Y- Y4 Q       
- F2 _7 c2 J- \        if(result == EDMA3_DRV_SOK)9 O- G. x* b( i' {
        {. x% ?& r: O0 K. w5 Z" w
                paramSet.srcBIdx    = 0;4 h( L2 _- c) L4 a9 ?% m/ _
                paramSet.destBIdx   = 1;
, U# L9 I3 U" H1 y6 y9 _                paramSet.srcCIdx    = 0;
8 ?, l& x  O/ A# l: I  ^/ L( x, y9 G                paramSet.destCIdx   = 0;$ Z% r+ T8 j: d$ z/ S
                paramSet.aCnt       = PING_PONG_ACNT;
0 E: H1 F( e7 ]2 q                paramSet.bCnt       = PING_PONG_BCNT;$ L' N0 e( Z. l: ?0 f( Y$ e
                paramSet.cCnt       = PING_PONG_CCNT;
  j2 v( {( Z( e! t- P                0 H! I9 ]- d" ^
                /* For AB-synchronized transfers, BCNTRLD is not used. */4 x: V! r6 s8 l
                paramSet.bCntReload = PING_PONG_BCNT;' ~! v. K5 ]; y% F6 p
" r; D+ i2 r+ B- Z% F* e% q6 N
                /* Src in constant mode Dest in INCR modes */
' p* R+ [% K, c  }                paramSet.opt &= 0xFFFFFFFDu;. q6 k! i. E" G9 S8 Y. v
                //paramSet.opt &= 0xFFFFFFFCu;
# o8 V" p& K' I: V- r# i6 c               
8 E) c1 _; S3 r                /* Program the TCC */' h8 n+ L8 T0 E- e, b
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
+ u( ~5 z5 v- u, b* ?" V
- }1 k6 i2 ~& ?- {0 v. Q6 m                /* Enable Intermediate & Final transfer completion interrupt */
- _: q% z6 ~& I$ T6 o4 u                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);2 F: o8 V$ @7 D4 C& V- f1 \! S
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
* {( z' ]( t8 k8 P3 b# h$ P$ {( z
0 H$ T( z) C' g1 X  {1 c4 y                /* AB Sync Transfer Mode */
2 d! b& u' U6 y0 x                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);% \8 b& i& z9 z& S, M
               
* f9 M0 U# s) R                /* Program the source and dest addresses for master DMA channel */; H( t4 u1 p, r6 g. A6 }: o, j
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
6 r4 e4 @. |+ ]2 x- L                paramSet.destAddr   = (uint32_t)(ping_buffer);
( i* C1 ]$ U6 R! X& @; B$ r8 L! ?" }  x4 R4 N* F- ~3 l  \) v  N
                /* Write to the master DMA channel first. */' Z5 s, N# j6 U# `% |- `: ~
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);$ s- V  ~4 ]4 M; _* O
    }       ( l  [! o; [+ o9 A4 ^

! B+ p+ V4 z. j' C4 P2 Q        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);: B, ~2 S6 G. [( P  x
       
0 }$ [0 I, }4 }8 M    if(result == EDMA3_DRV_SOK) % B- f. p- E- u# D: n
    {
$ o/ R7 W$ E0 z3 ~            print2arm("edma3 driver init success.",0);( ~" s# Y, N# R' J" \3 L1 r
    } / t+ }4 V+ r! f% |
}0 t3 J- C5 l9 l0 c5 y
0 {& ^) Z- ^/ Y

: u0 N6 _& d0 a! M# rEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
  _& w/ ~7 z* K' H8 ]6 J! n) J$ @
" S0 l0 A* p% ]% _4 v# a! p6 V2 a4 R. @: H, \! @7 v; r& U

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
% s5 Z2 _( w' A6 k1 C每次DMA传输完成后都要再次使能传输
3 n! Z- c0 A+ F% W
原来是这样,我明天去试试,谢谢了!




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