嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:. Y5 U6 e  c. s5 y2 _
#define  PING_PONG_ACNT          18 D, }, G1 X- Y- F( r
#define  PING_PONG_BCNT          8*32*40 # @. v# R/ }( \! X& V
//#define  PING_PONG_BCNT       1 9 t: `4 z6 q4 a0 j4 G; p( J
#define  PING_PONG_CCNT          1
( _: c$ h6 x# e, i4 r#define  MCASP_BASEADDR          0x01D00000
& O3 m2 A8 `2 Y4 X* w+ v& N( j9 @#define  Mcasp_RXEVENTQUE        (0u)# q/ j1 @) X3 z% p. y6 x) Q" p

9 s+ k+ u1 j9 \6 h1 @6 S( H8 g; H/* OPT Field specific defines */1 Z# W+ M9 T8 j
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
3 S: ?) x% r1 S2 B$ G: B8 v; n$ v( r#define OPT_TCC_MASK                        (0x0003F000u)% q/ p6 l2 {$ @& E8 z8 W5 b
#define OPT_TCC_SHIFT                       (0x0000000Cu)
# y, J, @4 i( G& y#define OPT_ITCINTEN_SHIFT                  (0x00000015u): K0 ^2 m7 ?& _+ k# n: M- z
#define OPT_TCINTEN_SHIFT                   (0x00000014u)$ s3 F7 Z1 i) P# j
' \; w) X2 J( v
char ping_buffer[PING_PONG_BCNT];: n* x- E: c6 J3 @/ {6 ~
char pong_buffer[PING_PONG_BCNT];
  y5 \  s- S. w& T  [! L/ b
3 v- w! }2 J  D* |6 T' G( ?0 A4 v5 z# v0 V* J- r

6 @4 f8 T# M) k/ o' ~' c/ n3 U& D$ V  E: p" r9 |
static void ys_edma3_init()
. s& e7 u# Q1 q) J" ~9 X{
4 x/ z: O4 ]" F7 U; ?' T        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};' a( f4 p  P, x: n+ X0 o- L: j4 G
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
% u4 G! W3 e6 q* d$ `        EDMA3_DRV_Handle hEdma;3 Y& A% Z- E7 w9 Z8 y; C$ T
    uint32_t chId   = 0;. _7 U$ H4 ?) e3 @1 X8 y
    uint32_t tcc    = 0;$ x. N$ o2 w( A" F5 l, q0 t

" T% m* I. x# K+ S6 d( u+ W7 v    print2arm("edma3 driver init...",0);
* Q1 k6 u4 i6 k9 E# Z' y9 I4 G( l+ s, ~$ A
        hEdma = edma3init(0,&result);
4 n) t9 [. ~* G  R        if(hEdma)
% {% t; n/ H% J2 ?        {5 w! F" ?# d& E; O, H& l8 D! j1 ?
                print2arm("edma3init() Passed.",0);
  l% b2 g! X- Q: Q, m+ k        }
$ D7 r: {# X9 u* D- q- Y        else5 ]+ u8 C. ~- r. w  E0 w: h
        {" p( p/ g6 e, i1 C- u
                print2arm("edma3init() Failed.",0);( I' X  [" j8 L) P- b; R0 C. i4 r
        }
; ]( f' A; Y" V        8 i! _# w9 X  U8 ~4 p
        if (result == EDMA3_DRV_SOK)' F4 y6 F4 Y  K
    {# O5 j5 Z3 J  ?# Y/ R" R+ m
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,$ h, b' G6 J3 r( f
                                                       (EDMA3_RM_EventQueue)0,# k+ ~0 p7 X" D) p  {
                                                            &edma3_isr, NULL);
; Y) w& \- u& H' r4 \    }
$ \. {' F: x4 l        - {; [% G/ Z' V( a* E3 n
        if(result == EDMA3_DRV_SOK); {: [- u* z: Y% ?1 b- C
        {: h  a4 s; G; l/ V. _. v
                paramSet.srcBIdx    = 0;
5 C3 z8 t; H* r+ C# B/ o8 w. K                paramSet.destBIdx   = 1;
6 j6 a+ ^( f1 ^7 h/ M0 D                paramSet.srcCIdx    = 0;' _" P* g3 M* U
                paramSet.destCIdx   = 0;& x% f4 J+ u% T) o
                paramSet.aCnt       = PING_PONG_ACNT;. c4 y' t+ _8 D0 |
                paramSet.bCnt       = PING_PONG_BCNT;
& K! f4 x/ `- L+ g, e7 _, H' r& k                paramSet.cCnt       = PING_PONG_CCNT;
  V' A  I! {2 {2 o) K5 T                9 I& U% Y4 m& C7 m# N* w
                /* For AB-synchronized transfers, BCNTRLD is not used. */
5 z, E# U1 y' e. d' ^                paramSet.bCntReload = PING_PONG_BCNT;
% J8 M" v8 L) m) u
; j7 D, \, n7 |) s. _, W5 O                /* Src in constant mode Dest in INCR modes */$ ~- @2 V  t- S
                paramSet.opt &= 0xFFFFFFFDu;
; a  v- A" F! Y+ U: b$ o+ C: U                //paramSet.opt &= 0xFFFFFFFCu;
) _: a, _: ?/ H( ~1 b3 K5 Y               
* T" l3 S9 K, X& {/ e                /* Program the TCC */( n3 p/ }' d' |5 I3 b
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
9 F& S# v6 o0 r  a3 U# N
6 K8 d! j; g3 A; T# l6 C; {  Z- |                /* Enable Intermediate & Final transfer completion interrupt */0 U- O# _3 ]' I) l2 x
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);5 \' d; z' f; j& l
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
8 ~  U# |4 z% Y% h' j3 H4 q. Y5 I4 T0 k( |0 x5 T& `/ l
                /* AB Sync Transfer Mode */
$ B! K$ K& P3 r9 r6 H                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
6 o9 A! E8 n% a7 D* h% U               
& Q: e5 ]# N) e' i( U. K                /* Program the source and dest addresses for master DMA channel */" O* U: X- g- i& B
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
1 a  w3 `% D" _* \. O                paramSet.destAddr   = (uint32_t)(ping_buffer);7 f+ @/ \$ a- @! F

/ P) }! R6 e2 n) H4 [                /* Write to the master DMA channel first. */
4 k% b% A2 q6 B9 Y# s                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);! s, L- F  `) P% J/ z
    }       " r/ W( j- t9 M0 @
3 R2 W* g" X8 U6 F1 l. y
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
4 S: q6 q; i; t: f: b) Z, p# j       
  L6 A( k/ r# q, M' ?" Y    if(result == EDMA3_DRV_SOK) 8 u. G( [+ U: o/ |! l  k5 H
    {
; k3 X- G. n+ u) Y            print2arm("edma3 driver init success.",0);% X" _6 z  d- ?5 W' g3 [
    } % H5 @/ T+ n6 [5 {4 Z1 m8 _* p; F
}( H/ ~3 w1 G" g# s: o  j# F
* y/ b# I5 n' I1 C" O4 L( h/ F+ H
2 p' U; S& Q: L7 k
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
6 `2 d: {9 x  }# ?, H
' h* N6 Q( Q0 ~0 u
( D: `3 s6 i; n! P
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
- l  E: g& u7 A: a- O每次DMA传输完成后都要再次使能传输
: \9 M; a$ f4 s/ K
原来是这样,我明天去试试,谢谢了!




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