嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
- t3 h+ }8 M! B. M8 U: K: U6 `#define  PING_PONG_ACNT          1
. |7 j* E# N: {4 r; |. z#define  PING_PONG_BCNT          8*32*40 6 R' t& Z7 U* X! P
//#define  PING_PONG_BCNT       1 7 N9 H( P' a  {
#define  PING_PONG_CCNT          1) ^* \& ~; ^  K! L
#define  MCASP_BASEADDR          0x01D00000: O/ H4 M4 _8 V& R1 C$ Z+ v* O5 S' f
#define  Mcasp_RXEVENTQUE        (0u)" y) z8 v' n, N% z4 z

# |) Z! O! A  w4 M8 [, r/* OPT Field specific defines */
6 p' ^1 f' B- K6 n9 n( D+ ^#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
% l, ?! |8 k5 Q. y1 t8 \#define OPT_TCC_MASK                        (0x0003F000u)
( @4 Y: p1 a- G#define OPT_TCC_SHIFT                       (0x0000000Cu)5 Y% y6 U3 M6 ]3 I
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
, {. p1 R) i( x9 r#define OPT_TCINTEN_SHIFT                   (0x00000014u)
- ^8 u1 S9 P, N5 B
# ^3 O% |1 {2 P1 H, \char ping_buffer[PING_PONG_BCNT];
0 N2 d7 ]# K' m  l$ w: L/ nchar pong_buffer[PING_PONG_BCNT];, {* O: d# Z+ u9 j0 G. a
1 E7 Z: i% T7 I) V& c3 d9 n" W
9 i( p; c- T# A. Y0 C; @8 G
4 i9 Y) z: `) }( k0 ^
: U  v" e2 I' v- Z
static void ys_edma3_init()
: k9 j  l) K8 H{
/ ?4 n7 k/ h+ y$ `        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
4 S0 g+ P3 ~* ?/ Q1 Y7 I. @        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
' n" f. a8 \' i' V        EDMA3_DRV_Handle hEdma;* ]" c2 ]  q+ a
    uint32_t chId   = 0;
1 S8 ~( V$ o6 `+ u( i6 W) R- v' p" Y    uint32_t tcc    = 0;8 f3 }" S  D: z0 K/ n# T% t
) E* [4 U7 q  |' \5 M/ n
    print2arm("edma3 driver init...",0);- y% |* e8 o" f) b

& F7 y5 G0 `- B9 Y  C, c6 u        hEdma = edma3init(0,&result);/ x; u: Y; B: G9 k& M, g" K6 o* D
        if(hEdma)
$ x% i2 H) E! l! y$ b( |        {
3 t) d; H4 A  L                print2arm("edma3init() Passed.",0);4 q' l6 Z+ X  t5 \6 V: z" `
        }
  w+ s3 B( _# Y* f1 H  Q! K        else8 M1 o- v4 f' q+ T' p
        {
) ?) Z% s6 }% v- Z( O                print2arm("edma3init() Failed.",0);
: S! H1 B7 ?* R! E        }# ?- a2 e: B, [. y1 t# Q2 I8 c
       
7 R5 e& U8 J0 R* ?$ }4 z        if (result == EDMA3_DRV_SOK)2 Q! q& A. o; O% \, D0 l$ B/ ]
    {
- a( V/ s: \3 L2 N6 b* y                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,/ ]% b( {3 D+ }' X
                                                       (EDMA3_RM_EventQueue)0,
( Q" S4 {: a; q5 A, a- J7 p                                                            &edma3_isr, NULL);
" }* v$ w( R. k; K" R    }
9 D: G. s9 t6 Q, a* K0 x       
! I5 s& {# m; l. p$ Q' K: e        if(result == EDMA3_DRV_SOK)
; N$ C/ `- J' y2 a2 T- r7 x# L4 u        {
* O( D% _" ?3 h  J4 p1 m                paramSet.srcBIdx    = 0;
# `* X$ Z9 h! c% T                paramSet.destBIdx   = 1;& N% B4 j9 G1 @" z) d
                paramSet.srcCIdx    = 0;
1 i2 G- Q! j6 k$ R+ A) N4 B. x                paramSet.destCIdx   = 0;- ^9 p5 I9 ]. v; v  J( t
                paramSet.aCnt       = PING_PONG_ACNT;# e; E& h2 d2 k3 }& P* f  t# Q
                paramSet.bCnt       = PING_PONG_BCNT;4 t& e* V4 r) ?- U" W; R2 H# j2 q
                paramSet.cCnt       = PING_PONG_CCNT;; I' @8 n. f9 U3 K% O
                7 M1 k4 D) i- Q& W3 u: j6 p
                /* For AB-synchronized transfers, BCNTRLD is not used. */. o6 P. ?8 V! g7 B6 o
                paramSet.bCntReload = PING_PONG_BCNT;! W+ v7 X8 R  h( X5 d& E
1 t6 B" ]% n; `4 D8 U. w
                /* Src in constant mode Dest in INCR modes */+ }* P* U4 X6 ?5 w/ c% c( S( l
                paramSet.opt &= 0xFFFFFFFDu;
$ @* M/ |, L6 r* u7 ]                //paramSet.opt &= 0xFFFFFFFCu;3 Y* ^# b# Q/ V" L" V; O4 B# d
               
% t) M7 A" \$ P" T                /* Program the TCC */8 l( G- I! U0 ]
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
( Y$ \6 Z5 R$ J. G/ i  E; u9 g; N, ~3 j, c4 `- U
                /* Enable Intermediate & Final transfer completion interrupt */% f. i2 X; y4 K  D9 U& A
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);( [( e, }' }* F$ K
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);: t* \6 x# ]% [; R
+ K+ H' a" }  F& t4 F2 C  \: }
                /* AB Sync Transfer Mode */) @  n8 j& J' _. q5 a- [6 p" r
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);2 E9 {7 ?+ T; v
                9 G- r% U  J3 m, o2 l9 U! N
                /* Program the source and dest addresses for master DMA channel */
/ ~0 y6 Q! n8 k7 d' {' b" Y                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);6 q$ \5 x1 I. _* ~1 N
                paramSet.destAddr   = (uint32_t)(ping_buffer);
2 C! p; ^. _0 G( W( d8 t2 `% d1 _. O  d  I: D$ W
                /* Write to the master DMA channel first. *// E* h% e$ x; c5 n. I% x
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
! k& N: E1 K# p    }      
" {8 X; J. A( ]( o# R1 A' O7 X7 l$ i) y
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
: E/ X- k) Z& ?        9 _7 N* h/ {; S. H2 B  C
    if(result == EDMA3_DRV_SOK) , m. h1 c/ u; U0 g- R6 M! a
    {
2 F1 o! l3 C: d9 y4 V, [# k0 G            print2arm("edma3 driver init success.",0);
* z6 Q5 j( V1 o/ {8 s# u6 O$ |1 W    } ; m. w$ S. ?: z/ u6 ~+ _
}& G/ w. Y+ }; X' d- M
1 T, F6 l* _: o- `3 M) v1 f/ Z9 m

& q& v& `( w  _; D4 N1 cEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。/ u+ `0 K5 [, m
+ b" N! b. v% j6 f# {0 W7 _8 K
+ K6 h3 m0 ?; E( o: H+ e  K3 g

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47* E' p/ T  a1 s! M; b; a' I
每次DMA传输完成后都要再次使能传输
0 S* k2 o' ]. k9 R6 O7 x
原来是这样,我明天去试试,谢谢了!




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