嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:9 r" ]0 i  o  w/ U+ [
#define  PING_PONG_ACNT          1
( l0 w/ w$ Y: ~. M#define  PING_PONG_BCNT          8*32*40
$ _: p8 ], v- n2 X//#define  PING_PONG_BCNT       1
5 _$ Y4 [9 k3 M5 q#define  PING_PONG_CCNT          1
0 e5 P' P& M: T#define  MCASP_BASEADDR          0x01D00000
. p$ X- \' b# r& K#define  Mcasp_RXEVENTQUE        (0u)- b* A% p( c$ o0 N' I. \

2 d8 f, k% _4 n* a9 w/* OPT Field specific defines */
" g& O' m3 m) n/ `#define OPT_SYNCDIM_SHIFT                   (0x00000002u)& b2 s1 b( `8 K; `; E
#define OPT_TCC_MASK                        (0x0003F000u)
7 |) W9 E- X: X" ^#define OPT_TCC_SHIFT                       (0x0000000Cu)
7 M, L# m- E4 S#define OPT_ITCINTEN_SHIFT                  (0x00000015u); H' v, `8 L  x- U
#define OPT_TCINTEN_SHIFT                   (0x00000014u)* f. ]$ z) T) s( R# F) I4 f
' E5 a1 E8 i5 c% V- i5 w0 y5 \
char ping_buffer[PING_PONG_BCNT];
$ d8 `# j+ O$ g! ^/ v; tchar pong_buffer[PING_PONG_BCNT];
8 k' d2 \( X. R6 [/ J( Q/ c
$ e1 [6 P. N  f. R5 ~9 M9 z
* h; t2 W. `5 T) @) I/ `7 X) M: z
6 @5 ^8 p$ e, v( x; P
& y5 b# U" X" p; H0 `; istatic void ys_edma3_init()
8 \" J5 H9 Y6 N- J{- h  K  Y) `' ?
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
# g' H6 `) v7 {% p: ~        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
1 I5 G* s6 y1 y: Z0 A/ E        EDMA3_DRV_Handle hEdma;1 s5 Y1 u/ c* R1 A9 l4 o
    uint32_t chId   = 0;2 R! m4 A3 f) B4 u
    uint32_t tcc    = 0;
! i! R1 ^3 M- H8 R# q) q
! }) G2 w; }! Z0 a4 c4 e    print2arm("edma3 driver init...",0);
/ q4 M0 S+ T; k3 ]
7 U+ n; @& K! Y9 g" L! U        hEdma = edma3init(0,&result);# ^% k- ~- S9 Y
        if(hEdma)3 P" {8 F- F1 r. R  B1 Z) b7 t
        {
2 o2 ^$ L( `& X+ |$ l* C                print2arm("edma3init() Passed.",0);. M4 x" d+ Q5 t3 J, _+ T1 Q
        }
( K2 U+ B% z$ I7 b0 q" s; M        else
2 U. t0 Q2 x/ Z9 h8 v        {
8 U$ D/ |; z8 p. T/ D                print2arm("edma3init() Failed.",0);3 l( n9 |" P; i# k% x
        }+ \$ r/ B" l2 x2 K" u. |- P
        - {7 k2 v5 r' c8 N
        if (result == EDMA3_DRV_SOK)0 c7 W/ C! \' k  r) n& S
    {( Y& E! B4 e, W, ?4 Y- V5 e# M
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc," @9 |1 j1 m: V* |  Z
                                                       (EDMA3_RM_EventQueue)0,
  J& y" S! }0 e; t                                                            &edma3_isr, NULL);
! l1 q- E+ ]$ d  {: s" T% v    }
, T1 w- u/ n, H* k- ~       
/ V3 o8 C* ]$ z        if(result == EDMA3_DRV_SOK)' ~$ d) H- h) A5 B; @1 T1 Q
        {% A! T0 X% q" M( R8 g
                paramSet.srcBIdx    = 0;
# I0 T4 V+ h+ c( p% s9 H: Y! y: G                paramSet.destBIdx   = 1;
5 _) Q* ]/ q" z. T                paramSet.srcCIdx    = 0;. z) p# O0 y# R2 k/ T+ P
                paramSet.destCIdx   = 0;
8 f8 S8 r; c# P; Y2 H8 y+ j                paramSet.aCnt       = PING_PONG_ACNT;0 t% Z$ I4 k, T% Y
                paramSet.bCnt       = PING_PONG_BCNT;( O; [. M# F8 J& g, L+ _2 M! V  ~$ N
                paramSet.cCnt       = PING_PONG_CCNT;0 b6 b% d, I2 _; V8 Z) M( X
               
) T  o, y6 r: i& a& ]* D, Y1 o                /* For AB-synchronized transfers, BCNTRLD is not used. */
* S0 J1 v/ P2 n& C8 @                paramSet.bCntReload = PING_PONG_BCNT;' Q/ S7 ?7 n5 U) t8 B& `

+ R" ^. U: M+ V; c0 {$ L                /* Src in constant mode Dest in INCR modes */
9 V' h* X: u/ D9 h                paramSet.opt &= 0xFFFFFFFDu;' U7 ^. D" O% s
                //paramSet.opt &= 0xFFFFFFFCu;8 j( f0 i8 d! F# m
                : o/ k* K0 z* x  \- Z+ j- S( L* o
                /* Program the TCC */
" w/ n8 ]8 o$ s                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
7 E/ {, W5 R6 Z9 H) K( {- y, }* B: L! ]
                /* Enable Intermediate & Final transfer completion interrupt */
$ Q3 L; j, \: p7 `4 {                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);/ `% G5 j# {, w7 S4 L, k
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);/ U/ v7 D6 t8 `; h* ?" W

' \- |: D/ \* I+ V. W+ {                /* AB Sync Transfer Mode */
4 z/ |& |5 }% q( l                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);. r( d* ?  T& r/ w1 \
                1 E( x) v0 W. i" P, H2 t
                /* Program the source and dest addresses for master DMA channel */
$ ]( H( M) `; M# z7 E, s                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);% R: Q: Q" ^  U2 `8 o+ v
                paramSet.destAddr   = (uint32_t)(ping_buffer);( a! D. |- A. G; C$ E$ O+ v7 b/ ]' b

. m" H9 p, u1 D/ X0 k  _# l" d                /* Write to the master DMA channel first. */
/ H9 A6 p# Y9 L4 P7 j# P4 C                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);1 l4 f1 ]2 {. r- R" A7 O( F- d
    }       ( D9 N$ V& S- U3 X3 p
2 Y9 }; Y/ @; f  ]5 W" ?! d
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
2 I7 \& \/ H0 E5 u# C       
$ [. u) z* s# P. t5 P4 ^$ }    if(result == EDMA3_DRV_SOK) 2 ]  z$ J9 a3 w8 L
    {
1 B5 v3 g. d' f6 |) ^, C* E3 Z            print2arm("edma3 driver init success.",0);
) i# @$ g. G. Z" h# r    }
6 r+ ^5 `. U% I3 F' [6 k; B! c}
) M6 F) d4 j3 x6 D' q" z, L& E7 g; R5 ~5 z

) L; U! @! ?) M0 ~EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
* J( D/ b$ t0 }  u
9 \! l' _% y4 d+ z1 T# `
  ?' d. y& I) h  c0 o
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:475 {; m% I/ T* q$ _' |) R
每次DMA传输完成后都要再次使能传输
9 [, u0 e" J7 N
原来是这样,我明天去试试,谢谢了!




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