嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
/ G3 R5 `: u2 W6 H#define  PING_PONG_ACNT          13 ]4 R% J# w4 W9 G1 ~, Y
#define  PING_PONG_BCNT          8*32*40 - p) `/ n% Q; V/ }# e  k' k
//#define  PING_PONG_BCNT       1 * x) T( ~0 A8 y: b
#define  PING_PONG_CCNT          1
7 ^! n/ s" o/ _6 f( ?5 X9 R5 |#define  MCASP_BASEADDR          0x01D00000% u2 i7 r0 z1 c& Z0 M
#define  Mcasp_RXEVENTQUE        (0u)4 K. x6 ?& ?7 g

. C7 H7 _' E$ R7 Z. p: m4 f; V/* OPT Field specific defines */
  V7 r+ U1 a* o4 l$ n# h4 H#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
4 {/ t' ]' V( d3 U, a#define OPT_TCC_MASK                        (0x0003F000u)
( K7 k+ @9 y. L# f# V3 e  k#define OPT_TCC_SHIFT                       (0x0000000Cu)& [4 w- i  p$ B; r' c+ ~
#define OPT_ITCINTEN_SHIFT                  (0x00000015u), e# c% `3 G$ s: H, O# a$ Q
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
/ Y# ]7 O9 `1 C+ E% C2 m5 U/ D+ X& K5 ^: P! l* O) _
char ping_buffer[PING_PONG_BCNT];
1 |5 E" M1 @! r7 `+ \4 U- m, A/ Vchar pong_buffer[PING_PONG_BCNT];
7 o2 |: n+ f. K$ H" Q# h
6 F, F" @/ |! |- s! P% l( |8 D: j. k; z4 m& W0 ~  A! }; g
/ o0 o9 F, \- z( C# C, e# S' Q
" A8 p! T9 k5 m, c+ V9 O
static void ys_edma3_init()
) N+ ?' X; O8 h9 B  n6 u! B{
- G4 s% d3 N5 H# \        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};3 F1 a1 ]) B" E% {1 S- u
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;1 y3 H$ A/ F! w1 l
        EDMA3_DRV_Handle hEdma;
: g$ J- }" W/ \( q8 ?& l+ e    uint32_t chId   = 0;
' b7 }0 m: T* S' _' ~% p4 F, Z    uint32_t tcc    = 0;- w' `. T2 b6 t3 z

6 U* N) A2 _, B3 c: K7 r    print2arm("edma3 driver init...",0);
) ~5 u! j! l3 s8 X7 f# h7 t3 B- \2 K
! \  K! H  g% ^+ b- r$ X        hEdma = edma3init(0,&result);7 \+ {$ U, w1 A' L2 z2 |
        if(hEdma)8 @% z  Q7 {7 u  e
        {+ S" S3 y) k; M4 D; ?, B
                print2arm("edma3init() Passed.",0);/ Q/ @: |; b7 q2 l/ n8 s; ^
        }
7 h; k& V7 Y" C9 b6 s; }( J        else
, j% p1 h9 r* v        {: ?' e+ g9 ?2 e2 G0 N2 M5 T
                print2arm("edma3init() Failed.",0);
" P. Y! T' D) z1 B! Y9 C+ R  S        }
7 Z" v4 h: |  x/ E8 r        * c8 K6 X  J+ M5 e5 M
        if (result == EDMA3_DRV_SOK)
2 e0 S# |% U/ c# [) q8 m) x    {
! O  j8 |+ }" E% g                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,. T/ ?" d$ s0 ~4 X$ x3 A- C1 L/ y
                                                       (EDMA3_RM_EventQueue)0,
1 e1 u- b" V) M; d& p                                                            &edma3_isr, NULL);
8 z" G9 Z7 W) b' }* @1 j    }
) i5 z' j) I2 u: p% r! O( g       
1 _" m4 t+ m" ^+ M& P0 ?' [! {        if(result == EDMA3_DRV_SOK)
( D5 O& w" n' b+ s        {
) B) L9 Y# D  x6 b                paramSet.srcBIdx    = 0;! ]) U3 q5 z3 \! a5 \; }+ l  t: s; c
                paramSet.destBIdx   = 1;
- }# `9 k: B  H2 ?; w; O8 @3 z                paramSet.srcCIdx    = 0;
) D/ U" N: Q! k, e; \                paramSet.destCIdx   = 0;7 i- n3 p9 h! ]6 W, m
                paramSet.aCnt       = PING_PONG_ACNT;% q5 Q5 ~% B* {/ ]$ N+ y  u" q3 [
                paramSet.bCnt       = PING_PONG_BCNT;
- L3 n! @( q2 |* B: c, G8 V                paramSet.cCnt       = PING_PONG_CCNT;/ A7 g  O8 \: u
                  M, N" a, A4 }$ z# k0 p9 N
                /* For AB-synchronized transfers, BCNTRLD is not used. */. `, Y* Y. L3 C" T4 e7 i: H/ L" }
                paramSet.bCntReload = PING_PONG_BCNT;2 n6 N3 |4 O6 A: T
: g  P" d4 b( H# M1 Z7 t
                /* Src in constant mode Dest in INCR modes */+ L% l' \" D' \. M2 L" R; E5 A
                paramSet.opt &= 0xFFFFFFFDu;( F% [, N6 j: L0 N. k
                //paramSet.opt &= 0xFFFFFFFCu;1 ]4 D8 I# a( s8 r( ]+ H
               
( i9 s* H( i; K/ \, S2 I                /* Program the TCC */
7 V  [. [2 O. s) j) c. B# n3 b. a                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);' R4 P7 g: ?1 y% t+ M

! S( F( C9 S$ l5 }                /* Enable Intermediate & Final transfer completion interrupt */2 K% I5 v  e2 f9 n
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
4 m" b4 y! X, P" l; \" f$ a1 m                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
, e) [9 {/ Q* {9 F3 q8 @
- r) C$ i* {9 i  x7 e                /* AB Sync Transfer Mode */
" R6 [3 e4 |4 J                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
' e, S, Y/ Z: \# F. i  N' }4 m' S% J               
: g( a, K1 D# s. O) T3 ?! Q. r                /* Program the source and dest addresses for master DMA channel */' v) j: m: w. W
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
6 a8 {9 Q/ v3 f' D  E. X' M9 r5 V                paramSet.destAddr   = (uint32_t)(ping_buffer);
! |/ J% {- D! v2 i2 x6 x. t
/ U8 @* F& v: q; C% x, {: m! |                /* Write to the master DMA channel first. */
5 D; f+ p; E( C# y  ]+ y# X; M                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
0 _  X8 |# T$ j: w2 v    }      
4 S( p5 L) ?$ ?1 s% C/ ~9 ~& \; W4 K8 ^$ Q8 r
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);& \* O% y  X; p0 ^# ?; t& I: G1 t
       
; D, s1 g5 m5 r8 a    if(result == EDMA3_DRV_SOK) / n7 z6 o9 ~* F7 `/ L1 {: O0 B
    {
9 w( h" |8 q: P* G6 u            print2arm("edma3 driver init success.",0);! |3 a: J. B2 B$ G! O" p" Y9 ^3 i
    } 3 @) v: w% E/ H8 q4 ^" `4 t
}
. g' \) m3 E$ w; a4 ]
4 n+ }; k; h/ i+ p1 t
! H. O5 u% K; Z9 lEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
2 h1 u. f5 D: z0 s4 M) u. }; ?6 b0 z4 O2 Q7 i

* R1 {9 E. @5 @% n9 c
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:477 ]( @4 a9 v2 ?7 z# b' \) h
每次DMA传输完成后都要再次使能传输

3 Z& r  _+ G& o1 ]2 S! m4 A- w原来是这样,我明天去试试,谢谢了!




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