嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:) a* [5 h) z, K. g3 \# Z7 T# V
#define  PING_PONG_ACNT          1
5 Z& G+ g% D4 u$ {4 D, y#define  PING_PONG_BCNT          8*32*40 7 @3 t" u. C  t* b$ S3 }
//#define  PING_PONG_BCNT       1 ! ?+ H. r' s" a- L
#define  PING_PONG_CCNT          1; b3 K  X$ l, x* @- I& f' C( ]
#define  MCASP_BASEADDR          0x01D00000! }0 O* F2 W7 E8 `8 v3 H( a
#define  Mcasp_RXEVENTQUE        (0u)
7 m2 D# X. V5 L- U8 e; |" b) F; @/ H9 q5 ~1 G: c7 ~
/* OPT Field specific defines */4 f3 H3 T0 H* e( S: q, O
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)2 b: M% b1 S" a7 C; O/ M
#define OPT_TCC_MASK                        (0x0003F000u)
6 m! z, V( }1 U0 M0 O! k#define OPT_TCC_SHIFT                       (0x0000000Cu)
: k6 A7 e' j/ {8 \5 V#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
4 i' |7 T' m; T! \; O8 k#define OPT_TCINTEN_SHIFT                   (0x00000014u)
/ p+ V! I1 M# r' l. p) _' a& j9 n1 ^6 {, p
char ping_buffer[PING_PONG_BCNT];5 e1 g. {2 q1 H: |4 w
char pong_buffer[PING_PONG_BCNT];4 N  ]1 X* j! x
' \2 }9 }- m3 J/ r& @5 t
/ ~! `* e0 w4 }& d0 ?/ l
- I" X' V6 W$ u  r

! B% t+ N+ f) Z/ }( ^1 R3 Kstatic void ys_edma3_init()
- N$ R% t' F, P0 V* t& I- I{
4 c7 r3 H( v1 T' H% w& @        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
+ o1 k( R; P  |! {  z% r2 d; P        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
; {4 p) n+ M# e8 F! q* K* m, L        EDMA3_DRV_Handle hEdma;
( f8 l2 a) O, x( Z    uint32_t chId   = 0;
0 T, E4 m0 Z* K    uint32_t tcc    = 0;
2 }. g/ K" H0 `' X5 Q) j/ t
* J1 h$ u  x8 ]. O1 J: a. ^( `    print2arm("edma3 driver init...",0);. r# I& P7 R: Q, s4 j

1 k0 W; t8 b) I- H, a  [# _2 F        hEdma = edma3init(0,&result);
% v. }+ x$ c+ _9 W+ s0 D        if(hEdma)
6 K6 R/ f, I( d  w        {
9 K/ J4 L% T# Z5 M7 A( c  w. [                print2arm("edma3init() Passed.",0);7 s9 Y  b% ^# P! v4 T5 r: ]9 k
        }; R* P1 o+ b" u& H# f
        else
/ ]3 i& T- Y# D5 P! S3 B        {6 S( H) ~4 H# M# H, k( n
                print2arm("edma3init() Failed.",0);
  ?+ L( g" y& Q' E7 l! g' G5 Z0 u  T        }7 A0 R' U2 p- |
       
( P# q6 V0 g0 b( X7 g/ R- C! P        if (result == EDMA3_DRV_SOK)- O! \* a, W% e) I3 l* K, I
    {
2 [: q- `3 a2 ~* T; L8 j, Y6 J                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
) x2 U5 J$ o; B                                                       (EDMA3_RM_EventQueue)0,! w* Y! s* U+ h3 Z
                                                            &edma3_isr, NULL);3 F( Q2 r2 f( S, s! ^# t7 Z7 B
    }
" P2 H/ K3 X+ j1 V        % i, m# t7 d; l( B: b; I
        if(result == EDMA3_DRV_SOK)
' I# a( m4 M4 c% W  r$ P7 ?        {5 O; R4 \1 y% ^
                paramSet.srcBIdx    = 0;
6 C6 y& w& f  s$ ]% r9 c                paramSet.destBIdx   = 1;/ I2 D) s. c( m' U
                paramSet.srcCIdx    = 0;
' l8 R) E& X( n* z                paramSet.destCIdx   = 0;
# O* v* s% B! b/ ^3 h                paramSet.aCnt       = PING_PONG_ACNT;
/ ?' N3 q" j, s) I# X                paramSet.bCnt       = PING_PONG_BCNT;
9 m: ]2 w# \) H6 B1 y) w( h                paramSet.cCnt       = PING_PONG_CCNT;
& K/ T1 u. W) o' s# E& @               
0 S2 R, X3 R1 j' q5 h                /* For AB-synchronized transfers, BCNTRLD is not used. */
8 T" G$ i* g# N) `8 ~                paramSet.bCntReload = PING_PONG_BCNT;  [6 N9 k" \6 l: R

! F" U+ D7 Z4 f( p# c7 S, W8 e3 }                /* Src in constant mode Dest in INCR modes */
5 T% @$ M# \. s  _: c- v; ?                paramSet.opt &= 0xFFFFFFFDu;( \( U1 U7 J- N8 o  U0 d- y6 \
                //paramSet.opt &= 0xFFFFFFFCu;
9 H" m/ q% h& ]5 _6 ~: H. R                % W1 E) q" @4 u# E0 i4 t5 N9 j
                /* Program the TCC */
2 u" R8 [0 t# p. J8 V) Z# L0 F9 }                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
: H! o, e" k  T! G: J1 `
  {( b. H; R4 g* f                /* Enable Intermediate & Final transfer completion interrupt */
: `* D7 l% U: s+ c- B& ]# Q                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
; t9 E1 _, d" @                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);, P6 q) {8 I0 L7 ^* J

& x( y+ t7 o/ v8 u9 x$ T0 k                /* AB Sync Transfer Mode */
* z# H# H* ^% @/ a* ^/ d1 B                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ @# H0 G% F) v4 f6 [                8 K1 e# f* G; m% c" z
                /* Program the source and dest addresses for master DMA channel */4 g/ _0 O. Z2 c
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);$ q" `6 y1 h1 I% E: b
                paramSet.destAddr   = (uint32_t)(ping_buffer);' y" Z. C. }# L

; x( O- [+ _/ R, ^( X6 l& |4 S7 J                /* Write to the master DMA channel first. */( ]: Y4 P. W4 Q: y
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
+ _& I0 q- Z+ R% ?0 A8 P1 c    }      
0 i" a- L7 c" K9 j, p" I) J; S" C, ~+ \2 Y+ o& @! e; c: m( A+ z
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
# y& q8 U) I0 t       
9 g! A' m9 p& o# v  Y    if(result == EDMA3_DRV_SOK) , Q! n* U* a5 ~5 D9 U. V8 p- G
    {+ H9 f8 E9 ?+ K9 x3 B
            print2arm("edma3 driver init success.",0);1 Z8 J5 B$ m$ ]
    } 8 G2 K1 e+ n" L3 s
}
3 d4 L. [# W3 F7 h! O8 r3 U# A. w$ U) r2 q

' }* k4 {- L6 gEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
$ ~. b) ?. l) Y- Z# Y# S5 P7 X. F& q1 p. Q- R

6 N+ r1 t/ w7 u, H
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:473 J0 w5 v5 M8 g) @$ L; E
每次DMA传输完成后都要再次使能传输
* N0 w5 X8 |& x- g
原来是这样,我明天去试试,谢谢了!




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