嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:- {$ O/ E4 c6 y8 ]. O9 c, ?: {
#define  PING_PONG_ACNT          1
6 U$ t* y: w3 C, l, z! R5 X7 }#define  PING_PONG_BCNT          8*32*40
: _8 Q0 {7 b& l. u% X2 k  y- n' d4 w//#define  PING_PONG_BCNT       1
2 s( H5 g9 P9 U# K#define  PING_PONG_CCNT          1+ B, S' q. |9 l; C: s
#define  MCASP_BASEADDR          0x01D000001 N- j1 Y. R7 p
#define  Mcasp_RXEVENTQUE        (0u)
7 Z4 c* J  I$ i& O/ x6 t! Z9 ~, S& q1 ]) Y7 Y! Q
/* OPT Field specific defines */
" B/ ^  _8 z( h. t1 f. B6 A, P* y7 z7 I#define OPT_SYNCDIM_SHIFT                   (0x00000002u)0 U# F, V* z9 u6 a
#define OPT_TCC_MASK                        (0x0003F000u)$ l& D! k; C2 N7 r9 ]
#define OPT_TCC_SHIFT                       (0x0000000Cu)2 ^4 _1 i$ E5 i5 M4 o1 a
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)/ B2 e+ n% T; y" q! H8 W( G$ }
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
$ S* f" E4 G6 i& g: A" R  K  a9 k' d6 a5 N( w
char ping_buffer[PING_PONG_BCNT];; \4 m& H- r* L% k" K
char pong_buffer[PING_PONG_BCNT];# p' Q& |& h* r' {" Y
0 j4 r0 I( C1 o9 P/ k* R

* X8 Z8 Q4 G6 S' Y( ~& ~4 E0 D- k6 g/ F1 T& W+ d

: Y8 h# g- z' e9 {4 \  E+ @2 g  j8 ^static void ys_edma3_init()% J, m- S, K: I* D
{8 ?. h' I& Z$ M/ {5 y; A3 ~
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
1 }4 k, z# s+ _        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
  j5 |7 z, p( G% k* G7 t1 [        EDMA3_DRV_Handle hEdma;* `9 a/ c. U( G; j! p) Y
    uint32_t chId   = 0;2 h* v" ^# Y8 ^. m0 y8 R+ X: b
    uint32_t tcc    = 0;' m+ P; X, V' u, U5 c: i& ?( }) ~, |
' d6 [; q/ G8 G
    print2arm("edma3 driver init...",0);3 _- \% n; e* O
7 [+ O0 \. x; G9 m
        hEdma = edma3init(0,&result);
0 @' w8 t% b, ~1 m' b9 O1 n# @( i  |        if(hEdma)# Z; A# w* E" O% X( ~
        {
' X# G8 _) l" \                print2arm("edma3init() Passed.",0);) _, j( k7 t% J
        }
  ~, y( z. E- G: z, J        else
- P# t/ J, z# n7 `) S        {
/ K) `8 M  u, \* p; `8 J: W+ Z                print2arm("edma3init() Failed.",0);* e( U$ j0 e) f2 I
        }" N; t+ O) U9 t- _' J; R
        " l- h5 J8 E0 K' j- |. O# o
        if (result == EDMA3_DRV_SOK)
0 i$ ~' W7 i6 v) I0 `- X7 i    {
# s* Q( }/ b( w1 @( e* {8 e                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
) b' D' Y# k. F% e7 A1 y4 F                                                       (EDMA3_RM_EventQueue)0,
" K4 L! ?! g3 M% _' x                                                            &edma3_isr, NULL);
6 v! `7 I5 T, h/ q- B4 W3 _    }) ~! u1 E* O- C0 F
       
: ]. @' G6 T8 p! ?" ~. f        if(result == EDMA3_DRV_SOK)
- W6 u' d: w! B3 o, c        {& N  `8 f3 Y8 Q$ m. _8 S
                paramSet.srcBIdx    = 0;
6 N7 r8 c! P5 B) h6 @                paramSet.destBIdx   = 1;
& I+ y3 j- u6 _$ Z: K: l1 K                paramSet.srcCIdx    = 0;
# ?/ P5 m0 K' T: N0 u) a8 W5 c# u                paramSet.destCIdx   = 0;" T9 J2 ^! H" k9 x& J$ H' a) h
                paramSet.aCnt       = PING_PONG_ACNT;1 W+ ~, N5 @# I7 K
                paramSet.bCnt       = PING_PONG_BCNT;6 w% A0 l9 G. D! @+ V9 L
                paramSet.cCnt       = PING_PONG_CCNT;
+ T5 i; l2 F3 L! q3 j; X* @! h- u                ( k* v+ a! F+ n5 z
                /* For AB-synchronized transfers, BCNTRLD is not used. */* i) S+ K& F2 l8 Q8 x
                paramSet.bCntReload = PING_PONG_BCNT;
6 r! a. n3 ]* @9 f7 @7 }% b8 v9 S, w5 V& H( O8 x" @, v8 F* {, s  j
                /* Src in constant mode Dest in INCR modes */
3 _: {$ m/ h3 q! ]6 O" W- d7 \/ `                paramSet.opt &= 0xFFFFFFFDu;
& N$ O6 a4 |* H" \                //paramSet.opt &= 0xFFFFFFFCu;
6 d; B6 _3 j5 l6 `' B6 i               
: A' {9 i- @( q9 t# T' d# |                /* Program the TCC */
& y# r, X% n' D- y2 I6 s4 S# b: ^* n                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);2 Y+ s' O4 O: Y

$ K' e' \$ _: m. q                /* Enable Intermediate & Final transfer completion interrupt */) K3 A- V5 Y/ ~( E+ p/ S/ \; i8 N- I
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);, g# x' u  {: `; R" e' _
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
4 n: R, s# a2 u# `0 M: x/ {
/ N* b* d3 R( k# M# m+ I# _                /* AB Sync Transfer Mode */* C: ^; C! b2 R. Z% k. \
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);, T# G: ]$ D- S# ^  D
                + r- e  g  @, D2 O) s0 X, J; E
                /* Program the source and dest addresses for master DMA channel */
& h* O; V  V) P+ J( c                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);0 g  X! k  l% a6 W) f
                paramSet.destAddr   = (uint32_t)(ping_buffer);
! O3 }1 ?8 s9 z4 o: l) W% {! B+ f3 l+ W) Z- ?3 M
                /* Write to the master DMA channel first. */
2 X. s  f! ~9 y! q                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
+ _7 }, k2 B: F5 L# Z    }       ) r& Q7 A4 F3 f5 L5 f

* I2 r; R: K$ b9 M! z9 I& `        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
5 s9 p* X: O3 o; F6 T       
3 Z1 ]% g9 S7 w. s    if(result == EDMA3_DRV_SOK)
, [& l' G- V3 ?/ n    {
4 D% k5 a9 B2 ~' h, S7 `6 H; g9 y3 U            print2arm("edma3 driver init success.",0);$ d/ ~/ `9 c6 \: E$ \$ \
    }
( |5 w- Z7 R, A7 M}$ X( }+ g; L( N$ |) c

7 P2 q1 e$ }8 @* k! D: y, `6 R4 o( s( q4 H' W
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。- @4 A! S1 C; D2 g. J+ h
6 H9 ?5 f1 Z  \" r  |" Q% t1 H$ O
4 R! p( g& x8 e0 B! E5 c$ |# f

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47- F3 f  w% M! e
每次DMA传输完成后都要再次使能传输

  f4 k2 d/ E: }. E& R2 \- N& k原来是这样,我明天去试试,谢谢了!




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