嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:1 M/ ^: ?& m% Z9 V% n
#define  PING_PONG_ACNT          1
, L1 p) \  T  ~, L  L#define  PING_PONG_BCNT          8*32*40
5 W1 `8 J2 q& W; X) \8 b//#define  PING_PONG_BCNT       1
4 ?$ E1 r% n* l8 E#define  PING_PONG_CCNT          1
4 [: J; J8 a9 f/ \; R9 S#define  MCASP_BASEADDR          0x01D00000
+ p: T4 Y( G' W8 M3 |1 `6 J$ v#define  Mcasp_RXEVENTQUE        (0u)
; N" \) U3 x0 \
5 u8 A2 [; ~' d2 `+ p% Q/* OPT Field specific defines */
& M- d4 D2 W9 s; s  V#define OPT_SYNCDIM_SHIFT                   (0x00000002u)5 I" u$ S( T% u2 ^2 D
#define OPT_TCC_MASK                        (0x0003F000u)* ~" N& ]& Q9 O7 g% g$ g
#define OPT_TCC_SHIFT                       (0x0000000Cu)
- A  u5 A7 f2 }+ W& d0 y#define OPT_ITCINTEN_SHIFT                  (0x00000015u): a, U4 t; C$ U6 s+ R
#define OPT_TCINTEN_SHIFT                   (0x00000014u)$ R) B/ ^9 J; m" `" O, S6 i

: I! N  u1 B$ I: S; Xchar ping_buffer[PING_PONG_BCNT];- d0 K. Q  `: p# J
char pong_buffer[PING_PONG_BCNT];" o/ b* d- D% q0 n; R

3 f+ P7 [% W6 \) [- @6 s! Z# v( B1 N  f; X3 M
8 c" X+ J9 U" H) V! k6 v) ]) s
( a- U- J* S. R  F6 l9 U8 u
static void ys_edma3_init(): F* D: _/ ]8 J" y0 c
{
: |& Q% m1 s9 \: I5 l2 Q        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
/ ?5 |9 r& L, Z+ ]- [        EDMA3_DRV_Result result = EDMA3_DRV_SOK;( K' }" c, J3 W. M" `& r
        EDMA3_DRV_Handle hEdma;
8 Q/ b/ i5 l& t+ N. x3 A    uint32_t chId   = 0;
9 }/ Z# j3 s! o0 d8 r; L    uint32_t tcc    = 0;
( C$ B4 d4 e2 X  g# L3 `
9 `. Z4 W8 O' k9 f    print2arm("edma3 driver init...",0);
. T  y! U4 z: S1 T% j2 b- A- p/ [) K. b+ z
        hEdma = edma3init(0,&result);* \6 P' ~1 c" q9 \$ C. ^
        if(hEdma)
: a1 K: Z/ [- e4 I: I% H7 Q) f9 l9 @        {
2 k* g, U) ^3 F$ H9 p0 ~# R                print2arm("edma3init() Passed.",0);
5 k! i3 q+ [/ c" ^% P" Y        }
) G8 w. i" Q$ I6 K        else) [, s/ f7 l9 _7 R1 D
        {
( t( e" v8 j; }0 W8 Y                print2arm("edma3init() Failed.",0);
3 {. ?( H% I8 U: B) `. _% r4 t        }
% l+ G$ g  M% u5 p) ?5 s% E# I. A       
( p% }" x0 g' q5 p        if (result == EDMA3_DRV_SOK)+ a- `& Z4 T0 E5 T6 [
    {
: n$ I7 l5 L6 X# M5 Y                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,& S3 z- i6 S; y5 W' X8 N" i
                                                       (EDMA3_RM_EventQueue)0,
: Z  p' C0 C# ^                                                            &edma3_isr, NULL);! E- ?; @' k" ~1 Q5 Z" w
    }7 @( e% M4 t( R# s6 H5 T0 M8 V
       
& j/ p2 c2 i4 C# z% A        if(result == EDMA3_DRV_SOK)  _. T& W8 J4 W+ ?6 Q: _6 k6 ]' V1 m
        {
3 L4 J9 ]' {9 K& T- e, j                paramSet.srcBIdx    = 0;
% q' j1 Y0 Y% p% s                paramSet.destBIdx   = 1;& s; ^& g: F6 |; H! Y( M# `% V8 w
                paramSet.srcCIdx    = 0;. Y; ^/ i3 m* w! h
                paramSet.destCIdx   = 0;. ]. |5 W' T* _, I& ]  c3 \# d
                paramSet.aCnt       = PING_PONG_ACNT;
. B1 C% J& k7 F8 L, m0 z                paramSet.bCnt       = PING_PONG_BCNT;
# d6 e$ E$ r- L- O                paramSet.cCnt       = PING_PONG_CCNT;5 D4 E7 X, y: r* [) K' i
               
  B# D7 x3 V) s0 z# S                /* For AB-synchronized transfers, BCNTRLD is not used. */
2 i- M$ ^* ]# N# a" D                paramSet.bCntReload = PING_PONG_BCNT;) ]/ H8 i  [: n& a/ o4 ~; E

: p9 G& m+ U) e                /* Src in constant mode Dest in INCR modes */
" Y, Q4 f: `3 h& G- V; ?                paramSet.opt &= 0xFFFFFFFDu;
" D  s3 T" f3 n3 _; j, }2 M$ g, ~                //paramSet.opt &= 0xFFFFFFFCu;
) m/ H% h" }2 |% q" s& A' x                : y' ~( @" l' e% Z1 a
                /* Program the TCC */
0 D3 c$ k4 K% o9 n9 L                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
/ d3 W+ c  U, D) I7 F( m! K6 H5 X  Z* D. N
                /* Enable Intermediate & Final transfer completion interrupt */" e/ z& F! Y/ ?  [* W
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);8 }% I3 t& o4 Y
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);+ Y5 R; K# t- o8 }: P, c

' x5 U/ f3 {' i' ]                /* AB Sync Transfer Mode */* S, ?  {% C$ U2 x/ a
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
  T$ x4 C7 G# l1 ?' |6 @) {- M                ; U; z, `/ Y/ L  X- c4 a" a
                /* Program the source and dest addresses for master DMA channel *// W4 d0 e% D7 A- w' R" _
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
, l3 t) T. H0 X: C0 Q. [$ Q" F+ X                paramSet.destAddr   = (uint32_t)(ping_buffer);
- S/ L3 ~* ~' ?, W9 c  k5 [( K. h$ {# [; {. Q9 n' w
                /* Write to the master DMA channel first. */) U. C  o. T, T- M9 o+ j% ]
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
2 S) G2 h9 |' j+ B6 L5 g/ K    }      
9 a7 m" g; k7 R- c6 c' y) n: q( g- P) l& V$ D
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
5 A: A3 V, O9 j, x$ {5 Z  M        / T) e' L6 i* v: ^( x! b/ Y
    if(result == EDMA3_DRV_SOK)
$ E5 [7 a, W6 e9 A    {
2 L- |4 A( D0 r4 ~2 r            print2arm("edma3 driver init success.",0);' ^) l* B- F( h" T6 n# T4 Z
    }
) ?8 G% a$ R5 J! D0 C# H0 z) G) K}4 h# h, z7 ?5 S  s
* f1 q1 V: R/ X! e0 P2 C
2 `$ x% T- @; ?8 E1 `3 h& a: Q
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。0 b- }. ~+ X( v- h+ @: P3 N4 K
2 x1 ?8 x9 B1 m' l- s& x

" \( [- e) Y6 a4 }, P  M
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
7 W  z) ]$ ]' z, k- d$ N# H每次DMA传输完成后都要再次使能传输
# ^5 h. n& t6 k- I' S
原来是这样,我明天去试试,谢谢了!




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