嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:% k% c# }6 O2 k* P4 O8 u$ C
#define  PING_PONG_ACNT          1) h* G) r9 f/ F: @' g, ?) W$ p  Q; V2 P% G
#define  PING_PONG_BCNT          8*32*40
; ^& U% c# M* s  `//#define  PING_PONG_BCNT       1
: o# ]" e9 m5 }( f#define  PING_PONG_CCNT          13 _/ U/ Q: b2 S$ t$ @" f
#define  MCASP_BASEADDR          0x01D00000, h$ z+ a6 K$ H
#define  Mcasp_RXEVENTQUE        (0u)
# I4 p7 |, h$ O9 A& r3 k( ?
8 c, b- c  e" ~7 N2 h& r7 d/* OPT Field specific defines */
( l) Z! I, T6 q2 `1 i#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
( \1 R5 i) B4 _, e2 j1 B#define OPT_TCC_MASK                        (0x0003F000u)( |2 @) C! q9 r7 g3 W4 [9 E
#define OPT_TCC_SHIFT                       (0x0000000Cu)
% J# p  [8 X" @3 |#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
# [# n, j3 u6 e& \4 b! H" p#define OPT_TCINTEN_SHIFT                   (0x00000014u)
) u% V* l- E4 t4 @
  O2 D8 B# Y1 c4 Achar ping_buffer[PING_PONG_BCNT];6 F% y. c5 {# {1 J& v7 @9 _
char pong_buffer[PING_PONG_BCNT];
+ y4 s, i0 [- ~7 [; e, M; ]& O
+ ^3 v, U" I+ o: i+ Q0 y  ?) n: n! r- J9 s) ^2 j3 H2 z

% c) x" }0 n5 b/ y7 z8 G9 H* x" q) O2 t* T% ~* o: _
static void ys_edma3_init()  P" l* }% }( t. v2 m6 ?
{
2 w% T2 Q* v3 `; M, [        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};0 A" E- G5 y" B2 Q
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;) p/ Y% t& r. N  z8 ]( i
        EDMA3_DRV_Handle hEdma;
9 N( }$ v6 n2 W: q! P" \/ _    uint32_t chId   = 0;' W6 h0 \* O) c' V$ e' R; J
    uint32_t tcc    = 0;
8 w! {# N# J. q+ A
3 L9 |0 l$ Y" {    print2arm("edma3 driver init...",0);
/ {$ }2 z/ Y' _7 n
7 A1 ?6 e. i- z: f        hEdma = edma3init(0,&result);2 s* b2 i" n, h, W$ _% x7 d9 g
        if(hEdma)( w6 w" p& a5 ~# N3 \% R3 N% @9 d
        {
8 ]  W- ?" o, q% E' N( u                print2arm("edma3init() Passed.",0);2 L2 ?# g: F2 c/ |: j3 c/ S# |
        }, T1 d$ {6 @7 {, z  L5 T
        else
% i( q8 Z8 O5 I% C        {
. Q( [; {2 p% J/ ^& N* b1 y                print2arm("edma3init() Failed.",0);' q. m9 M6 d: V/ n* @, c( Y
        }
% r8 I$ @  F# _+ }        6 r( W! ^3 P; E* n- ^7 H, X
        if (result == EDMA3_DRV_SOK)
9 Q) a: Y: W# ^' \! A: b. V8 y$ E    {
& h) u$ i( s. u( S0 h                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
! j3 V/ D; z* V( y/ H8 h# n6 w                                                       (EDMA3_RM_EventQueue)0,
3 ?$ B1 N" F9 [$ t' d' V9 s                                                            &edma3_isr, NULL);6 o" O8 ?- ?0 N' {6 F+ f
    }: g: ~8 L4 l# S7 K9 I, R
       
% ?$ Y7 x6 \: d  u0 W; ?! b        if(result == EDMA3_DRV_SOK)
3 ^! T9 J- M; c0 r) `* I        {" Y3 `! c) x: S! O3 x- f2 I  Q% G
                paramSet.srcBIdx    = 0;
: Y" ]. j1 G1 c$ g- f* u* {                paramSet.destBIdx   = 1;) E" [6 p4 W) Q4 p0 {) Y2 X
                paramSet.srcCIdx    = 0;
+ `$ E* [" e' J1 h                paramSet.destCIdx   = 0;
0 B1 D# [3 t* k1 E, H                paramSet.aCnt       = PING_PONG_ACNT;' X$ \9 B+ H+ J% Y# R2 |
                paramSet.bCnt       = PING_PONG_BCNT;* w8 H2 O" k: b# a
                paramSet.cCnt       = PING_PONG_CCNT;9 A, J5 d* \$ e; ?7 C5 C+ \1 L# {
               
- A7 y) a8 k. |; `                /* For AB-synchronized transfers, BCNTRLD is not used. */7 M$ N5 X1 I! Y$ r; _2 @1 E
                paramSet.bCntReload = PING_PONG_BCNT;
$ s! }! ~7 q/ y* T# V. K0 ~$ T9 \' y8 ~' y# Y! P# K/ u( L; y" x  i; I
                /* Src in constant mode Dest in INCR modes */
* o8 a5 p0 J5 Q* M, Q2 P                paramSet.opt &= 0xFFFFFFFDu;, f% ]1 F8 d6 I7 @
                //paramSet.opt &= 0xFFFFFFFCu;
+ H0 i% N0 q# l! Q               
+ y6 J+ Q  B2 ~* X. A* Z6 F; i                /* Program the TCC */
& a! z: L+ V5 ~- ]! x* c3 y5 ^1 M                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
' |: q# U' _( F, l1 U  m$ V" z* d; e
                /* Enable Intermediate & Final transfer completion interrupt */
$ J5 |  X" _) u+ v6 h4 a                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);0 S! b# u) e7 Z
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
% M! }3 N  H8 P- V1 J8 E: j1 L
6 R6 T9 K. h  r/ Y: G6 W9 f                /* AB Sync Transfer Mode */
2 ]3 ?& d: n6 I* h2 w0 \( C                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
5 ^. }' M+ F* M! e3 y0 [1 O               
! R  t0 [: u! X$ a( H3 _4 l                /* Program the source and dest addresses for master DMA channel */3 R" J) @" @. Y/ p+ D; L1 j
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);) G: i# f( @9 G! `, C4 c( l+ Q
                paramSet.destAddr   = (uint32_t)(ping_buffer);0 s( M1 r8 W( j5 B, n( k
% {6 g8 ]8 u7 B  J9 O' M
                /* Write to the master DMA channel first. */
: x. o1 w: f4 x) A1 @- ]4 S                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
  I. b9 c& Z: F* }0 ]    }      
& m8 b3 X) K" [# e  {: Y0 F* s1 h8 A* B3 ~" U. M, a& S
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);0 u+ j) M6 h9 o: L5 W
        ' y5 H, X( _3 y8 P- o! W
    if(result == EDMA3_DRV_SOK) ) A7 m- V9 m  X" y: h/ C' b
    {
  \) j; ?! Y; p            print2arm("edma3 driver init success.",0);
1 b2 d# O; Z- A+ B9 K6 [& e: x! }    }
5 T3 h6 _& k, i, W}6 G- A5 P( x! Z1 n; e
2 u8 \# n: q) W5 L* q' d
5 L* a5 m/ L2 {+ ]
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。( _0 ^* a+ ~1 T3 F
" R9 F7 M9 I% X( K1 U

1 @" s* e8 J! d4 y% }9 \# p
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47) n& S% v; w  d) K# U
每次DMA传输完成后都要再次使能传输

6 i. X8 s1 B* j. R$ i0 ~  `% b原来是这样,我明天去试试,谢谢了!




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