嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:+ {% l  Y+ c& f: O7 _
#define  PING_PONG_ACNT          1
( P9 F: a" T8 Q" i3 b( m4 H#define  PING_PONG_BCNT          8*32*40 ! `' U' [# M- O1 m
//#define  PING_PONG_BCNT       1
. I6 m! n& k2 q* H7 H* F#define  PING_PONG_CCNT          17 Y8 q' T/ Z+ t4 L* N8 V
#define  MCASP_BASEADDR          0x01D00000
( a* r  C3 r  S9 v+ V#define  Mcasp_RXEVENTQUE        (0u)
/ _3 C$ q: U4 Q* b- n
; G& n# E0 L: k9 P; m+ G" D# Z/* OPT Field specific defines */& ]) n4 E% n2 _! G
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
- i# q# K( F5 T; H8 D1 x5 x# ?7 y#define OPT_TCC_MASK                        (0x0003F000u)" [% J' p: }- t$ f9 ?6 S
#define OPT_TCC_SHIFT                       (0x0000000Cu)
: L3 `7 A! n# p* @9 P( K#define OPT_ITCINTEN_SHIFT                  (0x00000015u). u5 P* H1 p  v- a; h9 \
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
, ?5 H1 |4 F% Q* H: g% ^. r+ k7 Y  m/ `7 _: [
char ping_buffer[PING_PONG_BCNT];, q* u/ t; n5 I0 b
char pong_buffer[PING_PONG_BCNT];
9 @9 h8 u& g2 f# u; e& \! u' m# }, x& |9 y$ K

2 ^% v0 p' f5 P
% u) |5 e: M4 }1 h# o* I  X& K# a- c# F' j7 H/ L1 R; q( o
static void ys_edma3_init()8 N+ R. c: i7 a8 B  R& A6 M
{( d. v9 h$ T) ]5 E1 p/ P
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
5 j$ v6 Y! U+ M: n# K$ o        EDMA3_DRV_Result result = EDMA3_DRV_SOK;+ [: T, j, p& X# d
        EDMA3_DRV_Handle hEdma;
# f7 Q1 B# c. c    uint32_t chId   = 0;5 G  J" S% r) ~  y0 S8 F* ~9 D
    uint32_t tcc    = 0;
3 ~' ^8 j, C4 Y8 }9 T0 R5 f# c
# \3 n1 w& m* x8 @    print2arm("edma3 driver init...",0);; u! Z9 g/ e0 }" s( m

/ A% L3 \# O1 D/ ^0 I% D7 e        hEdma = edma3init(0,&result);5 {- F% E  G" S8 c
        if(hEdma), Q" h* p  @6 F' O4 r4 M0 ]5 n  u0 M
        {
+ Z8 B9 |& ^. k                print2arm("edma3init() Passed.",0);
4 F) h2 Z3 a7 H/ C0 l6 z) a5 N) l        }6 t& t) |* B2 \5 Y+ S! v) c
        else
& H6 z$ w% q$ _3 l3 b$ B' s0 j        {
( `8 e5 P/ ^# u% m' }, f                print2arm("edma3init() Failed.",0);
4 \9 x1 E3 s0 s* R5 Z        }; t, c& `9 ^2 Q& }$ a% L* A, v" G
        6 \/ H6 Z& E0 U1 w
        if (result == EDMA3_DRV_SOK)
+ K6 X9 G! M. B( i  c7 J9 K" p    {
( r$ \( M- i& ?. D& y% q3 G                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,% Z( f9 e" I7 B
                                                       (EDMA3_RM_EventQueue)0,6 `3 [% X1 }- C2 ]: T
                                                            &edma3_isr, NULL);$ F6 \6 J- ^0 H( a4 X3 j- T
    }: i8 F) E- o2 P: h( `
       
$ s  h) D: f0 ^+ H2 {/ i6 B2 D        if(result == EDMA3_DRV_SOK)
& |+ }/ f4 h5 L/ t5 N% P        {+ g( Q2 H: s0 f: I4 n" u0 |
                paramSet.srcBIdx    = 0;/ p5 n+ @, u6 g- J) D
                paramSet.destBIdx   = 1;: {5 x% J9 J1 `& D- _+ X' j
                paramSet.srcCIdx    = 0;
  e- b5 t( @/ i# x) I& x* e* X! x) F                paramSet.destCIdx   = 0;, @/ x+ ?7 J$ t
                paramSet.aCnt       = PING_PONG_ACNT;5 w6 J, I3 m% n& I6 f/ b
                paramSet.bCnt       = PING_PONG_BCNT;
3 B, o( _; @; d( y8 O2 c+ H                paramSet.cCnt       = PING_PONG_CCNT;, Y- f6 P3 Q( U; u, f" M
               
1 U- S- y' E. Z2 Z                /* For AB-synchronized transfers, BCNTRLD is not used. */
5 o/ ~2 M/ ]+ c! ~$ u6 C                paramSet.bCntReload = PING_PONG_BCNT;
% `+ T7 p* u9 H; P0 k0 P% H4 i: ]2 U1 \
                /* Src in constant mode Dest in INCR modes */" y1 j7 H/ e" a2 G% U: `+ X" c5 X
                paramSet.opt &= 0xFFFFFFFDu;) K8 q% m  O# O7 g
                //paramSet.opt &= 0xFFFFFFFCu;8 Q% c8 j  D% N( }* m; O" ]
               
- @4 q% f  w( ~, M# g* K                /* Program the TCC */
( [+ P1 Q! t- B0 ^8 P, j3 w3 h                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
: u" k( g5 z* P- t% v2 i
/ D0 }+ c9 u9 F! s                /* Enable Intermediate & Final transfer completion interrupt */" j8 Q5 @+ F* ~2 J2 Z
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
' B' U5 y5 I0 m8 |0 u5 J                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
' l9 S( z( T) n* d
! L+ I, b, D- w                /* AB Sync Transfer Mode */( U( w; Z3 t8 `9 {
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ M4 ^3 r8 X" `9 X, _) w+ Q: j% h/ o               
# d7 t% d+ O! w, J                /* Program the source and dest addresses for master DMA channel */& v! {: f" y, _2 d2 p/ _
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);7 V* {- p" s3 c) U
                paramSet.destAddr   = (uint32_t)(ping_buffer);
- k% d1 h7 P( D% q% d6 t
& g$ |0 [; a3 i& |- b                /* Write to the master DMA channel first. */+ F4 l% g: {# ~; [
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);+ m7 |; z+ |3 F* E! E- Q0 b! _
    }      
( J3 F7 O& L# ]1 d% O0 F; V1 Q& T, j' u, v
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);9 g( C7 a$ A$ D# S8 `
        ! o3 Y  O4 I! N9 W: h3 d" ]
    if(result == EDMA3_DRV_SOK)
" C1 M, @2 D3 g    {& i9 `7 Z0 Z) g/ G# r8 p0 ~. i
            print2arm("edma3 driver init success.",0);( b8 c$ _, h/ W5 ~6 x, u0 {
    } , p1 y/ D& R1 q# [0 @
}
' ]2 [% @. A' l6 @' I$ L( s8 O) m9 a4 N1 D1 j- b

# y- [/ j  P1 k- oEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
( u) L: R  F- m- I  w0 ~' E% |, X: @3 g- v8 |) ~% Z  ~
* |- y7 T( Q. j# d2 j* Y  J' C

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
2 N& t9 r: C$ {. A* i每次DMA传输完成后都要再次使能传输

; p7 z' `6 X& i- v6 v5 r9 v- u原来是这样,我明天去试试,谢谢了!




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