嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:" u5 P4 ~! M1 P9 e
#define  PING_PONG_ACNT          13 p  q/ E: x- f1 Q5 P% b
#define  PING_PONG_BCNT          8*32*40
! Q/ u, T9 _; s7 v+ m  i$ Z0 E//#define  PING_PONG_BCNT       1 3 s% x6 M0 y$ S. S3 _* X& ^  ~
#define  PING_PONG_CCNT          1
" \! y( J1 |$ h% q#define  MCASP_BASEADDR          0x01D00000) N+ b5 n: Q$ Z% \' h
#define  Mcasp_RXEVENTQUE        (0u)0 B! q# s# g, H8 N7 V9 C

6 r! C, ]4 p- b! B4 ?/* OPT Field specific defines */
: d" r5 z/ U% l4 W1 [: P! c; }#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
/ l9 B2 v7 B: E; q9 m. E) R1 ~9 e" T#define OPT_TCC_MASK                        (0x0003F000u)
6 s) ^0 ?% O7 K  X#define OPT_TCC_SHIFT                       (0x0000000Cu)7 F  I( g& j/ @1 J' Q0 U
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
0 u$ t% D) h' W' a. E4 k#define OPT_TCINTEN_SHIFT                   (0x00000014u)( y( o: C7 i8 M. R8 T: c

, I3 i$ a/ E* s$ p' cchar ping_buffer[PING_PONG_BCNT];+ A4 q: [6 m5 j3 T# g; @1 A
char pong_buffer[PING_PONG_BCNT];% m3 u# Z* N1 Z: G5 j  t6 |

' i: V" p* z2 `5 P6 q! w) e: ^3 Z7 p' @/ @/ I6 @

$ p+ {6 J& `! n9 C
+ c8 ^( n9 t; [. ustatic void ys_edma3_init()
; p% F& x' |" A- l7 ^{
: M2 G6 ~/ W( Y% b+ P        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};0 F- q! c) _- A: L
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
4 V, L8 m+ [8 A# S  ^; X        EDMA3_DRV_Handle hEdma;- z" d% a$ y7 E& }
    uint32_t chId   = 0;
6 }+ H) {! S4 p    uint32_t tcc    = 0;
* t5 H* h) ?6 r/ T, k# P) O* ?5 O$ r
, k% O/ Q6 [( u$ D+ N9 M    print2arm("edma3 driver init...",0);
! B: Z3 _9 H! I! t
5 g2 V6 n* Z# z" p9 a& Y        hEdma = edma3init(0,&result);# s2 m) G, a: w4 }: e- ^
        if(hEdma): M. e8 X! M' U. l4 J
        {: O' g7 _# F! b+ Q5 v
                print2arm("edma3init() Passed.",0);' t' i; ]# c( l4 c
        }
& r4 U) F2 r# x2 K/ a% b7 N- K        else
) d* X3 F: \: _4 G+ ]        {; i: t* _1 L0 w
                print2arm("edma3init() Failed.",0);& B$ E" H2 W' g! I
        }3 _6 a# T  b: n2 R
        / X0 |1 z; E+ Q# \+ a
        if (result == EDMA3_DRV_SOK)
0 I) c) y$ X4 U/ l    {
( f# T8 T/ f9 c5 A/ b                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,9 J5 y- N" Y6 K6 E. Y: |
                                                       (EDMA3_RM_EventQueue)0,% B' o0 \4 ]6 |( }/ v
                                                            &edma3_isr, NULL);* |8 c& t& X# D6 n
    }5 l" b5 U8 y: K0 G* q
        , P9 h+ m: s, I1 |9 o
        if(result == EDMA3_DRV_SOK)+ e/ Q9 M; ~- q0 d9 z" K3 p8 W2 M2 p
        {( l! I% b9 n. Y5 e# [0 H! r! C
                paramSet.srcBIdx    = 0;
/ f# }( w8 {: V$ m                paramSet.destBIdx   = 1;
, l% u# _. N( e, l. V: ], C                paramSet.srcCIdx    = 0;+ D1 ]# m, _- M
                paramSet.destCIdx   = 0;
4 B; A: b$ J# \                paramSet.aCnt       = PING_PONG_ACNT;" G/ I. X8 Z4 Q- X# o
                paramSet.bCnt       = PING_PONG_BCNT;3 F2 f0 o: f) _! z: u1 `4 s( @4 x
                paramSet.cCnt       = PING_PONG_CCNT;, Z. l* n! k: }3 L4 W! f
               
0 ]- q" }( n3 ?6 U' e) L8 Q, j                /* For AB-synchronized transfers, BCNTRLD is not used. */9 ?3 ]3 g+ {" {% t, i! e3 F7 W
                paramSet.bCntReload = PING_PONG_BCNT;
1 S" u0 \5 |/ B$ W/ Q# y/ I
. I$ `8 C7 X% R* F7 t9 \! w) L                /* Src in constant mode Dest in INCR modes */
6 V1 G9 }: [, u7 t0 P( {                paramSet.opt &= 0xFFFFFFFDu;& z/ [4 j8 `. N0 V0 ?( c) m
                //paramSet.opt &= 0xFFFFFFFCu;. \) q9 l% d; w. M  L* n
               
: B7 W* E: t- b) [/ A/ l( w9 D" Q                /* Program the TCC */" ~7 w- `. ~3 W
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
& t0 r( P; W* w( n9 N5 q! F8 l8 X5 n4 c0 d3 ?3 r
                /* Enable Intermediate & Final transfer completion interrupt */  t  l. G0 H- u
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
9 H8 y! h( C& A, o% u" h( B7 ]                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
7 d/ r3 m: A; E0 f$ Y/ ]- |- B5 y# I& W
                /* AB Sync Transfer Mode */
) _3 o0 D1 P' R, C                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
% l# ?( X; O# T7 _9 o4 Q4 e: n  c               
% \8 v3 ?8 i5 U/ S7 t- w2 ?                /* Program the source and dest addresses for master DMA channel */' Z& g, X- q/ f) ~) b4 n) d- l
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);0 z6 I% |8 \' m: N! M: M0 N
                paramSet.destAddr   = (uint32_t)(ping_buffer);- I' h  T: i4 }/ J% E( H# E( g6 C9 K5 N
- I" _* H; E) T; ?
                /* Write to the master DMA channel first. */
, ~: e* |* Y% A! y) u/ x: V' z                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);2 |9 X  P# Q8 G# X
    }      
( }5 S# `0 }4 S6 N2 p6 i- ]9 ^8 q
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
7 ?5 |8 I, t, _' ~0 \8 e        & u, A& y/ M# Q" t" {4 M
    if(result == EDMA3_DRV_SOK)
& b& G- f6 W9 }6 E5 @% F    {
! |: f! V$ [! c9 a# ]            print2arm("edma3 driver init success.",0);( V+ S5 ?5 P; h/ O6 Q1 g- t! L9 v
    }
, y, {7 v! j( N* B& k- k3 }/ k}0 m% p4 m- V$ G1 x

/ t# Y3 k) r, i, k& X- t
! Y1 V3 Z! i& c6 K# H) W( yEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
6 v/ [/ b7 [5 X
" t& b7 T4 e* a' ^5 G& _- J2 `: [7 u! F: h3 v

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
7 C9 t) q1 W! r9 k9 N每次DMA传输完成后都要再次使能传输

+ ~( ~/ F4 m' t5 f/ E6 [原来是这样,我明天去试试,谢谢了!




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