嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:* o  r6 ]& I+ n8 e) M  t- G# [
#define  PING_PONG_ACNT          17 w3 O) J7 H2 y& F0 S
#define  PING_PONG_BCNT          8*32*40 0 r$ \0 p8 u0 K( G; W6 a5 g2 z
//#define  PING_PONG_BCNT       1
; B" e4 r9 s& _/ p' h# F9 L$ n#define  PING_PONG_CCNT          1, \, F# z# P$ Z) {9 H( S# g
#define  MCASP_BASEADDR          0x01D00000
! R7 ^9 D+ e) r/ [- ]7 u#define  Mcasp_RXEVENTQUE        (0u)
2 x3 d# @# z5 W+ E" N
- n* b7 `5 c9 ^2 d; u9 E/* OPT Field specific defines */
5 m- S* z( h% D' c8 H#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
* |( q$ }- u' o' |) S#define OPT_TCC_MASK                        (0x0003F000u), y- R! F0 v  U" |$ Y' P2 z
#define OPT_TCC_SHIFT                       (0x0000000Cu)' a9 V6 c" l6 C3 ~; h/ q7 f
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)/ ~/ S* y& c$ G# ^( N7 K* K
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
' k! h7 x, Y- S
8 K( ]: |/ L+ q  |char ping_buffer[PING_PONG_BCNT];3 M4 c8 }; z( h( t: X
char pong_buffer[PING_PONG_BCNT];
6 M3 x2 p: U6 r2 x
- \5 f4 [6 g+ h. g
1 D8 E1 y! V- z5 g2 R  g) _
' g* G2 A, u" o4 s- i: _$ C% f
" j* n+ e9 g+ f% {' {& |static void ys_edma3_init()
/ a- e' ?: V1 X{
$ T) r) A2 i' ]        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};: `3 G' A* f7 E6 C1 h) `
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;8 g6 `% k* f* s# [" k7 k
        EDMA3_DRV_Handle hEdma;* E  U! g4 q  H; W
    uint32_t chId   = 0;
& c" t3 `- x6 B' D    uint32_t tcc    = 0;
& \  L( q) i5 g& t( H& Q! l/ L, P) l8 S. ?8 `/ R$ ]0 m
    print2arm("edma3 driver init...",0);
9 P/ T, M/ f" i! b
2 X7 W" J  ~) c$ r2 L! }  O" E        hEdma = edma3init(0,&result);
7 A9 A9 h) t/ i6 r# H        if(hEdma)5 {8 Z& N0 p0 `
        {
, v$ z5 N  W% `* h( x. R                print2arm("edma3init() Passed.",0);( g8 m- g$ z/ w4 D( }- q* d& Z$ p
        }/ H; f0 F# d& |( Y
        else  ]3 K* p4 H; n- m& `$ U! J
        {
0 c& F$ P6 f# B) s2 C" r; L                print2arm("edma3init() Failed.",0);& ^/ D2 t, o  }
        }/ o8 N* g& K- ^, y+ P" I# ~2 G, l
        . _* Q" @! J9 ~! _, O5 e! i
        if (result == EDMA3_DRV_SOK): Z) ?: |: T0 s, r, i
    {
0 t' r6 z  h" q/ n- d, J                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
2 s9 e4 z- K2 S- M                                                       (EDMA3_RM_EventQueue)0,
0 i% h$ p- D7 A3 s* ~* _  o                                                            &edma3_isr, NULL);
8 j: B6 x4 D4 p% k# t/ H    }' a  K) N) {- D5 p: g
        4 p. t6 ~! L# G6 [
        if(result == EDMA3_DRV_SOK)) D5 x# W& u* v$ l
        {
. s, W# b/ e8 t  L/ [                paramSet.srcBIdx    = 0;
+ f9 B2 Z! T  w3 s) c; C- j                paramSet.destBIdx   = 1;
$ [0 q1 |2 `% \# Z! A                paramSet.srcCIdx    = 0;
4 R! U- T$ M7 r; `6 X" w7 H" {                paramSet.destCIdx   = 0;- J+ z: U+ b) T9 I( t6 H
                paramSet.aCnt       = PING_PONG_ACNT;# e, S. k, F' \7 A1 Q
                paramSet.bCnt       = PING_PONG_BCNT;4 j0 ^& A) m6 p/ J* Z1 e% d
                paramSet.cCnt       = PING_PONG_CCNT;4 U9 M, o$ S3 G' d4 g% Q
                9 ~8 d1 D1 d$ ^! B6 r$ z( _% O
                /* For AB-synchronized transfers, BCNTRLD is not used. */+ J/ s& y$ c" A- I/ N2 r
                paramSet.bCntReload = PING_PONG_BCNT;/ G. g- K: q+ \, Q. _, V5 ]

9 u, _+ q; j  \0 r2 [                /* Src in constant mode Dest in INCR modes */7 L, d4 T, V4 @, W
                paramSet.opt &= 0xFFFFFFFDu;
" s& a9 g3 ~; u& @: l( C6 O) W                //paramSet.opt &= 0xFFFFFFFCu;
, b  C5 n; A4 O2 n1 k                9 L  X9 A0 P6 f3 e0 n+ r
                /* Program the TCC */0 ~0 P+ Y, I' k, W7 C& I) \3 ]
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);# t" N4 N+ B* `. W
  V6 V0 v7 `7 P* H5 W! x+ m; U
                /* Enable Intermediate & Final transfer completion interrupt */
  c+ r. e# T; G% L2 ?                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
* V# y7 U" b0 C: B6 W* V- F/ E! G+ b                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
6 m5 }- r9 h0 K$ h1 f
" E4 m' p" U8 t3 G- M: {                /* AB Sync Transfer Mode */0 _7 x( L' n/ N" w; ^( T: j
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
0 ?2 b' f' d' [% n- H7 B3 Q                ; j) V" K  ?- U$ z
                /* Program the source and dest addresses for master DMA channel */
. d( D( u! `3 Q0 y0 _                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
5 i' r) q; g( {3 V* A' f+ x( E. e                paramSet.destAddr   = (uint32_t)(ping_buffer);
# e0 S! M& R+ C: W: F# J! k9 r
$ ^# D' M+ q, Y% ~3 M                /* Write to the master DMA channel first. */
. s8 O  W& ?6 B0 c% p                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);  O) V' L: f# y) B7 T0 B
    }       " o! ]" ]/ y) P4 o
9 ]! g( m& Z% e5 G* j# _
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. u% q: o8 w9 N* J$ i       
' q1 a' v1 n3 J( B7 \    if(result == EDMA3_DRV_SOK)
- O# U1 N& n7 \! @    {
8 C: v  A9 w9 |8 ~            print2arm("edma3 driver init success.",0);. I1 |8 N$ I: X9 z' G$ W
    }
1 ?4 [5 K3 t  S. Q( Q}* w% v# D; L, J( ?% R% h

9 [' N  f) a3 d
" q% D* ]6 R2 hEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
" j3 u- t8 R0 L7 E% u  P" o; B1 k
1 ~+ h3 I2 x9 P/ H) E

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
. `: `7 i7 _. O" k2 D每次DMA传输完成后都要再次使能传输

6 t$ s9 @( n' @& ?9 [' d原来是这样,我明天去试试,谢谢了!




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