嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
  }  {8 j- a# D! ]  b#define  PING_PONG_ACNT          1
: F# ]3 N0 Z0 m5 f: K: ?#define  PING_PONG_BCNT          8*32*40 - o/ u, n& C( X
//#define  PING_PONG_BCNT       1
1 B! D* P3 {! c0 ]#define  PING_PONG_CCNT          12 j: P1 S; U0 R" _
#define  MCASP_BASEADDR          0x01D000009 a, T2 d$ G5 q* ]* B
#define  Mcasp_RXEVENTQUE        (0u)5 C  r1 F: U/ Y& ~: F* A5 d
" n5 y$ p2 e% E+ n
/* OPT Field specific defines */
0 @: M( c) y% Z$ q4 }4 b" @& U#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
& O8 ?3 Y" G3 ^- W3 `8 a6 ]#define OPT_TCC_MASK                        (0x0003F000u)
0 M8 V. z: w5 s. b4 g# i! v#define OPT_TCC_SHIFT                       (0x0000000Cu)
3 p* u, c, }& ]0 E9 V, L#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
% N' I1 y2 n4 N6 V# X! h#define OPT_TCINTEN_SHIFT                   (0x00000014u)+ _4 M$ e+ b; `) E' ?% t; f$ g

" \6 ^3 G1 c4 |, fchar ping_buffer[PING_PONG_BCNT];
. s, G- G" q) C) I5 ]: o5 ^char pong_buffer[PING_PONG_BCNT];! {( w% W' X' V, A+ e. X3 J
  s  t/ _- |4 \. W; L

% U7 U0 K7 W6 t8 z9 F1 n; ^; S: E, j2 m% y% |

3 s+ k* s. T2 i+ a7 J1 Ostatic void ys_edma3_init()
0 T7 T& c: `, @. U2 m* r/ Z{
( T3 w9 l0 B  O( j- T8 X        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
" `6 s( T1 n: ^' `" ]" T7 }- r        EDMA3_DRV_Result result = EDMA3_DRV_SOK;- |0 }7 [# s5 ]9 k( C# P, F0 Z, I
        EDMA3_DRV_Handle hEdma;4 I4 I/ z5 P  N1 m8 @
    uint32_t chId   = 0;' @/ X4 `7 A7 R4 ?$ m4 l
    uint32_t tcc    = 0;
: N% w3 g  C2 h  {4 O
, M/ K. A: J& l    print2arm("edma3 driver init...",0);
+ n- e/ c' ~+ O7 o/ G/ m$ s5 J4 g7 r& e0 Q) w0 ?4 @0 o) L
        hEdma = edma3init(0,&result);5 l2 t$ m/ h$ V8 {
        if(hEdma)* \' U0 c7 J0 }# m+ A; ]
        {
8 l- q' o' j3 w, t+ w! k& G                print2arm("edma3init() Passed.",0);% B% d2 @8 E4 G5 r& a% s6 Q
        }$ I; a7 J7 k1 C, e) {' K9 c9 o5 B
        else! E/ t# k% U4 M/ y% _9 v" B5 I0 ^" p
        {
$ `  X$ ^, E6 h! x6 t3 j' a9 Z; C                print2arm("edma3init() Failed.",0);
: _2 ]* H- H* U5 `; x        }1 q4 J( \) L7 W: J2 g! D
       
2 ]$ I; J4 b6 ^        if (result == EDMA3_DRV_SOK); Y) H! ?0 a1 G; s8 m( J
    {, J  P5 \& }: d$ N0 ~
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,+ ~* ]# U+ {9 M9 ~2 E6 `
                                                       (EDMA3_RM_EventQueue)0,1 V; p) N* A) M8 a  `
                                                            &edma3_isr, NULL);/ w* L# h# Y2 S. V) Z* m. Y  M
    }0 U- I. }, K3 {: R+ S; c7 W4 w! L
        $ Z4 ]1 T0 H, p, v/ e. p! L5 |
        if(result == EDMA3_DRV_SOK)
5 o$ |' ~: n8 W" W' _7 b        {9 n% X. x2 D1 q0 D4 _9 C
                paramSet.srcBIdx    = 0;
6 k8 m: g& `5 O6 {                paramSet.destBIdx   = 1;
2 c. l% W3 M  y! }% V9 U                paramSet.srcCIdx    = 0;" c3 J/ ?! K  |5 f
                paramSet.destCIdx   = 0;
3 o8 i4 r' m5 ?; B                paramSet.aCnt       = PING_PONG_ACNT;
0 k! y" A6 k, P% p: Y  O# R                paramSet.bCnt       = PING_PONG_BCNT;
. G# a9 _: U) Z; V( B                paramSet.cCnt       = PING_PONG_CCNT;
" A: J- a! ^8 o8 b3 _7 m* D                2 l( i3 n+ k9 Z/ t6 Y) ^' b/ ~
                /* For AB-synchronized transfers, BCNTRLD is not used. */
' h; `; x- H; T4 u" T0 u% r. ?                paramSet.bCntReload = PING_PONG_BCNT;
! d$ I; v2 L$ I' c; Q% m  U  V
% }- `+ h* M( C& G+ b/ j6 Z8 V                /* Src in constant mode Dest in INCR modes */
; t3 e# j0 [8 x0 y6 N4 G$ F                paramSet.opt &= 0xFFFFFFFDu;7 ?2 C+ o( r8 V" a* R4 @
                //paramSet.opt &= 0xFFFFFFFCu;
; d$ M7 |  W2 l+ q* O, d- J               
. F& ^2 R7 A$ t0 X1 ^$ i6 Z                /* Program the TCC */; t4 K6 N, v# @6 |! H/ l- Z
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
$ j' Z& c  l% ~) |
2 @$ h3 X% z" l. c- e# Q                /* Enable Intermediate & Final transfer completion interrupt */
0 F% q2 {0 }4 d/ h7 A                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
: z9 d, W% v, K! j7 ]5 S                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
4 f  K. c6 ]  B1 T( z3 W) O# E0 w( c# L% j- H" _; O
                /* AB Sync Transfer Mode */3 m3 W- t( m4 @: X( B- _+ Q
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
2 i! W" b8 B9 b# U; c7 Q               
$ `, F1 t( }- \                /* Program the source and dest addresses for master DMA channel */" H% e, ~' A( [; }  s$ I7 L$ ~' @# {
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
! y* w2 u1 K5 {( X3 V1 {1 w                paramSet.destAddr   = (uint32_t)(ping_buffer);
4 @2 k2 T. t% g! ]# L: S
7 V: e8 y. r! {( @1 ?                /* Write to the master DMA channel first. */
4 l8 R$ M: H1 H6 {4 g) O                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);+ v+ \  K( W. R
    }       , [) P: k+ u5 j0 K/ f9 C. b" M5 @

, @4 F" {1 u" E7 X        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. V6 ]/ O8 C. T$ X! d: P* b* W2 I& _        - \* _- z' O: B7 h. X0 ]
    if(result == EDMA3_DRV_SOK)
7 Y" G; H" m% M, s. D    {8 R  g* [  ?; l9 F; B3 |
            print2arm("edma3 driver init success.",0);; Q5 G; Y5 l: i% Z5 O1 ~( p
    } 7 E4 ?' S! W+ }& ~: ^% P  i; d% C) f
}+ K: c" v. p2 r
. {. k  O8 t; p9 a
/ A) V* `; |0 l9 E) q0 |
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
% P! ^$ q! \% L! h, i( C& Q8 n/ W: D; q  t
) c( n# ]* v) z, }0 g; `

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47! T, o3 y% e, K8 D4 F
每次DMA传输完成后都要再次使能传输
: G9 C5 Y" L1 s' s$ E
原来是这样,我明天去试试,谢谢了!




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