嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
& h: }) H9 W+ w9 j1 v#define  PING_PONG_ACNT          1" D9 E- ?# l9 q5 P; G% M
#define  PING_PONG_BCNT          8*32*40
/ N! X1 i3 W9 ~; q//#define  PING_PONG_BCNT       1 " D" w0 |* _6 T7 \7 m8 _
#define  PING_PONG_CCNT          1# l' _/ v$ s2 x3 M; b
#define  MCASP_BASEADDR          0x01D00000$ N  N  Y( _- `1 M) B3 a6 ]
#define  Mcasp_RXEVENTQUE        (0u)
( F8 B9 O6 T" P. F& q
; K+ X* f9 A% U* b# N" m: V) v/* OPT Field specific defines */
8 ]) R/ T$ \  e: Q9 G: {; e#define OPT_SYNCDIM_SHIFT                   (0x00000002u)/ K( ]' D9 D, O
#define OPT_TCC_MASK                        (0x0003F000u). q5 |; H& J  q* P
#define OPT_TCC_SHIFT                       (0x0000000Cu)
6 j2 F! b7 C6 ^, H2 L#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
' @  B# H4 n, D+ ~2 B  x  U#define OPT_TCINTEN_SHIFT                   (0x00000014u)& T/ {* }% D; p( h

1 {4 O, h! H0 \$ C7 V; z& {) ?, wchar ping_buffer[PING_PONG_BCNT];, [7 _' @! y$ e* U2 x: A" D0 u3 i
char pong_buffer[PING_PONG_BCNT];
- n( E' u& G; m$ U& @5 R% W9 o+ T6 [0 N! \
- E7 t7 q* p  o
1 l; l, Q7 I1 ]* D1 v

  e. C. S3 N! z; x7 H- B- Istatic void ys_edma3_init(). G. H. F& l1 P# ?6 K  N' g
{
- [4 M6 {; ^- N: l1 _        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
$ L* b! d7 |1 z( Y- ^        EDMA3_DRV_Result result = EDMA3_DRV_SOK;5 ]9 Z- Z: [% r* Y9 |% q( q6 L
        EDMA3_DRV_Handle hEdma;  A1 H) [# e' @# `. }+ t
    uint32_t chId   = 0;- o& _3 Y% ]$ Y" \
    uint32_t tcc    = 0;
6 l0 J6 W! I" H4 r
9 Q( N1 C3 \" k7 _- T+ c. ?  F( _) z    print2arm("edma3 driver init...",0);
- a0 K, I9 H& w
: A/ W& R8 R, L) f& h$ s; Z        hEdma = edma3init(0,&result);5 h7 c/ [+ F/ A# n6 w
        if(hEdma)$ v, O/ u# v* O. a- {
        {
* p/ U7 r& L& n- v5 q0 _* n                print2arm("edma3init() Passed.",0);0 {. `0 u$ j- \/ o, w7 F& j
        }+ _. V# F$ u: o" q: R, ~
        else* G! @$ X( C3 o: r
        {
9 d& [- ^% U1 L) w$ w' C                print2arm("edma3init() Failed.",0);' j0 e6 E% u( k4 m1 u. l
        }: A- x6 W1 w1 X
       
8 T: O5 H- a8 ~& z( e        if (result == EDMA3_DRV_SOK)
9 P2 R5 N/ H0 I  B* j% y$ f/ R    {$ p5 o' B' w& b$ a
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,/ z" o" Q3 R9 N7 X" {
                                                       (EDMA3_RM_EventQueue)0,
9 }8 b- `$ Y- A8 a+ e' q                                                            &edma3_isr, NULL);
" Z2 I- I$ }' Q: z" F! O    }
, R) V$ p1 x9 B' o: C9 {8 y        ! s: u/ \2 z/ t$ v/ \
        if(result == EDMA3_DRV_SOK)
7 P1 h& q2 |: X- m        {8 H4 b; ~4 U: S& x
                paramSet.srcBIdx    = 0;2 h- W- e/ \. Y" l: ^2 ~% a
                paramSet.destBIdx   = 1;- [; l. `5 i2 n
                paramSet.srcCIdx    = 0;
: \4 _! \7 w8 p+ p, `% r                paramSet.destCIdx   = 0;! @& N4 v; v2 z, ?! o
                paramSet.aCnt       = PING_PONG_ACNT;* ?* ~  A) w! ]0 C
                paramSet.bCnt       = PING_PONG_BCNT;
' N& C; X6 y6 [' e5 C                paramSet.cCnt       = PING_PONG_CCNT;
3 `+ @2 w* V7 ]8 F' b                $ g7 H; n9 Y: q
                /* For AB-synchronized transfers, BCNTRLD is not used. */" k" G, u  a6 w6 y
                paramSet.bCntReload = PING_PONG_BCNT;; f8 n. x- K4 P7 P
4 z0 o5 e. w; z6 V
                /* Src in constant mode Dest in INCR modes */
( e/ u% a6 G6 f7 v. {9 h                paramSet.opt &= 0xFFFFFFFDu;; Y7 D) O7 V6 P# r# H. U
                //paramSet.opt &= 0xFFFFFFFCu;3 K$ [: u$ L- X+ u3 I
                6 v0 N8 Z) N$ G( A
                /* Program the TCC */
2 h: _  u2 b+ |" V* r- w7 j7 B5 i& D+ N                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);+ Y; w# h; Q* A8 b6 f

1 S2 G4 C/ P  ?9 z% ]                /* Enable Intermediate & Final transfer completion interrupt */; f! w' ?! a4 Y' f4 |
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
. K' T* s% O6 t  w* P# |$ f9 ~3 j8 a                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);5 ^; Z) w; K6 c) O2 @) R
3 C- \! ?! b" Y! [3 Q: V
                /* AB Sync Transfer Mode */3 j# G  q3 B( ^/ w& f# Q
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
7 N7 y# B' f9 v                + W8 h3 {2 q. {3 y
                /* Program the source and dest addresses for master DMA channel */4 P3 Z! R2 h9 o! \7 P, M1 W
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);& e7 X* z6 z" X- |! B! N  X' v
                paramSet.destAddr   = (uint32_t)(ping_buffer);
/ P! D# x5 Q% _' C7 G
6 o. x" Q% N/ l) A                /* Write to the master DMA channel first. */! t0 E4 X8 G+ S* F2 j
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);. S0 l9 l3 @1 R' J
    }      
. }6 H$ I! N2 |; N( k: N1 O; p! D# P& u. P
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
9 ]  m$ ?( ~8 e* v# E5 g       
* N% Y( Q2 F7 c0 e    if(result == EDMA3_DRV_SOK)
+ D$ j) e9 z* P$ `9 j8 `5 R# c) S    {$ w6 u, L$ D. L# ^9 @, i
            print2arm("edma3 driver init success.",0);
! ~7 P3 a9 U! t1 f    } - n% s* u; s. `' U3 x; G' u. d% k- ?
}+ X3 K# k8 c, }$ v- r

6 i' Q5 o2 v$ `' T6 v; e8 k. j# v
- O8 M2 W! R/ ]6 y% j. XEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
7 G6 r  b. \4 \- q. t+ b, D1 r3 r: n( M& ]# @

9 _; P) n/ O4 A8 V9 a
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:479 M1 _) y5 w5 ]0 P7 r5 X
每次DMA传输完成后都要再次使能传输

7 h1 R- x* v; W$ ^0 J6 J原来是这样,我明天去试试,谢谢了!




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