嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:" d' f/ m- C4 x+ K% d
#define  PING_PONG_ACNT          1( q4 `+ W  Q" N' ^% Z! b
#define  PING_PONG_BCNT          8*32*40 - W$ E8 R* y7 Y% f4 U
//#define  PING_PONG_BCNT       1 ( h2 O* C2 i" S
#define  PING_PONG_CCNT          11 C$ P& s/ Z, D' D0 x( ]
#define  MCASP_BASEADDR          0x01D000008 T2 m' g! j2 F  m& X0 C2 |
#define  Mcasp_RXEVENTQUE        (0u)
( L+ [" y) ~: i4 h
4 {* d7 @" H3 @, u7 P0 X. b/* OPT Field specific defines */8 Z( y$ B* M, @& z) e( X. _" P
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
, j  W. D; n0 j' B  t#define OPT_TCC_MASK                        (0x0003F000u)  O2 x0 F- _; X4 M4 }  C
#define OPT_TCC_SHIFT                       (0x0000000Cu)
! w, t% j; S# o, E# @8 ]#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
/ D# i1 p+ x# M#define OPT_TCINTEN_SHIFT                   (0x00000014u), D/ [; H  ?+ `% ~+ B. k
# t6 S3 A# B/ _. c9 X' l2 }
char ping_buffer[PING_PONG_BCNT];
2 `8 `5 @; I  C( }& o; Ichar pong_buffer[PING_PONG_BCNT];% @9 z' t3 q+ [

3 Q5 p$ F' j- p6 h3 N- a0 u  O1 _# h6 M0 x  P4 b* R

  W, O. c4 A6 X) L9 M) n/ G& \. n  i: [2 f$ T' x! O5 F4 |* V& c
static void ys_edma3_init()
$ n! X" F( ?# Z! C{
* h0 x& W6 u/ F        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};+ b" ]6 Z8 ^1 G. }: o2 J
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
" c" V. p' k4 H3 ^& I, }        EDMA3_DRV_Handle hEdma;/ a+ k6 `5 r/ H1 b
    uint32_t chId   = 0;' b1 U+ J* X; q% r! x4 |
    uint32_t tcc    = 0;; \# ^* N+ D( _+ S3 H6 P

" q0 e' ?! \0 Z% O5 i    print2arm("edma3 driver init...",0);
' }- l  F$ n$ v# v* w, g/ {0 T6 R; u
        hEdma = edma3init(0,&result);+ i$ W: D2 Q' W9 w% m: J
        if(hEdma)
" T6 H3 b8 }; I9 x+ [        {9 s' Q9 b+ f6 n2 |
                print2arm("edma3init() Passed.",0);* ^* q+ O3 u/ H7 U3 x  [
        }
8 s0 `5 w& O0 B1 l, p        else
0 `( {- I/ Z( n' c        {+ R( i( v  Y5 V" ~# P8 S
                print2arm("edma3init() Failed.",0);
' y3 _$ ?0 @5 X# O2 F1 D: R1 l        }5 l  w9 v9 D+ l* J" @" ]. k
       
. x/ u5 j" ^( h4 C        if (result == EDMA3_DRV_SOK)
: V6 N- n& E. k$ _! Q7 f/ ?. U3 a    {
$ l# c! `# I7 f+ j( S0 r' ~                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,; O# A; x  d' B; v& K; F( H
                                                       (EDMA3_RM_EventQueue)0,
. _4 C- k% p% m8 b4 S                                                            &edma3_isr, NULL);
' w% v4 G6 k3 N, p2 @    }
5 f1 e) M2 k3 o2 m7 |( L0 S; ~       
% |" c/ B3 w7 [$ d; I7 L, i        if(result == EDMA3_DRV_SOK)
( f! p# D$ O6 c1 b        {& L0 o. J8 ]$ A7 I- m5 Y- H1 V
                paramSet.srcBIdx    = 0;
1 {- P  f0 u+ r3 X# X8 d                paramSet.destBIdx   = 1;
' M1 ^9 E4 a4 m$ S                paramSet.srcCIdx    = 0;
( A  w7 \) b" v2 C+ [& E                paramSet.destCIdx   = 0;
3 m* C  j9 g, W5 ^, ~6 L! J+ c                paramSet.aCnt       = PING_PONG_ACNT;
0 Q( ?; ~4 B( f# Z$ h- M0 I4 W                paramSet.bCnt       = PING_PONG_BCNT;
, C# z+ K/ K2 K                paramSet.cCnt       = PING_PONG_CCNT;; p! _" P. a1 i5 i" b0 ]4 d/ H# x
                : W" F6 [" c9 l  v- N7 c, i
                /* For AB-synchronized transfers, BCNTRLD is not used. */
# ^7 q1 j! {' S7 v: Q9 r                paramSet.bCntReload = PING_PONG_BCNT;
5 P, R' X- s6 l  `7 W
" Y* `: [: S- [. y6 Z8 [0 ?. f                /* Src in constant mode Dest in INCR modes */8 {  f  c. X* v) `
                paramSet.opt &= 0xFFFFFFFDu;1 o6 d4 ?% q: Y
                //paramSet.opt &= 0xFFFFFFFCu;
  e( {+ ~0 X4 a" b: c               
0 Z7 Q' S" j8 A$ v                /* Program the TCC */
  N' X  z9 A7 Q* J/ W. }                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
/ G" s* A/ ?8 ]: r) I4 O6 O/ e2 L5 X4 f' o/ P3 M$ F. {9 ?
                /* Enable Intermediate & Final transfer completion interrupt */: m( ~# W0 C& \% J  O2 M
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);$ r: }  f) S8 D7 ^; W
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
% D, s2 B! x& ]9 e( S& J* }
  b3 ~" [* v8 l/ O; m                /* AB Sync Transfer Mode */; j+ D% x& V# p. a% V& j# U' ]0 i
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
& Q4 j; m, c  I5 R# b% f1 q               
3 Y5 t6 y& ?, @7 B$ g* V! t                /* Program the source and dest addresses for master DMA channel */
! q1 a8 Q- e9 o/ f                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);  G4 z2 W! ^0 R9 H( h% q4 H
                paramSet.destAddr   = (uint32_t)(ping_buffer);
+ R  S6 v9 V2 t( E7 O
- K) V8 _: X* H- N$ F$ I                /* Write to the master DMA channel first. */
# ]% y/ r9 q$ Y, L                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
, P8 i" W) _* S6 [/ E  x    }       - G. S! s* L) U2 Y. b2 ]' r
; d  S: |# o  J& C
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
2 {# v$ u' \# r& y$ T        . a% x8 X9 d$ ]& Y' |2 m
    if(result == EDMA3_DRV_SOK)
  d# z# I  M( t  G& Y( K! s8 t    {7 {- r4 J2 p0 U9 z" N5 p
            print2arm("edma3 driver init success.",0);
! b1 l; m, ]( V1 a, b2 T" s: w+ t6 h    } 7 W: v  U3 V. n
}
- t* Q. {3 e" b# G
$ u5 t( {5 \' `7 u+ b. Z+ p% {* T7 U+ Q: K3 V3 a3 y* E6 Q. j: d5 k
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
) X4 q. p; {5 f# |" T4 W; P  f. f' D$ C: u0 b
% @- W. J3 {: F6 L5 K5 ?

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:476 Z+ [6 A/ y- y. P4 a' z% Y
每次DMA传输完成后都要再次使能传输
+ m1 Y/ v7 y) Z# |  Y: E! F5 A
原来是这样,我明天去试试,谢谢了!




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