嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:: |# ^" n2 \; P7 N9 `! x8 I* r
#define  PING_PONG_ACNT          1
/ s5 k, l0 G$ d#define  PING_PONG_BCNT          8*32*40 4 s  Q6 r0 d( M' _1 V6 m. q, t
//#define  PING_PONG_BCNT       1
9 O  g2 m( D( Z! [7 ^6 z#define  PING_PONG_CCNT          16 q7 i7 e% ~; D. z1 l
#define  MCASP_BASEADDR          0x01D00000& p; q0 V5 Z2 n+ c# X5 H
#define  Mcasp_RXEVENTQUE        (0u)
$ i* F; C4 J! ]* C' }. L% }. a
; J- v9 {/ g" O6 W& V/* OPT Field specific defines */
  z8 L8 U# U- {* H% U( l#define OPT_SYNCDIM_SHIFT                   (0x00000002u)0 d, G1 F* ^6 T  n( _
#define OPT_TCC_MASK                        (0x0003F000u)
' _+ N8 j; h1 l#define OPT_TCC_SHIFT                       (0x0000000Cu)/ J' E* P2 r. B$ x' A" Y1 a
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
5 x! G  {, d" m" T#define OPT_TCINTEN_SHIFT                   (0x00000014u): B) l6 d0 |( `1 k# P4 h; @
/ S# h* r; Y- {1 k
char ping_buffer[PING_PONG_BCNT];
' z) N. j4 y6 F4 Nchar pong_buffer[PING_PONG_BCNT];; d: r( r) O  H, y

& p( {; N" F6 P& C
' x- a% f( |2 U) k' t) {  }7 Q5 Q! {) h6 u

& u* e5 [6 a1 P% dstatic void ys_edma3_init(): S/ o' v4 N: [' i; E
{
1 _" G+ F# T( w% w0 E* \) m        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
2 t4 r3 ?7 ?) B% a8 P: G+ F( C        EDMA3_DRV_Result result = EDMA3_DRV_SOK;$ g$ P( D/ W4 {8 J1 |+ F! i
        EDMA3_DRV_Handle hEdma;
  M1 J" y2 V" `3 u& @! p    uint32_t chId   = 0;
; B& n9 _1 ~% P/ }* f2 _    uint32_t tcc    = 0;) E' j  M) @! @1 T1 i2 V
. u2 y  t/ B$ k6 u( T
    print2arm("edma3 driver init...",0);" H! k# _. W4 `7 n

; }) o2 V$ K6 \$ r4 Y+ p        hEdma = edma3init(0,&result);
% S1 v( x" X6 n$ q9 v8 ?, B        if(hEdma)
4 m5 ^7 ~. b- U: S5 n3 z        {: o& U  |" {) E! s1 o  e+ g+ x
                print2arm("edma3init() Passed.",0);
5 z$ N. L4 O, T8 h        }
- |0 [% d; P9 |/ b, {( D7 V        else
9 e* T+ g/ `$ a( r        {
* D& n0 v: C( {- L+ n                print2arm("edma3init() Failed.",0);
- a$ |6 b  [/ @1 d' n4 Z        }( [6 M/ e7 E, A% L9 L
        2 V- g4 D( m3 X
        if (result == EDMA3_DRV_SOK)7 N. p: c! Y9 u, J" E
    {
' b; ~# N) b4 ]+ }                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,7 H' v/ O2 ?4 y
                                                       (EDMA3_RM_EventQueue)0,
5 J: i9 p9 d" W( m- i                                                            &edma3_isr, NULL);" S* t, M" f/ W' `3 Q
    }
8 D% B. n  }/ ^# n        # B" M$ \: _7 v+ q. r
        if(result == EDMA3_DRV_SOK)
5 T! E8 ~- u1 s' Y4 {2 ~$ w- T- [5 ^        {* y# C- E) N* m" e& C
                paramSet.srcBIdx    = 0;' n9 Y6 a# K1 O+ Y: C- `7 t. ]2 W
                paramSet.destBIdx   = 1;
  I# E& `! j3 Z                paramSet.srcCIdx    = 0;
2 a- u1 o, R' T                paramSet.destCIdx   = 0;& k8 C- m2 F8 n* k5 j- ]
                paramSet.aCnt       = PING_PONG_ACNT;
; O- _5 }2 J8 s0 W8 d8 y. t                paramSet.bCnt       = PING_PONG_BCNT;
+ S0 q; [% V  [% j                paramSet.cCnt       = PING_PONG_CCNT;
1 R, @+ M8 w1 p" }               
0 j2 c" g# U( t4 E) e7 T- b                /* For AB-synchronized transfers, BCNTRLD is not used. */1 T. l( K; n6 E7 X+ }% g! x
                paramSet.bCntReload = PING_PONG_BCNT;
/ X% Z* V+ t9 Z' c
. M9 G" }, U" ]( c" w/ o9 [8 ]                /* Src in constant mode Dest in INCR modes */) ]) \* e0 B& p/ G( D
                paramSet.opt &= 0xFFFFFFFDu;
& K6 m. J2 c- ?) M+ }                //paramSet.opt &= 0xFFFFFFFCu;1 ~% r3 L) f5 d! {& `4 G6 X3 `
                0 n" I' m9 M! X# G! [
                /* Program the TCC */- U. {; n: G: F
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);. O. a% b- g4 f

7 g8 a: L* s2 \; V& R( K                /* Enable Intermediate & Final transfer completion interrupt */
7 G$ X9 E7 I) z8 H! j                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
; L! I3 ~- m" @# b! t1 j8 z                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);9 j+ ~! b( }* |$ O. v

5 Y" t$ r& K; {% S6 k1 e' r2 |+ U                /* AB Sync Transfer Mode */
: y8 A2 B% `8 ~% e6 ^                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
9 k/ ^5 b7 Q. m) K9 d( `  m# f$ F               
  U, v9 b" d! Z4 y) ^# N+ }                /* Program the source and dest addresses for master DMA channel */; N$ q5 z. ]0 z* t9 C% W" i
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);! S& ~/ b6 D& K8 @6 A" h
                paramSet.destAddr   = (uint32_t)(ping_buffer);
/ A5 z! F; b# W* k4 v, o- z4 p! F. G4 u( ]9 q$ [( {
                /* Write to the master DMA channel first. */8 {& i1 b1 p# L' P, @
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
9 m6 J) e5 L8 z    }       " f4 W, z$ A) u! o! F

# F: f! {( ]# L2 L! Q( ?( h0 [2 y9 d        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);5 E4 o, q# ]0 A0 n$ C0 b# D
       
, R  P: ~- r/ M' d2 _* D    if(result == EDMA3_DRV_SOK)
" U3 S% N2 g! i9 }0 |+ S    {' y% T5 G) ^( m8 Z; z) ~0 p9 Y9 ~
            print2arm("edma3 driver init success.",0);. _9 n7 Y+ ^4 g
    } 8 G1 L1 z, B* g  X
}
: P8 k& ]  O9 a- Q6 r: p- Y0 P8 `/ ~! x7 S0 K8 I

$ n0 Q* v9 t3 l4 }9 }EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
( c+ j( S9 V& ^* d( C* q( w
$ }9 v; j3 K' r" n: |
, l: h/ V% A& F. \
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47) N9 A( a+ ?4 K2 n+ L. F: E
每次DMA传输完成后都要再次使能传输

) j3 C! j2 U$ O' z  n# l原来是这样,我明天去试试,谢谢了!




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