嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
* [0 \. `1 e& B- Q6 i#define  PING_PONG_ACNT          1" J) a0 N9 c  Q. s& b# E4 X. T  u
#define  PING_PONG_BCNT          8*32*40
) w3 G, |( B2 O; g' ^; J* p//#define  PING_PONG_BCNT       1
0 f2 o& _5 s) M& _0 f#define  PING_PONG_CCNT          1
, e# i$ n$ ]: L; ?1 Y#define  MCASP_BASEADDR          0x01D00000* v4 L- q6 E; J5 c+ P
#define  Mcasp_RXEVENTQUE        (0u)
4 ?3 h2 H* `% r  V8 U  W, j: A, r6 x7 J9 |1 L
/* OPT Field specific defines */
7 E6 @* C  L7 S5 k+ i% }# D6 O#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
3 U9 t3 t  v; N#define OPT_TCC_MASK                        (0x0003F000u)) P1 O8 y2 h: v5 ^9 b1 M9 m
#define OPT_TCC_SHIFT                       (0x0000000Cu), K- H2 y" R* q5 e' s
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)6 l) [# }7 c! c( c) q$ q5 Z, ^
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
8 v. h' o- p) `9 y' P! a. d3 Q( n
char ping_buffer[PING_PONG_BCNT];
+ W, V$ S, M2 E2 T, o" Gchar pong_buffer[PING_PONG_BCNT];* l! i# Y7 f0 d9 T! u

  E. Y+ Y* Y# r4 @  X- g) r
3 ~4 @, `0 }6 d
) I4 M# R2 J. I" J+ m
4 ~) p# D+ m7 t( i9 N/ p' Sstatic void ys_edma3_init()$ l; ^0 E2 Q3 [7 I: D# X" f9 A
{
& y7 l9 U0 m+ S        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};8 q( [7 G; a/ d( g! o6 _; O0 a
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
9 U4 G$ }" X; G) Z        EDMA3_DRV_Handle hEdma;" L7 z: T2 `. Y# F; w% x. G
    uint32_t chId   = 0;
& l1 z$ a) G# |    uint32_t tcc    = 0;0 E* T8 D6 s- e7 r, |+ w9 L

1 O! {, G% [9 F1 @0 B    print2arm("edma3 driver init...",0);3 ], C: w/ J) A; }) a" n
0 G$ \0 [# B! e+ E
        hEdma = edma3init(0,&result);
4 V, D5 {; Q$ T        if(hEdma)
/ P3 {" X2 [' C$ E4 ]) c* r' H+ Q& A        {9 P* W4 ]7 S  w. o4 `; e+ I
                print2arm("edma3init() Passed.",0);
9 f5 C5 F: H* O' G8 g$ X        }2 p% V  v+ t( V6 e- j
        else! h4 @+ Y, r9 `, z; W8 R7 f4 L, j/ j
        {
" n$ K* e0 E$ y! [5 d# p) R                print2arm("edma3init() Failed.",0);8 {5 K; t* |) D& G* b& [
        }* P) l7 v6 E$ @8 i+ R
          a# R6 r  g4 d
        if (result == EDMA3_DRV_SOK)
( D( X0 I" d$ d1 q    {
6 l' ?5 [& M- y% O/ _3 R                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
0 _4 W. ?, X/ x5 y                                                       (EDMA3_RM_EventQueue)0,
" @* n# Z) q4 H/ H0 {                                                            &edma3_isr, NULL);
& C" Q7 w" B# M( a: V8 q% M3 @6 ~    }  |' M4 L3 O' z; Q5 _  P8 Y5 o" y, d
        * @- j& w- t% w& z
        if(result == EDMA3_DRV_SOK)
; c) t  k8 i/ V5 v& a. w+ D        {# Z  ^3 b. |6 b& L* E% ?' Q
                paramSet.srcBIdx    = 0;& L$ }# B; e# g8 J( a
                paramSet.destBIdx   = 1;
4 M* Y) ^0 J, U& J" o                paramSet.srcCIdx    = 0;: `, v- N; y9 T: ^# E% {
                paramSet.destCIdx   = 0;' }" y$ @8 f+ A( L, R5 U" [
                paramSet.aCnt       = PING_PONG_ACNT;" P0 Y* s! u5 x6 \. |% @
                paramSet.bCnt       = PING_PONG_BCNT;6 L4 b' i9 I& a+ \; i' J
                paramSet.cCnt       = PING_PONG_CCNT;0 O1 j4 Y- H# _3 u: f
               
: c2 O/ [  k/ f3 ^1 A                /* For AB-synchronized transfers, BCNTRLD is not used. */% X1 f2 ~: N) u( Q- d# I
                paramSet.bCntReload = PING_PONG_BCNT;
: u9 O6 ~- |) n; \, j, P% l8 I7 r# l
                /* Src in constant mode Dest in INCR modes */
) x6 [, q* K! R& i0 Y                paramSet.opt &= 0xFFFFFFFDu;' I+ J" n3 I( u- g
                //paramSet.opt &= 0xFFFFFFFCu;- L/ y3 X/ W+ J+ c$ C2 l' ]
                  Z8 J- N7 ?  j
                /* Program the TCC */
6 ~, g$ a  k% ?& ?                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);' o1 }6 d' s9 u; Q, q

, C+ Z1 o/ ]4 f1 A- T8 j9 u                /* Enable Intermediate & Final transfer completion interrupt */( U" v5 S, |, a8 m+ U/ w8 b
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
* ^/ P/ i2 o: g8 A4 D                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);4 W9 W/ z: v* x+ v5 N. ^8 |

  F7 r7 ~; B. E8 M  e                /* AB Sync Transfer Mode */9 Q, |  `# E; c1 X; X/ T
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);* t  _2 V2 r+ `2 T
                0 I- \! s' X+ O
                /* Program the source and dest addresses for master DMA channel */
. E$ f/ F. n& K* m$ g  x                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
2 G3 Q0 J, B1 z8 a" E* B                paramSet.destAddr   = (uint32_t)(ping_buffer);
. q5 b- l8 K% L, V
4 z+ k1 [- [( N  F& |                /* Write to the master DMA channel first. */
+ j' y! R- n) ]6 p                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
" B0 F# c# ~$ G5 y' F6 q9 |6 a    }       : K3 \  C+ L. r5 }& E
0 _6 k; H5 j& ~
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
# M- O7 |* r5 m: ~( }8 [8 u        7 S. t4 p) ~) O% p
    if(result == EDMA3_DRV_SOK)
. V, h) N1 R) I# r, J" M  d    {
$ _/ P7 S! n6 `% M            print2arm("edma3 driver init success.",0);7 l+ W4 y8 ~  x: l! `5 q- r9 O! j
    }
1 a& d: _" o, E0 j- x}& b9 @3 ^# ~- f  i* ]* f6 W# E! t; ?; S
7 s6 z3 m, B* Z( X) I: N$ Y" F- y
% j1 w* |) }8 r6 U2 m- u2 V; K
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。/ G/ l- s2 @6 _# y8 |" O3 r

" k7 E3 H* E1 n1 M6 |: \
0 |6 e3 R( b* Z& a
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:472 ?' r% y. B) F3 f8 ~8 I
每次DMA传输完成后都要再次使能传输

) D+ M4 V; G4 N, M: j9 B2 j/ }原来是这样,我明天去试试,谢谢了!




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