嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:" t" Q5 v% K. w" {) k
#define  PING_PONG_ACNT          1
6 H+ B, [+ c3 r5 S8 p! F4 U# ^#define  PING_PONG_BCNT          8*32*40 4 v( K+ l, [6 K2 J7 |- u
//#define  PING_PONG_BCNT       1
# O  L: |4 i9 q#define  PING_PONG_CCNT          1
' x; k. `7 D0 W6 x#define  MCASP_BASEADDR          0x01D000006 L( R9 |. s! X6 N; @) l
#define  Mcasp_RXEVENTQUE        (0u)
, H3 y. S! ]5 b3 n4 X. S
, D, W1 W6 H9 q. _9 G! ~/* OPT Field specific defines */% ^# [1 u8 Y2 ^' l) o% e
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)1 M9 f) {0 E7 v4 Q2 X" e
#define OPT_TCC_MASK                        (0x0003F000u)
3 a6 j+ K4 G$ K( J! y. {' Z9 U1 B#define OPT_TCC_SHIFT                       (0x0000000Cu)# C+ P: b3 k; S+ ?+ K
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)' @8 M: S" Y) J) a8 b
#define OPT_TCINTEN_SHIFT                   (0x00000014u)' `, m4 h6 Q3 N. P$ v& z
* O2 j8 g8 m6 ^; L6 P* j* I$ G
char ping_buffer[PING_PONG_BCNT];
( y# ]3 j  h3 x4 H: G& F3 c- cchar pong_buffer[PING_PONG_BCNT];- w. o& |4 c+ [
$ n) q4 G# x+ q7 u
- q" ?2 Q9 S  n9 S( w. ?# H  w

0 O; }! S2 H! A, L
- z0 l' @' t6 F7 F) B3 }' m7 fstatic void ys_edma3_init()7 z3 [  k# s3 K6 R
{  d: x% c7 d+ f5 z% d8 Z. n
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
3 M* q1 k1 L1 b# ?        EDMA3_DRV_Result result = EDMA3_DRV_SOK;' @1 p8 ~8 }* \5 g0 n
        EDMA3_DRV_Handle hEdma;" ~/ V4 x3 T" a; R7 {5 @- N
    uint32_t chId   = 0;
2 v4 P* B$ E8 L* R8 \/ n$ _$ |- ~. N    uint32_t tcc    = 0;
3 O6 S5 a3 i, x* G
5 N) m' j, W0 T) x, ~$ j    print2arm("edma3 driver init...",0);) ~! L7 P; j9 A3 s

  D5 D& r; V7 O+ n. {        hEdma = edma3init(0,&result);
1 n# X3 A8 ]4 g        if(hEdma)
! `" D% t( f# b4 g% B) ~        {
& X" Z* \# d- Y& b1 o  G7 B                print2arm("edma3init() Passed.",0);
3 ~/ B, _% Q; b9 x# o' f5 d/ W        }' p  u- z, T$ U2 E
        else- `7 a: \% L/ B" q0 I
        {
4 B7 i; r) w3 }                print2arm("edma3init() Failed.",0);
0 G" F5 g- ?( M- \$ f        }/ i! v4 W( E5 I# \' ?' H" q/ ^
        . h2 S9 z  v3 [1 j1 X* E
        if (result == EDMA3_DRV_SOK)+ F0 Z( n" J1 C" C
    {
! M  ?2 @" ^" H& p' w2 w                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc," E# ?& z/ Z5 |
                                                       (EDMA3_RM_EventQueue)0,+ [+ o6 V7 v0 R* ^, W# v5 s& y# |
                                                            &edma3_isr, NULL);
% N* U2 z) \* e$ z" X( e3 E    }$ n8 b! `2 B+ \
       
- {: @1 F6 O) Y) x% A5 z7 J7 q        if(result == EDMA3_DRV_SOK)! @1 q* M) s, D. K: ~" K" K
        {
! E  W- G6 T8 I$ V                paramSet.srcBIdx    = 0;3 E' I' u* X: q
                paramSet.destBIdx   = 1;
- _- g8 m1 y' B. @$ K/ m0 R                paramSet.srcCIdx    = 0;
/ _, E" d9 X0 e7 H                paramSet.destCIdx   = 0;' H" }0 e) g% N! l5 n, a3 z  f
                paramSet.aCnt       = PING_PONG_ACNT;
& c9 U- N! R6 Q5 o7 ]5 g$ _                paramSet.bCnt       = PING_PONG_BCNT;7 T& ~3 G+ r5 U6 f9 {7 u
                paramSet.cCnt       = PING_PONG_CCNT;
9 D5 f5 D+ k/ r3 b, {' d4 r               
9 a/ I: w3 J3 w, b9 n                /* For AB-synchronized transfers, BCNTRLD is not used. */
4 z' B$ ?) W9 w0 g& n: k5 T/ D                paramSet.bCntReload = PING_PONG_BCNT;
7 [2 d% j' K: H2 u. ]" s
3 ~: x" q0 ^) @4 z8 v                /* Src in constant mode Dest in INCR modes */
# I1 I% J7 n( c& {                paramSet.opt &= 0xFFFFFFFDu;$ i$ z1 M1 B. \$ y. K. Z- W8 V
                //paramSet.opt &= 0xFFFFFFFCu;+ E3 E' N0 V+ R! E" p$ e0 v' ?) W9 X
               
/ A! f2 Q3 t+ X$ w                /* Program the TCC */! w3 h0 ]; x! {- M& T: G
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);! N6 h2 q! N1 z1 P) d6 W
  ~' K$ h9 s$ g9 K, A4 c5 B
                /* Enable Intermediate & Final transfer completion interrupt */
# V% G; [: F. e. e8 @- E( _                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);2 u- R" p. u/ g/ |( G! v1 j
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
6 p) W# @  `& _+ n' p! G1 v) f! l' a2 L. ^
                /* AB Sync Transfer Mode */) d7 w7 S: d9 \& ^
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
$ {) V7 P  O2 u, O! i5 Q5 K                2 J. ^/ K/ X$ L8 `' ]. ?
                /* Program the source and dest addresses for master DMA channel */
, m( G5 v# [& w; ^- l                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
, G9 F. @; ~- d' W4 {7 |' s                paramSet.destAddr   = (uint32_t)(ping_buffer);
/ _! f! x$ s; {( x' ?) A
# a, W3 Z% X( |; T6 d                /* Write to the master DMA channel first. */
# H) o! G. T) L' Q; ]( W1 n! a4 h                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
7 c) C1 c3 G4 P7 i4 i    }      
& C" |$ n& @8 p0 l1 N1 L( F9 n0 G9 |! ^4 u
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);9 r0 }  D! _: e' E5 Z5 r9 t. T  a
        4 R$ _/ K3 P8 u' A$ L) U" Y
    if(result == EDMA3_DRV_SOK) 8 u' F. p7 K; f7 \  G
    {" r. H4 a1 L  P8 S. E
            print2arm("edma3 driver init success.",0);
1 _* E( B5 R6 W+ H$ ]    } 6 @" f' Y8 [2 X3 R& G/ V
}
. U: M: B/ U8 m7 o- O9 j3 X4 l
: @# u; K! V$ h, S1 E( Y) z  `' I  k! @( @, b  I; H  G
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。& k9 O2 t" u2 Y& W' [

4 [5 |" ~! p: m+ W4 p! w
2 _% p% I1 O/ L6 _9 E" y, h
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47  q0 S' ?8 v( {
每次DMA传输完成后都要再次使能传输

2 T# X  u0 H! t% P2 P原来是这样,我明天去试试,谢谢了!




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