嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
! n3 P$ F" b3 ?9 m6 M4 ^$ @#define  PING_PONG_ACNT          1
" s$ A( a- U  T2 I% \: z8 [#define  PING_PONG_BCNT          8*32*40 0 ]5 J- m* ]5 n9 a, e. V; q) ^
//#define  PING_PONG_BCNT       1 ' }% G" `0 U! a. e- U
#define  PING_PONG_CCNT          1) S, q1 K8 l7 ^1 j5 i7 M1 @5 p
#define  MCASP_BASEADDR          0x01D000004 A4 j7 D5 `' |8 p
#define  Mcasp_RXEVENTQUE        (0u)) u# y( c9 z" t6 R2 h7 M

8 Y9 B( E6 ^( \- E/* OPT Field specific defines */; A% \) J4 U  f! p% U9 Y
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
5 i& [6 x& w/ i- E8 e#define OPT_TCC_MASK                        (0x0003F000u)
$ \1 I( [0 N- [  U' ?) {  }# @#define OPT_TCC_SHIFT                       (0x0000000Cu)
8 G4 a( y0 Q0 m* f#define OPT_ITCINTEN_SHIFT                  (0x00000015u)' N6 I3 Y; B4 \
#define OPT_TCINTEN_SHIFT                   (0x00000014u)- @" v* O( X4 i) p! f

" t: u4 b3 m) y8 ?7 Zchar ping_buffer[PING_PONG_BCNT];
4 |# j3 C" a) f" y, }char pong_buffer[PING_PONG_BCNT];8 P3 W* W6 T1 i8 U
, R# v9 N5 f% \+ d

6 b, G  V& J; B% r; R. d
- x8 u4 |3 D# e2 T4 ~2 P2 v) g0 m$ ~, b$ M, h) q% G# A& {% H% Q) A
static void ys_edma3_init(); @. g) ~6 I+ l2 A
{
! E& D4 S( `# y0 B( b        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
$ e; P( K0 e, E' x: J  ~5 M        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
) ^% Q+ M& g% A5 I& y. A) s        EDMA3_DRV_Handle hEdma;; I* A5 Y. \, N8 W8 i, j5 k; ]$ p) A
    uint32_t chId   = 0;
6 v- H6 E  F- y& X$ ]* u; t    uint32_t tcc    = 0;* E+ B( U" n2 R/ s  Q, d
% v- Y& z5 u/ y; p" T3 i) b* _! W0 q. f" n+ d
    print2arm("edma3 driver init...",0);! a0 Q( P" h9 l' ?5 B8 ]

; s% \9 X& y, v4 n' r, Y7 w; {        hEdma = edma3init(0,&result);7 O: t/ _# {6 k" v3 m6 s
        if(hEdma)- ^" I" d4 t  o# a6 V" c
        {; v* T0 U1 u( H, a
                print2arm("edma3init() Passed.",0);
* e) q6 M' c9 P) Z        }
% }& n8 I$ E7 u* o        else
! v6 Q1 x0 [8 O( a) X9 }        {8 }, u8 b: ]8 T. V: ~( r
                print2arm("edma3init() Failed.",0);
( V: C+ v! ^) N! u: l        }; F% b: v/ Q* q- V
       
* e5 F0 U+ n4 d9 T6 q. [& f4 R        if (result == EDMA3_DRV_SOK)
, c5 y, s3 I3 P9 D' @% z; V9 X# z    {
" }; p7 `' n* }% o9 e                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,9 h. H- y% ?4 \7 W, O
                                                       (EDMA3_RM_EventQueue)0,
; E+ u: y" a; x                                                            &edma3_isr, NULL);( T8 ~" a" m) k7 h  [9 E( p
    }. {! y) _/ D2 e% }5 J- r: q. W- m
        ! b  Q! C& }4 ?
        if(result == EDMA3_DRV_SOK)
. ^% m) }1 I: k& _# [        {
: ~$ [: }$ H+ ?) D& A0 ?                paramSet.srcBIdx    = 0;. }, q6 v! _/ I
                paramSet.destBIdx   = 1;- g7 I  i. ?7 l
                paramSet.srcCIdx    = 0;9 j/ N4 t0 V1 {
                paramSet.destCIdx   = 0;: N; m/ A0 O( s$ ~
                paramSet.aCnt       = PING_PONG_ACNT;5 Z4 a7 o; T: _8 _6 `  ?' \6 S% t
                paramSet.bCnt       = PING_PONG_BCNT;
9 b# L& X  ?1 r- H: I7 U  [( R                paramSet.cCnt       = PING_PONG_CCNT;
0 ]4 v& f2 I, j* G               
. r4 A/ v$ \" P5 F                /* For AB-synchronized transfers, BCNTRLD is not used. */
. z# `, I7 j. ~5 r' Y9 f                paramSet.bCntReload = PING_PONG_BCNT;6 o' @6 z. `. U  K1 U: S

3 Y  ]) N$ l5 ~3 Q                /* Src in constant mode Dest in INCR modes */
9 o: A) T* g9 m$ r                paramSet.opt &= 0xFFFFFFFDu;6 `& C3 j( l/ w' I( N/ s# ?. B
                //paramSet.opt &= 0xFFFFFFFCu;
; w& |) r8 \+ t, K               
; J9 V  P& x5 T& D                /* Program the TCC */
/ m+ [- A' ~; Z                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);* t, G7 g7 z$ |1 V9 v* v
; c: Q6 y: y5 |1 b' U" k; u. k
                /* Enable Intermediate & Final transfer completion interrupt */0 M3 `% v2 e. Z! j! A
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
& G8 Z/ k9 r. Q# }                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
1 Q" z1 B2 D, g- A; z
% L1 n* \" o1 x* k( C3 ^                /* AB Sync Transfer Mode */
8 _2 R! K  J/ [/ s; U: P                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
  b; @% h1 p  ^5 B9 |               
8 w% {0 }% I4 c5 o8 P: w                /* Program the source and dest addresses for master DMA channel */
/ c4 G2 F4 \* O3 C1 Q1 K                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);1 c( d7 }5 r. V/ T
                paramSet.destAddr   = (uint32_t)(ping_buffer);
4 v. M) S1 _& R7 o) N. ^$ h9 D- y9 h
                /* Write to the master DMA channel first. */; `0 X/ z* N5 ?& ?5 `3 H* C! n+ z3 B
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);- g# B7 Y& a$ |6 y
    }      
6 Y) \( ]4 f8 i1 N! s/ n. e! p# t6 y8 P. U5 A! T
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
- G" u( a! L0 U1 L, H$ Z* O       
- W3 E( r6 \  J" X' `    if(result == EDMA3_DRV_SOK) 4 E7 r% u9 [' K/ ]
    {
+ y7 ?0 }1 l5 r9 u6 N# m6 @            print2arm("edma3 driver init success.",0);+ G1 S! R# v( T2 q7 q  y! S, q  o
    }
* _! p$ j- ?+ c% Q+ `0 y}; ?' S9 l1 }0 P

9 u8 g* D( H1 J4 L8 }% |( c0 c' t7 x) J
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。4 {+ P0 I3 l, D. R+ d0 |
* G! }9 [7 N9 M, P* ~# z

4 d' B3 W# Y8 H5 H
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:470 a; a! S2 Z  k0 {! T
每次DMA传输完成后都要再次使能传输

- B- I4 T! @6 P: S3 m原来是这样,我明天去试试,谢谢了!




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