嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:* Q0 F2 r; r5 R
#define  PING_PONG_ACNT          1
  O, S' w  ?4 g" w  e#define  PING_PONG_BCNT          8*32*40
9 X' ]; X1 X; ?- `& h9 G8 q//#define  PING_PONG_BCNT       1 3 y/ _1 z/ l) E
#define  PING_PONG_CCNT          1: A0 _( c( M9 J4 S
#define  MCASP_BASEADDR          0x01D000003 D' V, k! K" s' |- b- M! w
#define  Mcasp_RXEVENTQUE        (0u)  d, T. k$ y% y0 t/ T8 ^' j, I5 D
) }8 @7 `4 v) m. F/ A
/* OPT Field specific defines */
) U2 @7 ]0 g6 x#define OPT_SYNCDIM_SHIFT                   (0x00000002u)  e; P7 V! `4 U$ L2 a
#define OPT_TCC_MASK                        (0x0003F000u)0 j$ A/ F+ L6 G
#define OPT_TCC_SHIFT                       (0x0000000Cu)
" u0 o' H- E7 Y9 z#define OPT_ITCINTEN_SHIFT                  (0x00000015u)* i% @- I- }' N
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
' a8 N5 l; Z8 `
$ I* z3 w8 o+ d( w& y* U: A- Lchar ping_buffer[PING_PONG_BCNT];0 |$ ^' b* y4 ?/ q. v' F
char pong_buffer[PING_PONG_BCNT];
* j; a4 Q2 r: p8 V, z1 P0 f1 r; L& [6 f3 c  f! n# q
1 A% h8 X6 n9 |2 G& I
/ Q% K  D9 V" g1 T  x2 i& i# p

  m6 U4 c! j3 Ostatic void ys_edma3_init()3 ~5 x. X$ F6 w9 Q- s
{
9 |* V2 S: r: E5 p0 e/ i0 t% p* S        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
1 }9 D- [' P# H! ~1 |- B; C) I        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
* b3 w. `1 t8 P" D0 |4 G        EDMA3_DRV_Handle hEdma;
0 g: v8 w- D/ A0 S9 E' {( J2 i    uint32_t chId   = 0;
& z( [1 R# j; Y: W# r9 v7 f$ j    uint32_t tcc    = 0;
% ?( X; B6 j9 V
3 H0 b$ M& j3 z5 i6 J$ ?! }- M    print2arm("edma3 driver init...",0);
5 _9 ?3 o! }: B4 d( Q
! {2 a4 n  t+ I$ R8 x        hEdma = edma3init(0,&result);
4 T8 |( J) Y0 Y9 c  G- J2 F) t3 j$ B        if(hEdma)) A6 K! B  s, V, [5 L5 }5 R! L
        {
9 B0 D+ g5 J$ ]. z                print2arm("edma3init() Passed.",0);) S+ b5 g# J( m% m0 T, Z
        }
. K- C) J% l8 T  W        else' _7 Q. X. P* H* \
        {6 a  i& E1 P2 G# m! B3 @
                print2arm("edma3init() Failed.",0);
5 ]9 ~- j& p3 P+ J        }0 K" a  O/ }- ?: V# R
        5 W; ?" ~% e* B% t. c  I4 s( R
        if (result == EDMA3_DRV_SOK)% w$ U, Z: w* W; @! Z9 t
    {
5 v/ a' V' [! P7 U6 a7 l8 f: L                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
4 s( T+ D) Z1 e4 h1 ^. D, Z                                                       (EDMA3_RM_EventQueue)0,/ G0 j5 T. b1 D: T9 w1 N" _
                                                            &edma3_isr, NULL);% X% }0 a; ]' z. N& E) r( ]
    }
+ K' _( U6 X: ], g       
  Y6 S$ U$ m' X* b  [        if(result == EDMA3_DRV_SOK)
0 L2 m$ d, p; W3 v& Z        {
& @- p+ K0 P% Q( c                paramSet.srcBIdx    = 0;
) J3 O; w$ s0 f* {9 q# j                paramSet.destBIdx   = 1;7 t. u' _$ s7 t# y# `4 P
                paramSet.srcCIdx    = 0;
$ a, e& f- z1 R! A3 }% @  C                paramSet.destCIdx   = 0;
2 l8 v  u8 t1 l6 x, k- D                paramSet.aCnt       = PING_PONG_ACNT;
0 ~, ~1 ?0 e3 d7 |3 w/ G                paramSet.bCnt       = PING_PONG_BCNT;3 u- Q4 V5 z) ?0 d/ F. g
                paramSet.cCnt       = PING_PONG_CCNT;0 T8 z0 U8 L% U& a& H$ S* b& q, m
               
, }# P4 N/ h5 x8 |, T                /* For AB-synchronized transfers, BCNTRLD is not used. */
: a: m/ g$ C" _+ f+ B, k7 Z                paramSet.bCntReload = PING_PONG_BCNT;8 E' l8 d0 i3 J  P$ f
* M! s6 R2 o( f9 T. T; {
                /* Src in constant mode Dest in INCR modes */
1 g1 ?! h# o" s. h/ F                paramSet.opt &= 0xFFFFFFFDu;% p0 i5 F7 N) R; i) z; G$ j6 R
                //paramSet.opt &= 0xFFFFFFFCu;
" q0 @. a5 S' E- z; V% }               
9 N. G& G- i+ B+ V2 e# J7 j2 A                /* Program the TCC */
+ P; a& }" P" V. E* T4 V                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);- C6 b& d$ b6 j. {) q$ ]1 d
$ B( V5 e2 g3 a- B8 Z8 d  L
                /* Enable Intermediate & Final transfer completion interrupt */
& \2 M! ]8 C" |; X                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);( x& C4 z& t1 P1 Q  l) g
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
6 Q2 Q! _: E9 u  \
3 n1 Q8 D' w, @) w                /* AB Sync Transfer Mode */
' y1 m  o  \; @                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
- X) Z6 Q7 V6 w& ]8 @  c$ ^' s               
( j, i, N, V2 u+ @( j( C) C& ?; l                /* Program the source and dest addresses for master DMA channel */
4 A( s# m% C5 d1 h3 l* Y9 M                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);) `! T, c# c: K( T  C
                paramSet.destAddr   = (uint32_t)(ping_buffer);0 z5 ?$ U$ J4 {: F  `

$ O+ C' U7 j8 Y2 @) Q                /* Write to the master DMA channel first. */
' x6 l' V( D; l  S4 Z( [6 [1 ~                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);5 j2 q+ a4 p, ~1 M
    }      
7 \4 X0 Y9 {6 c3 }# j- F8 j
6 Y' L$ T, @* d5 ?1 M6 j* L; r/ v        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
" D2 i: f  e  r) P! E- F       
" X- }' V/ t; W5 j# l' `" [    if(result == EDMA3_DRV_SOK)
& x) P  c5 R7 c5 P. f    {0 O! i" G+ c# X, B) B! G) o+ T( W
            print2arm("edma3 driver init success.",0);$ i4 x3 b, {+ Q
    } * O) B( j( _  c7 s2 q
}( \: O" x6 i7 P/ {
0 c) J) j0 {+ T
9 t2 M: p8 ]* f7 p& v2 {7 Y
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
( P# `" Y, _$ Q* U" P" e( O- F! p7 x4 f$ [5 |3 Q
# J8 a3 ]. k# L: m5 p3 b0 P

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
8 w/ ^% {6 C: r, _+ i, X0 e; {3 t7 m7 `每次DMA传输完成后都要再次使能传输

: C7 U. h1 A' }. F0 x1 I原来是这样,我明天去试试,谢谢了!




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