嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:5 o7 E# m/ c" g/ y' ^' B, [
#define  PING_PONG_ACNT          1
% {0 C, d2 Y* y% R6 p0 I% e#define  PING_PONG_BCNT          8*32*40
" p1 T! e$ v8 g. K) X* z, h//#define  PING_PONG_BCNT       1 * C, y8 {# n: y: u# q4 a
#define  PING_PONG_CCNT          1* E" i) |8 z! C1 t1 S( V
#define  MCASP_BASEADDR          0x01D00000  {" ]4 Y; t, z5 R/ s) N8 Q5 S) U
#define  Mcasp_RXEVENTQUE        (0u)3 y* h" y( F1 q4 T1 [

: C' R9 H$ F0 w7 J7 n3 U/* OPT Field specific defines */  ^5 p4 r% H8 B4 D* i$ E
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)8 A" B5 T! V' d* D: I: l7 `  g. `; D
#define OPT_TCC_MASK                        (0x0003F000u)/ Y2 A" q; B0 L% A4 n2 f
#define OPT_TCC_SHIFT                       (0x0000000Cu)
; h1 K2 k% z; f5 q* G#define OPT_ITCINTEN_SHIFT                  (0x00000015u)1 |% u6 E0 ^  b$ Q: ~
#define OPT_TCINTEN_SHIFT                   (0x00000014u)6 k6 ]6 g" N9 i# m  c6 V

( Q; M* r: H$ Z2 y! O. Achar ping_buffer[PING_PONG_BCNT];# L$ m6 ~, n/ G
char pong_buffer[PING_PONG_BCNT];& g) X  r: X& Z4 ?' H# i0 E7 y

/ K* x( W  z+ \: n0 \* }
" F$ O2 T8 \  X/ @6 m3 G
8 \3 t) A. X) ?; L
- i$ {( k% Z( h6 P' \# ^+ p3 f2 Z2 pstatic void ys_edma3_init()" e* a# s( F$ c& i3 F( N
{
1 e7 C) U1 g0 M- ]  W! n( B# p        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
. W0 n" k1 c. m8 J. [        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
3 p* X& o, L, _5 \! C& y        EDMA3_DRV_Handle hEdma;
& p& t9 _" \) [# u  B" o    uint32_t chId   = 0;
# {% P" \& F0 M# S: U6 V    uint32_t tcc    = 0;, O# y2 B% c* \/ _. f; r

; J* C6 w+ U- i' G1 c1 s    print2arm("edma3 driver init...",0);( ?* N; I) [* O+ K9 g" {
# ~1 f9 e0 \  w1 w1 t
        hEdma = edma3init(0,&result);! X7 k6 |* ]6 s: E6 M( n$ Y
        if(hEdma)+ m1 C) v0 X' r' L
        {
1 e5 d7 Z2 }1 `( V. E: e# g                print2arm("edma3init() Passed.",0);
! v5 g. I4 ~, b: E" j        }
' O8 T2 e+ D- j: `, L        else3 g$ @; U3 X* {1 Q
        {+ |/ T5 u8 x) O! _3 r
                print2arm("edma3init() Failed.",0);
! E" ?4 F3 l8 c3 ?9 U4 o        }4 N4 H) G' c' @6 y0 g
       
* N1 a& a7 M: f' i0 C& M, p        if (result == EDMA3_DRV_SOK)7 B9 C" r( ?% w0 J3 r" l) x
    {2 F2 S- \8 H: s. L7 j: g
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
" T* |5 u3 t$ Z9 x' G5 D: x& M( k                                                       (EDMA3_RM_EventQueue)0,4 x& w- @3 d. j" t0 X) q
                                                            &edma3_isr, NULL);, A& L! w( x: x2 r
    }
' [' h5 `( I. c        3 W/ f* e$ t7 v/ y
        if(result == EDMA3_DRV_SOK)+ W. u& \. ^# X# _6 ^* }
        {
  C7 u! z7 R' D& ^3 {! M                paramSet.srcBIdx    = 0;
) r. o+ b* ~5 R) A. o: u                paramSet.destBIdx   = 1;
3 Y; d4 p7 z, O' g( i                paramSet.srcCIdx    = 0;6 |/ e! B" b" K" a, E
                paramSet.destCIdx   = 0;
  [/ ^) P8 d' z' U2 c# p5 g                paramSet.aCnt       = PING_PONG_ACNT;
5 O" [# C$ H: z7 p6 k# l4 [0 i                paramSet.bCnt       = PING_PONG_BCNT;
1 R) h- X, ~& a/ {+ `                paramSet.cCnt       = PING_PONG_CCNT;/ y" }+ _9 D! d, n4 _) G
                ( e+ W2 R9 }- {4 N5 a+ p
                /* For AB-synchronized transfers, BCNTRLD is not used. */
5 |$ P; V7 t7 `6 R) T* V4 I1 f                paramSet.bCntReload = PING_PONG_BCNT;8 ~) I1 Q* J. b

2 C/ Y; o0 y. p! `! W; }/ S7 F                /* Src in constant mode Dest in INCR modes */
5 t; q0 O5 \& {; t! ?. k6 P3 ~                paramSet.opt &= 0xFFFFFFFDu;0 J# ^! Z" s  X7 F) H7 a1 j( r
                //paramSet.opt &= 0xFFFFFFFCu;
" d  A$ c: s* w               
" d6 i& ^$ b7 t7 w1 V4 a; k                /* Program the TCC */
+ V$ R9 G9 e8 R7 m6 c6 T4 l2 x                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);8 f: d3 _+ z7 ]  m- ?+ D

6 J: O* D( l( h0 W- I5 C% M! G                /* Enable Intermediate & Final transfer completion interrupt */  X3 R. W3 q+ K" t
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
  u. d! b# x  N: P; q% ^" r8 {/ c1 v2 K                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);0 a3 F5 R' ~) p' t1 H

4 N& @, M! V, B6 e9 Q) g                /* AB Sync Transfer Mode */
. \0 F4 v! Q7 h, q, @6 T7 c                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);$ T8 u: x/ t, Z# R* G1 E( {6 v
                ; C. [1 a2 `' O9 J, D. m4 T
                /* Program the source and dest addresses for master DMA channel */
( l( Y' E6 m% m9 x+ _% g( h( ]' H- [                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
/ k; j( P8 r: H                paramSet.destAddr   = (uint32_t)(ping_buffer);
$ F4 c5 a5 e0 ?# I
- t- Y. H- }! N& I: p+ Y                /* Write to the master DMA channel first. */
$ t& X6 a* r9 b) X                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);8 u2 N$ f5 _& l1 N9 l1 a
    }      
4 C( H9 n/ c% P* R2 e& d2 t
, V- ^! Z& L9 Y3 y$ e        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
; ?7 h2 w+ u4 [0 i% L       
6 Q5 p! t: u1 z' Z& ^5 M6 W9 ]& ~    if(result == EDMA3_DRV_SOK) / h! L9 G( F* Q) T+ E
    {. m- ~7 U% g! H/ G3 W
            print2arm("edma3 driver init success.",0);% I! @. E3 C5 D1 K4 K
    } / m8 [; w) K; s- a3 }; ^% k, l
}
7 H5 C6 h+ V- E) Q. W/ |+ m8 P9 \" w' i7 Y7 ~' B; E& b

: e5 w( g& N" U0 H2 KEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
1 O9 m7 A7 m+ o  ^( }
; h2 p1 D; P6 a, R! H% o8 \4 q3 [
  {5 D# c8 j' X- N
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47: m# z: Z, [" M
每次DMA传输完成后都要再次使能传输
5 `  Y5 q  g5 P% I) A# c
原来是这样,我明天去试试,谢谢了!




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