嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
  ~9 ^3 p1 o2 r% S# {#define  PING_PONG_ACNT          1
8 }. ^$ K; y2 U( ~: W4 q#define  PING_PONG_BCNT          8*32*40
2 D! \  J* E. i2 _( B# G# ^5 f//#define  PING_PONG_BCNT       1 9 }/ R/ O4 t* Z( R1 L
#define  PING_PONG_CCNT          1
+ |1 s$ d0 j! h7 y#define  MCASP_BASEADDR          0x01D00000
# S7 ?- @5 ^$ c2 X; G+ Z#define  Mcasp_RXEVENTQUE        (0u)+ d# ]" Y0 F  F) I2 u/ Y# B; ]
9 t, D- d# G; J' K8 J9 o, {& e' J
/* OPT Field specific defines */4 c" P2 Y- a& f# p( @
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
& X9 ]2 B3 V! S1 t9 a8 ~#define OPT_TCC_MASK                        (0x0003F000u)
! P: g/ |$ q, s* c, T#define OPT_TCC_SHIFT                       (0x0000000Cu)! g5 ^4 m7 ^' q: @% C4 k: B/ B
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)3 `  r5 \, f* {) j. \) [
#define OPT_TCINTEN_SHIFT                   (0x00000014u)$ C! O  ~; G8 \9 w
' w, f0 _  X' @- J
char ping_buffer[PING_PONG_BCNT];
# q# P  I- c, v" d$ P  _char pong_buffer[PING_PONG_BCNT];0 U3 @9 j% L7 }! E: O
( @3 V8 }9 Y4 C4 S; t

  J6 a+ Q8 _" D( n5 ]1 V: D6 D
- x' Y% ^1 `6 Y% M  Q# ?% G! ^- H9 i
static void ys_edma3_init()
& v! @) a, x5 U6 ^' y* B; D{
0 b3 a- E! `( @* r9 q1 Z        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};- s/ k% p8 N2 G4 G2 C( n% y- E
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
( K& q) Q/ H: I, m        EDMA3_DRV_Handle hEdma;
4 k6 c7 v4 A. f8 l    uint32_t chId   = 0;
6 R7 V0 k$ ^3 h) u    uint32_t tcc    = 0;- G7 A/ T- S& N3 o! S
! m# R2 }- B0 \8 M# S" H
    print2arm("edma3 driver init...",0);
/ N& Y0 K: q  K* u3 W- h! c' O0 R/ d" o. K
        hEdma = edma3init(0,&result);
: z$ c0 d, Z* P        if(hEdma)( K9 s' W! Q  k; i+ |
        {
; v! N& h! ]3 Y% w                print2arm("edma3init() Passed.",0);* F. b& N; E2 z" b1 [5 @( |) z. b
        }  |" A2 G5 O# _6 P: t, b$ i: x, o
        else9 i  B9 L2 Z' E
        {
) E1 z, W/ s/ k' |) o+ r- ~7 X                print2arm("edma3init() Failed.",0);
" v. R: h) ~; s- q% N        }
/ D1 h5 i( d$ O. t7 {        0 O* t  z" ~6 C( I' Z' q$ [; K
        if (result == EDMA3_DRV_SOK)
4 O7 N, v$ A: \9 ?. N    {5 L. S# X  q( L& \5 q* ^' z
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,& w" g; h) R- t& N( }: b
                                                       (EDMA3_RM_EventQueue)0,
0 s1 s- O3 h; W) H2 c                                                            &edma3_isr, NULL);
) c4 h: a! M  P- u; W, _% e    }
, k$ C8 {$ K* M% L2 i6 {       
: s" u$ g* T$ j2 g6 y- n        if(result == EDMA3_DRV_SOK)
3 _/ r5 Z, x  j9 l        {" u. n* a7 w, d8 Y' G3 n
                paramSet.srcBIdx    = 0;) w: a9 Q4 D8 f3 q; ?
                paramSet.destBIdx   = 1;
; S  u+ x; e, |  h# }                paramSet.srcCIdx    = 0;
( N% T" C% a# ?; H( u( h0 U" M+ @                paramSet.destCIdx   = 0;/ V* M/ H3 L7 C
                paramSet.aCnt       = PING_PONG_ACNT;4 M% ^. I2 P1 e/ ~' X: ~) s) Q
                paramSet.bCnt       = PING_PONG_BCNT;
, a) V1 U" n% S- T( y                paramSet.cCnt       = PING_PONG_CCNT;9 F$ f( p% V* u5 q, d7 E' P
                4 U4 S8 L+ O- D$ X- c
                /* For AB-synchronized transfers, BCNTRLD is not used. */4 o0 B, ]4 s! J1 N
                paramSet.bCntReload = PING_PONG_BCNT;
, k8 f" s6 u2 n! O' }" ]  V% n3 x! _( W; L
                /* Src in constant mode Dest in INCR modes */
) d3 k& g' h1 D8 H; |                paramSet.opt &= 0xFFFFFFFDu;
& I3 ], X$ u* G                //paramSet.opt &= 0xFFFFFFFCu;4 B+ c2 E) o0 W  _5 B
                % l- ]0 q* t0 @. z
                /* Program the TCC */
' e2 ^9 s5 ?/ G! h, h  ?) |: {                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
+ Y# ?3 B; \: d) G
+ X' C" J  k$ O* c" G$ |                /* Enable Intermediate & Final transfer completion interrupt *// O6 r+ ^( D% P# z; s& f
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);, B* r1 _6 v$ [1 j5 @  R1 b/ _
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);0 b* T4 v4 t2 V3 X
- v2 l3 Q( o/ ?- j5 U6 v8 n5 B
                /* AB Sync Transfer Mode */+ ~. X2 e1 B3 n  P
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
6 ^3 V5 h( {' K$ ^$ h9 Z/ |: [0 X                - P% t  t) `, F3 t
                /* Program the source and dest addresses for master DMA channel */9 Z$ g0 P  z: V
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);/ I0 n5 f8 i; M6 v2 X0 V' U
                paramSet.destAddr   = (uint32_t)(ping_buffer);7 j; [- V" V6 `9 `

/ w% T# u$ A) D# g: j* S2 j                /* Write to the master DMA channel first. */3 \: {6 G) s8 E1 R4 J
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);2 N7 q# Q! U$ k
    }       8 c) l2 K9 d! k& O

# D5 H: ?% e- H; S) u        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);. t1 O1 _9 n% n
        4 T7 d. R% h4 b8 v8 f# A/ R
    if(result == EDMA3_DRV_SOK) & R* i* l3 C! y9 p7 [6 }' D* U
    {: y1 P, h* V- B1 j' \3 `" K
            print2arm("edma3 driver init success.",0);
6 K' L5 A: W2 l0 H0 W# G    }
( x3 T+ @' N! W% d}6 {& j3 p; |, a. x" \  t
! \8 \9 p4 Z) Z9 ]9 B; s

. f0 o* y0 I( e/ I7 z) @& AEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。! m8 G; f" t! G. O; |0 y/ E
$ l8 x0 {" [# y( H$ r- L" B

  A* @. L/ F& N: Q' y+ p0 y# }
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47' X  y- N# W4 N. r
每次DMA传输完成后都要再次使能传输
: C3 q) Q$ g  W$ ]
原来是这样,我明天去试试,谢谢了!




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