嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
& ^2 `3 y8 X4 e' k#define  PING_PONG_ACNT          1
' U8 t7 A8 H4 D' G. w#define  PING_PONG_BCNT          8*32*40 $ D; t8 F+ i& n, ^6 c4 w" o; c
//#define  PING_PONG_BCNT       1
+ u2 y' i' R6 h. X  G6 r$ ?5 H#define  PING_PONG_CCNT          1& m4 y9 U( J/ S( H& I9 @3 I! i
#define  MCASP_BASEADDR          0x01D00000: v. I! O  y% Y$ S7 p$ E0 S9 ~$ g
#define  Mcasp_RXEVENTQUE        (0u)+ t1 f' g5 D& r& O5 j! n/ z

! g+ A1 K1 B8 {+ D  H/* OPT Field specific defines */
" H+ q/ Z) t6 _% ]8 b#define OPT_SYNCDIM_SHIFT                   (0x00000002u)3 O3 V0 ~  b( Y0 p5 A3 ^5 I5 [$ l
#define OPT_TCC_MASK                        (0x0003F000u)
) e; w! c% e8 }6 o4 D5 F#define OPT_TCC_SHIFT                       (0x0000000Cu)4 {' ?2 ^, N0 ^7 M6 E5 _6 G; h8 e
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
, v  Z% T+ ?& X$ j" P& t#define OPT_TCINTEN_SHIFT                   (0x00000014u)
' j- f$ h8 @/ x. x8 T# Z
; B* x! Z5 a& A* _) f+ X; Pchar ping_buffer[PING_PONG_BCNT];
" |7 p/ t. B+ F2 t3 U# vchar pong_buffer[PING_PONG_BCNT];- V- E; u- \4 U% z$ m
0 e* l* m: ?7 c% t9 |  I& _6 a! Q' J
, ]  Q4 m# e: q" Z+ n

# W1 \: q( E5 N, F) ~/ U
7 P% k6 q8 y- F  b% L8 z4 Y3 Sstatic void ys_edma3_init()
6 Q7 _4 n+ Z! |# K0 k1 @{
5 s. i# A3 L7 Z0 o        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};. E( q9 r: h  F# M8 J5 |! b
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
& b) N' N8 b9 {7 Z! v        EDMA3_DRV_Handle hEdma;& W# G% d  s: l2 D6 R) f
    uint32_t chId   = 0;+ r( y, U/ k7 L. i* _3 V
    uint32_t tcc    = 0;
7 z' v' w0 d  ~4 _
! v+ i( t! t( k6 h+ K' A, k    print2arm("edma3 driver init...",0);
7 \2 I8 z1 u$ @8 \% {0 ~3 e6 b0 {9 Q% q+ B' J
        hEdma = edma3init(0,&result);
) W$ f. Q; n+ n/ ^0 q" \- F( G        if(hEdma)
4 I3 D0 r1 Y% f$ x7 l        {
  R* U0 }) I. C8 Q0 D5 ~                print2arm("edma3init() Passed.",0);6 \  L6 \; `, m0 E  {
        }: Y  _& S* x7 V0 q( Q" g
        else
/ E; }, t# v: v' ~        {" B; X" n& }- m- P; I9 y! @- F
                print2arm("edma3init() Failed.",0);7 y/ g$ o& X$ l; R# X2 k
        }
/ N6 D4 a# f; Z0 v; Z( P        $ {2 K* g/ M# h( ^
        if (result == EDMA3_DRV_SOK)) l" @. O1 }) ]- B  b% c# w0 m
    {
+ y, K) j8 k! s8 C( R                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
0 J+ @0 r) t$ q, V! |                                                       (EDMA3_RM_EventQueue)0,( `$ a' v+ ]( q1 c
                                                            &edma3_isr, NULL);
  L% j4 k; F, M% B  b    }# G& v+ L, J0 F0 l* C
        & p# ?* r  v: D2 ?' g# i- T
        if(result == EDMA3_DRV_SOK)$ ]# G3 S' f, l0 |. K
        {6 u) ~. O. w7 [. T9 R2 S- o
                paramSet.srcBIdx    = 0;! X. c7 f% |$ _/ Q
                paramSet.destBIdx   = 1;
1 W& m7 _7 Q, a                paramSet.srcCIdx    = 0;2 J- a. z, }( [) m0 {
                paramSet.destCIdx   = 0;
- O! J8 X) y. `* q: N! J  m% w                paramSet.aCnt       = PING_PONG_ACNT;
/ i1 t& S, f2 N( n                paramSet.bCnt       = PING_PONG_BCNT;
, O5 }4 z5 P' l0 D9 |8 e                paramSet.cCnt       = PING_PONG_CCNT;
  P. Q; ?1 R% U" z$ w8 D& E+ @                % y. p6 V6 w  a2 Z  N- C3 h+ z
                /* For AB-synchronized transfers, BCNTRLD is not used. */! g8 P0 M' a3 F2 |9 M6 M
                paramSet.bCntReload = PING_PONG_BCNT;
( e% J1 i, \# g3 d8 Y. A" J( H& S0 V6 k
                /* Src in constant mode Dest in INCR modes */
" h5 f* Q8 Y! \                paramSet.opt &= 0xFFFFFFFDu;. V# k, y& p6 o3 U8 H
                //paramSet.opt &= 0xFFFFFFFCu;
" S; u5 r% d- @3 }( F               
  b3 v6 |- y; z+ w, u                /* Program the TCC */
- _. J( y* k) P* V: Q                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);9 G) Q  G, m- W$ r- m! ]9 K! x
+ F! Y1 h+ ^8 o
                /* Enable Intermediate & Final transfer completion interrupt */
4 ^  r. @3 O/ p. r                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);7 @' W6 b: q# D* k- @( \  C, v6 d6 h
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
/ V$ z4 b5 ~6 [$ {7 m
6 p, W* @8 \/ k3 j' n  a. [                /* AB Sync Transfer Mode */
8 C* R7 x7 R( P" l9 V                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);5 k. L! m/ M) N' e# b0 Z
               
$ o; u* m% J" U2 _; _- a                /* Program the source and dest addresses for master DMA channel */. w2 U2 J/ s4 t" u" @
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
) u6 Y& B2 u) \                paramSet.destAddr   = (uint32_t)(ping_buffer);
4 F* W' c/ }4 u4 g+ M1 {
4 y9 f2 ^& `9 O                /* Write to the master DMA channel first. */+ {# ~2 h" X9 J+ h1 M; B; [4 H7 N
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);1 X' x2 E5 A( G9 V
    }      
. \+ [, R/ e/ z3 k1 K* B( G* o  z1 t
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
! a% V# X$ n/ W/ C       
1 p2 ~) ^) P8 g% v% F    if(result == EDMA3_DRV_SOK) : Y: n  Q/ j6 j+ H* s6 p
    {
3 I# Y7 ^0 W9 e" D) |4 Q1 U+ c* [            print2arm("edma3 driver init success.",0);# @; q* j/ Z1 O, |( J9 ?8 l! I
    }
- T% a# P5 H% R, D. Y( M}
+ q, s1 X) ^2 ^2 L# E( }/ o
/ v" R0 F' G4 A+ J6 O) ]
1 p6 G. S8 ~; m* M/ _! G* BEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
  u6 o4 u; v* m- d1 a
4 I1 @: s" F1 r: V0 ?% M, L# b; v" e

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47" X: S6 S/ Y; M) u/ a
每次DMA传输完成后都要再次使能传输
9 F( Q: \. ]* Y; a, {, H
原来是这样,我明天去试试,谢谢了!




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