嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:3 Z0 ^7 H3 {6 B& G6 n
#define  PING_PONG_ACNT          1
8 Z* U! G( x. s( |: a( N#define  PING_PONG_BCNT          8*32*40 / k) U8 z* i6 Q1 ~
//#define  PING_PONG_BCNT       1 ( w. r0 ]. ?, k( q, M* d: P
#define  PING_PONG_CCNT          1
+ v" e& M  e; K9 F4 j#define  MCASP_BASEADDR          0x01D00000
! B3 {0 R7 ^3 b9 e: ?( k- D#define  Mcasp_RXEVENTQUE        (0u)
) K" V. }0 U- y& p# B8 e" {: |1 N8 T& ?
1 m) t. l; y8 r' {5 O9 X" W/* OPT Field specific defines */
2 a: e3 A0 P2 b. D4 Q1 \/ P#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
( N- ~! @# ?' H: {- t#define OPT_TCC_MASK                        (0x0003F000u)
; D; i: u8 j7 Z- v#define OPT_TCC_SHIFT                       (0x0000000Cu)
( C) Z  x! S. W+ a7 f#define OPT_ITCINTEN_SHIFT                  (0x00000015u). C4 `: P2 `' j
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
0 e$ w* r; Y6 f& d" W
( b# b% [! S: M5 `& s2 Tchar ping_buffer[PING_PONG_BCNT];: X( O2 Z$ E: O9 P2 Z
char pong_buffer[PING_PONG_BCNT];
& p$ E- j4 p& n' [% g, P
+ `2 S5 C8 Q) q6 N: z% Y
) M; N& i. T( X& p& d5 o; j5 ^4 Z" c6 z+ S  ?7 T0 q. g2 k

6 [0 h) G( @+ f' @  a8 Ostatic void ys_edma3_init()1 Y* Y$ U& b' A1 h
{
  I5 N4 M# v  P2 b        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
3 A6 ^6 c' ~" B8 L; D        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
* W1 U) i, V7 P: X        EDMA3_DRV_Handle hEdma;
% c/ \; G) l9 v# I* H" y, {0 k    uint32_t chId   = 0;- c" w# H/ X+ _6 j+ \6 J- T0 A
    uint32_t tcc    = 0;- f2 C4 f+ k. o7 y

% L+ I  k! X8 l2 F( t    print2arm("edma3 driver init...",0);% D1 X" e% d9 w$ ]* W; {

9 P& I$ E& g7 ~2 r% G7 @        hEdma = edma3init(0,&result);$ H3 s! {. S1 U! G9 T
        if(hEdma)
' s$ A/ U; J7 f        {3 l  y* `# X! H4 R3 P0 G% g, m8 W
                print2arm("edma3init() Passed.",0);2 _% I" e' v# s6 h5 W; H
        }- |& c: l# Q! w$ ?  ?5 j0 s6 {2 G
        else. \0 u1 Y/ Z8 W4 x
        {
% V9 _" p5 z' c0 R2 Q                print2arm("edma3init() Failed.",0);
  g/ M. O9 G7 |8 K        }& Z* x6 k: k  s+ V4 ~
        5 r4 g6 W, Z/ N
        if (result == EDMA3_DRV_SOK)
0 Q! g# t  j' n' _5 x. }    {  ]+ C9 ~' s% l
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
' k( k# f! \2 h, F" }" @4 E- I4 }+ L                                                       (EDMA3_RM_EventQueue)0,
6 \/ d. a, T9 S2 Q7 m# c# ?2 k                                                            &edma3_isr, NULL);+ I5 z! u2 s) M9 ?; E( ~7 O5 W: @8 @/ W
    }
* D/ I  x: W0 k; F3 A        ' x4 e0 `  T. D* `5 Y/ A
        if(result == EDMA3_DRV_SOK)
& x, ?& P5 j" g5 D        {
- G: ?8 ~* I$ G8 q" ~  R                paramSet.srcBIdx    = 0;
8 g$ g5 D$ q: V                paramSet.destBIdx   = 1;
. s2 t' D% o9 X* j+ \1 \( Y                paramSet.srcCIdx    = 0;
' U1 z( f6 J7 Z/ t                paramSet.destCIdx   = 0;
2 g" J- n$ y7 h/ N5 L* g                paramSet.aCnt       = PING_PONG_ACNT;* R! V5 X; C9 T. V2 b
                paramSet.bCnt       = PING_PONG_BCNT;
5 E; m$ D# Y& B                paramSet.cCnt       = PING_PONG_CCNT;
& h# r$ M) ]! P               
! O' d+ a4 x( X0 v1 W; b                /* For AB-synchronized transfers, BCNTRLD is not used. */1 \/ W8 }2 w0 g: I) K
                paramSet.bCntReload = PING_PONG_BCNT;+ O8 H8 l8 T! c- u' F& o$ ?) \
$ W. D( M7 x* Z  y9 U2 M
                /* Src in constant mode Dest in INCR modes */
* j% B  I0 N! @; _- n7 `/ S! {2 Y                paramSet.opt &= 0xFFFFFFFDu;$ O7 V8 J; w& L! a# B+ O7 X
                //paramSet.opt &= 0xFFFFFFFCu;2 Q) T; n3 L  V3 w6 J
                " E* Z, b: ]4 @& Q
                /* Program the TCC */
2 E2 E9 y7 G/ Z% m1 j9 I4 {                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 O+ h8 N( T0 y8 G" S% @  x) n+ |$ M& S' w& }- v
                /* Enable Intermediate & Final transfer completion interrupt */
$ p7 e' e' r, A8 ~* b                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);: ^) d! G( _' t4 w+ `) `
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
8 ?& h1 `7 k8 B) a3 X  h
) p; q4 Z- `( w) F( `                /* AB Sync Transfer Mode */# R: M  P# n$ V4 v
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
6 h+ M8 p2 `: u/ i! S( {               
3 g# _/ U) h9 u% k1 W& R& C                /* Program the source and dest addresses for master DMA channel */+ e9 X, G# U/ s  B9 t& y
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);. E; B7 i' L& u& f* l
                paramSet.destAddr   = (uint32_t)(ping_buffer);4 O6 ?) Y; h, O% A
5 V. @$ `( b! I
                /* Write to the master DMA channel first. */* T, N3 S* x  k* O2 p
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);( P. a. A8 U% S2 T0 Z/ @& ?
    }       & e/ M  y) w6 s

1 e+ q* D4 w, D2 F7 j/ M# k        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
3 `, p0 p% G3 e% S8 Z4 d4 h       
" X  ^& k- G9 e) h# b  y    if(result == EDMA3_DRV_SOK) + `, e3 a) e2 m5 s) b7 t8 b
    {/ Z0 S1 A% w! M& `2 ]
            print2arm("edma3 driver init success.",0);- ?2 p0 M0 ^% E
    } 2 Q7 A! j2 x( I7 s' z$ l
}
! E  M. W( Y2 H3 H3 L" ]4 C+ ?+ O5 ?* T* p

- u" s  B5 Z: n  D; zEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。0 z+ ^- S0 r6 o: y% r

; N2 `4 \+ @' L  `+ O# H/ R* }& [. H! Z* ^2 _. e; t1 m+ D

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
  O8 v# x! [0 d; o* }每次DMA传输完成后都要再次使能传输

4 w; d9 w* E0 b- B( h8 ~. M* Z1 F$ U原来是这样,我明天去试试,谢谢了!




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