嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:8 @  t; w( S5 y2 E
#define  PING_PONG_ACNT          1% u  A3 p3 [$ \; i* u; c, O
#define  PING_PONG_BCNT          8*32*40
5 n$ l' j2 Z" J3 J2 s//#define  PING_PONG_BCNT       1
! _( k, x. e! H8 D#define  PING_PONG_CCNT          1
3 J+ @7 K9 W! E1 g1 u5 G#define  MCASP_BASEADDR          0x01D000003 T3 T8 T( x9 @+ |! L, w5 a1 I% {
#define  Mcasp_RXEVENTQUE        (0u)
0 s7 }+ Y8 Q" S/ \& u3 m  Q5 r- Z+ ~* B2 I
/* OPT Field specific defines */
' \6 Z5 t' p; n$ B! A1 s' d#define OPT_SYNCDIM_SHIFT                   (0x00000002u)+ }, b; @3 P0 {
#define OPT_TCC_MASK                        (0x0003F000u)
) S  L3 j" e  _2 H5 Z0 \! s. R/ y#define OPT_TCC_SHIFT                       (0x0000000Cu)8 c+ G" y3 o1 s. F2 U( G# m2 @7 }
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
! m) T& l8 h4 B: c! n6 I3 g8 f#define OPT_TCINTEN_SHIFT                   (0x00000014u)0 f; M0 {6 ?+ l5 ~8 n$ t  C

$ F3 H: }: [5 u  \  K% b* qchar ping_buffer[PING_PONG_BCNT];2 @8 _; V5 M5 C
char pong_buffer[PING_PONG_BCNT];
- C" f3 z; q' X- {9 z% T& |9 E4 F! ?

! M& {+ ?% o( w' f9 W
% G# B+ E( D% r( j5 H
/ R" G5 a& K- k8 b" astatic void ys_edma3_init()% \- p$ A7 V4 C5 s3 L2 n& j" f
{# v- x: c- H/ {* p: J! ?
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
% @9 V! Z" I8 b4 h, H' D8 M% }. Z        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
" y8 l' o+ P' e  e# y' L        EDMA3_DRV_Handle hEdma;
: p! {5 f7 H9 t+ h& {) _3 m! \    uint32_t chId   = 0;) y9 B- z/ ~1 q# N6 `7 j
    uint32_t tcc    = 0;" X3 r5 V) w4 T5 v

& N# x6 e, u0 F6 J4 ^+ o    print2arm("edma3 driver init...",0);/ y( ]8 d0 d  \1 E# |! g6 k
- H: L# _* O8 _& i( T) O+ k' o
        hEdma = edma3init(0,&result);
5 }0 V! k+ z3 P: l. r        if(hEdma)
! y, _# ~3 Q) e- J- P        {
" Q: A7 R8 A) F. z6 U                print2arm("edma3init() Passed.",0);! o. k" |  E  }3 K, H9 I
        }; Q& i3 V" |& N1 M9 J4 w+ B' I5 e
        else
& p8 I2 r  k( q/ `  |+ Z* b, F. Q) P1 q        {
" B& i% |1 i1 v3 F3 q                print2arm("edma3init() Failed.",0);" e% T9 a# r9 {3 @8 j
        }
4 d6 g! U; J+ g) G+ U8 L        5 n# n: x8 p5 W6 t$ s- `; ]
        if (result == EDMA3_DRV_SOK)
* t  R: {/ r+ l    {6 E3 K2 X9 h5 g9 v
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,' w3 B" [* U: E- \
                                                       (EDMA3_RM_EventQueue)0,
8 h, U& _! k3 c) ~# \& g                                                            &edma3_isr, NULL);
# A+ k: O1 I( [    }
. e; X; _2 V3 z! O$ w0 ?6 q       
4 a- p7 t9 C* q) }        if(result == EDMA3_DRV_SOK)
$ V0 Z; V7 c- u9 _( n# M        {6 f, _" L- A+ B, o1 b
                paramSet.srcBIdx    = 0;
5 W, V$ h- h/ u* ~9 C6 z" E8 o                paramSet.destBIdx   = 1;! I$ I- J6 N! A& E$ a+ _; X
                paramSet.srcCIdx    = 0;
( F' ^1 {% G" b2 G$ P- E+ w- n                paramSet.destCIdx   = 0;
' r  S$ ~+ i9 B& d  Q/ c+ P                paramSet.aCnt       = PING_PONG_ACNT;2 k9 R" X- c: v2 H& \
                paramSet.bCnt       = PING_PONG_BCNT;
2 |6 E5 E# a4 e                paramSet.cCnt       = PING_PONG_CCNT;
5 i1 e, a$ T( y               
+ U$ Y8 \5 L8 E                /* For AB-synchronized transfers, BCNTRLD is not used. */
" P8 w! N# n5 G) b) R9 J, q                paramSet.bCntReload = PING_PONG_BCNT;
* W+ W+ ?1 s1 O' v& J! X
: E) o" {: w) U                /* Src in constant mode Dest in INCR modes */
0 C( \# J; w' |) |( q                paramSet.opt &= 0xFFFFFFFDu;
* r$ d" x: m# @                //paramSet.opt &= 0xFFFFFFFCu;* G2 n0 v: j/ h3 e: P6 e# ]2 S
               
9 q5 |  \- M- r! E% K" e5 J7 J                /* Program the TCC */
( k9 G+ P9 ?2 Y6 v                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
7 M  h+ Y/ \5 w( h7 S  u% G! f* r
                /* Enable Intermediate & Final transfer completion interrupt *// |9 x! A) @; v1 [5 A
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
' o: T# A5 P% A0 q- h8 V- g                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);0 o" C7 D5 @; f) s- G% i

0 B: J$ F3 c/ ]8 z' e1 z* a4 B9 m" W9 P                /* AB Sync Transfer Mode */% @4 ^; Y7 F" l7 X1 d4 c& F
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);: A' f( g1 f' f7 }
               
( ^7 O& E- A0 c, }' l; \3 H                /* Program the source and dest addresses for master DMA channel */  N& L) V, c7 K
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);$ d" Z/ ?% q7 u# C; d) K( \
                paramSet.destAddr   = (uint32_t)(ping_buffer);1 u9 q5 ^# E( c

0 l& ^2 {: `4 X1 Z                /* Write to the master DMA channel first. */& b9 M; Q# ^* P, K7 L0 n/ m3 L
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
: e1 k8 v5 h/ s! S6 U* J    }       9 `- m4 Z! G4 S

  s$ Q! @. L) d3 Q+ Y6 x4 k* z        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
0 W1 q" ^7 m, ~7 J       
$ k& ?; n& \& e) H    if(result == EDMA3_DRV_SOK)
! P! X: F$ {* V; p, S7 L    {2 F: W3 ~! Z. y3 J1 P' q4 N
            print2arm("edma3 driver init success.",0);5 d% ?9 L$ y9 j& E- n2 j) c
    } 0 K, D! d: R* w2 d3 \2 F
}- ^/ J" k7 z& `' Z
' Q* B4 x/ m- ]1 h3 {8 o4 R$ g' E

% M$ F4 B6 Y% }% a4 P2 kEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。) T( I+ Q0 V7 v8 O% F7 z
& R- E  D# d1 T( [* u; ^7 Q8 x7 y

/ b  R& s7 R' f" J5 g% t" u
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47/ ^. W# W5 H5 x) A0 q5 N( v( }
每次DMA传输完成后都要再次使能传输

$ H" f8 D8 G0 U7 x5 F5 Y原来是这样,我明天去试试,谢谢了!




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