嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:: @1 `0 F2 ]3 y; v  t
#define  PING_PONG_ACNT          1
5 l) l+ z: q7 W  j2 q  k#define  PING_PONG_BCNT          8*32*40
/ m4 s- \9 ?& s. s, Q//#define  PING_PONG_BCNT       1
% B0 I% P3 S& s#define  PING_PONG_CCNT          1- O) G" e* W, n2 e# R% }5 V
#define  MCASP_BASEADDR          0x01D00000  A$ E. }! [' g) J3 {
#define  Mcasp_RXEVENTQUE        (0u); c: ?0 D: v7 A7 N( Z
* F$ \3 I. C4 m, a1 K$ n1 J
/* OPT Field specific defines */$ s  F5 K' m  @* _; b2 t- l; Z
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
) `% v* i5 C3 a/ I5 K) d#define OPT_TCC_MASK                        (0x0003F000u)* j) j! q" x$ y8 P6 ?
#define OPT_TCC_SHIFT                       (0x0000000Cu)
% L% V7 ]3 T- |: k5 b: o% n#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
: @' s9 c0 q3 A; t#define OPT_TCINTEN_SHIFT                   (0x00000014u)
8 r6 B: f/ K: s2 V: X$ U/ }) @) E/ D5 J% W) y
char ping_buffer[PING_PONG_BCNT];4 w4 `+ J" J  J/ J
char pong_buffer[PING_PONG_BCNT];; K+ S9 Q3 _* `7 x" v5 B

. }9 Z" e$ v0 Z  V% P) y* k7 j$ U. u# g3 c- Y; _4 ?$ B( ~
6 f3 X6 J, H- i1 a$ I- z) u3 y
, t, `1 g! ?( i7 j/ ~) Y! u+ N1 B
static void ys_edma3_init()0 {* G, _& F5 T1 A. {
{
/ t* g- {. D& u7 X        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
# ?% z% |& d" Q5 @' _6 s- X        EDMA3_DRV_Result result = EDMA3_DRV_SOK;4 f$ G4 N* Z1 W) ]: z% O
        EDMA3_DRV_Handle hEdma;
' n2 t# k2 u2 U+ C    uint32_t chId   = 0;
6 |: b& C( e: e' T" e6 i0 }    uint32_t tcc    = 0;8 l7 H" B- R, L0 H+ L5 [

/ o* W& q, p" P- m! ~9 C3 m    print2arm("edma3 driver init...",0);% I' U- e9 k, m
+ L/ Z# a3 t6 h7 d1 p8 F
        hEdma = edma3init(0,&result);
# ^! q3 s: {$ N4 f  R! i1 ^& T        if(hEdma)
1 d- T# Q4 P* f  [3 W+ q        {9 K  f9 P  T' \& X) J
                print2arm("edma3init() Passed.",0);6 E2 l6 Y6 h* L8 x
        }5 \: |2 O9 Q( r4 I, Q! _  F% b
        else
! V$ {! C! g, u/ b" O8 `1 i) Q1 l        {
0 x2 w( T# F- L2 D) a                print2arm("edma3init() Failed.",0);
" l; Z+ D6 K# h1 M3 r+ n        }
$ W) r! n% q; Z5 T2 o. y       
+ l4 R" k2 m) [' q( x! _        if (result == EDMA3_DRV_SOK), I7 B0 ~9 ^' U3 [7 W: I" c" n' Y0 D
    {
) \. [, P* l5 B( F( S                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
9 Y8 F# p/ M0 N                                                       (EDMA3_RM_EventQueue)0,- w& L9 n3 O7 }* o. J' W
                                                            &edma3_isr, NULL);
- ^/ p% G9 l" f, z( o) d7 g    }
( @1 K! B& \) H5 U3 a* K       
7 Z& G& {  r8 d3 |) |8 |0 [; V        if(result == EDMA3_DRV_SOK)
" u' I  S7 [" ^, W1 C        {
: D! I# t( E- ?                paramSet.srcBIdx    = 0;/ y* O; G: m: a! f4 Y2 U- Q
                paramSet.destBIdx   = 1;0 Z: P* ~, E0 t& m4 V! u
                paramSet.srcCIdx    = 0;6 Q: @0 y& s% V- u$ ?* v
                paramSet.destCIdx   = 0;
2 ], d. L+ d4 x$ M                paramSet.aCnt       = PING_PONG_ACNT;( ^# [+ ?; Z2 P% N$ m4 A$ D  c
                paramSet.bCnt       = PING_PONG_BCNT;5 F1 `# F  O) e: z: H  O! O( J
                paramSet.cCnt       = PING_PONG_CCNT;' [4 H' `2 k6 k" R) d; D
                ( c% l- O# l( J1 \
                /* For AB-synchronized transfers, BCNTRLD is not used. */
- F! N. d! Y' }8 y                paramSet.bCntReload = PING_PONG_BCNT;
) @( F5 j: j$ R1 H- k( z; {' S& o9 C* j! ^
                /* Src in constant mode Dest in INCR modes */4 ^# T+ m4 u- t- n) j) @
                paramSet.opt &= 0xFFFFFFFDu;3 e/ I# G' G% ]# Y- y  J
                //paramSet.opt &= 0xFFFFFFFCu;
* m1 W. |$ i" P# ^! {               
* }0 `. d% D, z9 w: K                /* Program the TCC */" \0 F& d3 U  N$ \' ]
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
; b, L' L! X* {( p% Q6 B* V- G# V8 ]: L2 V1 V' M
                /* Enable Intermediate & Final transfer completion interrupt */
% Y) F% A" C; P  t5 l( r, h6 Z                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
4 ]# H. q  n& W. \8 I0 I7 l                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
7 M& @0 v3 k& \% w+ l* B  k2 ]- g2 C8 v
( ~! g1 [! Q& P9 B: r) n                /* AB Sync Transfer Mode */
  P% X+ V: W" R                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);' B8 C4 Z8 {4 c7 Q! t9 M  N! V
               
6 @* ~! w+ P' i1 m                /* Program the source and dest addresses for master DMA channel */
5 B! R% u) P2 K; }                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);( z: b. z8 o3 l7 h# C7 U  V, A
                paramSet.destAddr   = (uint32_t)(ping_buffer);. Y2 ?, V0 T+ Z
  W. P9 E; ]4 B' G6 M' G3 k
                /* Write to the master DMA channel first. */
% y7 @) p3 q  f8 I                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
+ P5 e" w% Z' A5 ^    }      
% }# _4 N0 K/ T
  o2 c0 ~% Z! k# m8 V- F        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);$ w  k/ Z: J+ Q5 b
        * O" P" w- S( v
    if(result == EDMA3_DRV_SOK) ; f% k1 O3 _7 P4 d
    {# J- h( D9 K; r, {+ x' V/ v$ J- q. `
            print2arm("edma3 driver init success.",0);# J6 [  e! c/ l4 h1 n
    }
/ W* R0 g' V" w, I- X. P9 N3 g, ^}
: M/ x, G" T; w, W( B0 ^! T+ Y+ \& a) `4 I8 f

$ T. T- _) i- t5 ~7 lEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
( M% u" e. i- y! w5 L$ X8 b
! X" z- k5 m8 q2 |# F/ Z) O) A" c. j0 D2 g; N" _

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47* }2 d2 i! M9 x3 p, Q0 t( A
每次DMA传输完成后都要再次使能传输
3 m2 u8 o3 m8 A' f& z0 J; {5 `2 t8 ~
原来是这样,我明天去试试,谢谢了!




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