嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
( G- v* }/ [6 w$ z8 N5 A. }1 G/ I$ W#define  PING_PONG_ACNT          12 u0 n$ I7 q& s
#define  PING_PONG_BCNT          8*32*40
  l! R- d' }0 Z  ]1 r% G9 F/ o8 J//#define  PING_PONG_BCNT       1
7 ]9 a; g* K3 E9 R8 m0 L#define  PING_PONG_CCNT          1
4 d. J4 h" {! C# J1 m#define  MCASP_BASEADDR          0x01D00000
& Z- Y$ i* c  z9 [! y8 ]5 v# I3 {#define  Mcasp_RXEVENTQUE        (0u)
: @8 {4 M# ^5 W* ~# I( e  S  Q& s9 k; s5 o3 w8 q% ^$ p! I
/* OPT Field specific defines */' A, b8 t' @# `: t+ Q
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
3 W2 S; r4 Y+ y/ K#define OPT_TCC_MASK                        (0x0003F000u)
$ z7 f$ h8 ~$ a$ u- o* E#define OPT_TCC_SHIFT                       (0x0000000Cu)! q$ I7 \9 I1 f8 T: e' p% P
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)' F, ?* F- h+ e- i6 H" _
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
9 S$ C0 X# X& ]- J8 f
5 B: D. c0 O+ D/ f  O% qchar ping_buffer[PING_PONG_BCNT];0 F( Q9 R% d1 R" I( _% ?% ]4 y* U
char pong_buffer[PING_PONG_BCNT];& @7 N3 }7 Z2 f! r2 E+ }

/ L; @: W) P! e3 P4 E& Z3 ^/ W1 D1 b+ r5 V& [$ x; L

/ D9 k2 b# }, t* m! f, F: X! @+ @/ C8 A! q+ M( V! @
static void ys_edma3_init()
' R. C) o% J; _; ]- m4 C{* E( ]2 L. ?5 R' q  E
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
+ K% g/ p. q! q# y. \0 h$ C( o6 D        EDMA3_DRV_Result result = EDMA3_DRV_SOK;; I2 J* }3 `. z: I' q
        EDMA3_DRV_Handle hEdma;
4 @& C3 v; w' j& u    uint32_t chId   = 0;
; u1 G7 Y. \" u0 W1 c7 ~1 x    uint32_t tcc    = 0;5 I9 }, ]4 p( f9 {+ [+ B2 t+ q
9 \: c- ]0 F& c+ s
    print2arm("edma3 driver init...",0);
) x4 K" |. f  x1 k* M8 O: M/ l3 x- `' C% Y8 B2 q! N6 G2 H2 S- q
        hEdma = edma3init(0,&result);# ]# i$ r& B4 I
        if(hEdma)
# y  h) ~( b9 O1 T4 E+ L, p- T/ p        {: J2 i8 z) F9 i- o, B
                print2arm("edma3init() Passed.",0);
3 J: W/ B$ g6 i4 O        }" ]% f; [/ ]7 o3 T7 j
        else
9 w8 b& V) h4 v0 X% i        {
: T0 y/ a5 l1 e7 J$ f                print2arm("edma3init() Failed.",0);' M, y' G) a4 Y6 R
        }
+ r( u  L; k5 H( B9 G$ T7 d       
4 p" D& ~2 u7 F  F# O0 V5 a8 D        if (result == EDMA3_DRV_SOK)+ s$ Q, o7 {- l
    {& j# q/ _4 O( H
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
+ `. V: [* `1 {- L5 s                                                       (EDMA3_RM_EventQueue)0,, d$ M7 s" T( S" G
                                                            &edma3_isr, NULL);& X( m$ _" e' ?5 H* B9 v8 V8 J
    }
8 q5 f: Y% a8 j0 V        ! w, Q. \0 f$ m* u# o
        if(result == EDMA3_DRV_SOK)  }2 d: o- h: f/ j
        {
3 P+ n) e- W* ~" V2 q! F/ v                paramSet.srcBIdx    = 0;
* O0 V8 q, |4 V& O( V; r                paramSet.destBIdx   = 1;
0 W7 R( G: o4 z7 `$ \0 U                paramSet.srcCIdx    = 0;  |0 U1 c5 c0 I1 Z) m
                paramSet.destCIdx   = 0;: P3 h# e' n; [
                paramSet.aCnt       = PING_PONG_ACNT;
/ W* K' w4 ]# r3 |$ V                paramSet.bCnt       = PING_PONG_BCNT;  I4 O) Q1 U2 ^) u, z; c
                paramSet.cCnt       = PING_PONG_CCNT;
* |- F! Q' L+ k% H$ |8 n' m                # [: u2 e! Q% m8 e3 f  T4 H, m
                /* For AB-synchronized transfers, BCNTRLD is not used. */7 H8 @2 s  C, X* i
                paramSet.bCntReload = PING_PONG_BCNT;) |1 K8 P% B2 a5 \& }+ C) K. }
$ u  E8 Y" p# z# U' m& d0 `  D6 I+ \1 `
                /* Src in constant mode Dest in INCR modes */% x0 N' v2 ^: N4 V: p6 c5 W* Y; N9 o/ z
                paramSet.opt &= 0xFFFFFFFDu;
6 Y- ~6 f3 w0 v9 M! X6 y( {                //paramSet.opt &= 0xFFFFFFFCu;
& A0 s. ^8 ^# ?% c* J               
! b2 i4 h, v9 W8 o* i                /* Program the TCC */
1 \3 ?; Q0 k; Y1 Z3 _3 Q0 i* W7 B/ \                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);* r* N% P' v4 A

1 i8 X% Z. j0 a; K- _/ ~: q3 S                /* Enable Intermediate & Final transfer completion interrupt */
  ~; [  C0 ~0 d4 n" q- w, v                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
% y) k: e" J! U" U* j5 T0 q% C# d                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);' k% V! R( q: w8 p9 j+ @( K
" Z8 F, Y" I: |! P0 S" T- B
                /* AB Sync Transfer Mode */3 ]! k, K# z% e8 f8 K) ~
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
- q! ]- A6 y/ d' C, l' l# o0 T                - x1 z% R! p7 l. K0 q% L% d
                /* Program the source and dest addresses for master DMA channel */) V: |+ ?: V# T- q$ y9 d" u
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);% _. ~/ K% O3 H+ D$ `: x
                paramSet.destAddr   = (uint32_t)(ping_buffer);
2 {0 G0 Q2 d# b. n# }1 ?4 f& r+ {' {6 B7 P3 s
                /* Write to the master DMA channel first. */
8 c* c' q* u: W% _" A1 G                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);6 U6 T3 q# T0 }- \
    }      
+ C/ ~* }9 A; J3 O2 V5 e3 x9 S# X
# t3 v2 X% w. v        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
7 ?7 l+ S1 _* E% z2 b        % b4 B( O% v5 C( \6 w# `* W; `& T
    if(result == EDMA3_DRV_SOK)
' \# Q: N  [6 d. Y! e    {
8 Y0 c; g7 D! S9 n# p            print2arm("edma3 driver init success.",0);
" B" ~+ _& T5 I5 b: c: R, p8 _    }
$ @2 X/ t# H4 D- _( J0 X7 M}2 c0 e+ G9 H1 Q1 G. K6 Z% u! g
( X1 [% _- l/ c  z3 l+ \

* J; h1 r; g6 s- p) eEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。1 X6 n7 _, ?7 c( J) R

, T& m4 X1 _  i3 j$ ?8 i- J* d" `/ o, Y" X: s

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
+ b1 H; T% R+ f! I每次DMA传输完成后都要再次使能传输

; L5 {; G; @0 J4 D原来是这样,我明天去试试,谢谢了!




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