嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
( n( M. Y' M& b/ D% e5 r" Q. r# F  I  V#define  PING_PONG_ACNT          1% L7 p$ X" _" G
#define  PING_PONG_BCNT          8*32*40
% d+ w2 n1 X0 b% @, }//#define  PING_PONG_BCNT       1 2 [7 `' z* |- a9 E$ ]0 _  ]0 ~
#define  PING_PONG_CCNT          1! k3 \" e2 A) w' H7 S. L) I0 |
#define  MCASP_BASEADDR          0x01D00000
) _5 q& d1 R8 f9 u" p* M#define  Mcasp_RXEVENTQUE        (0u)+ c% }; ^( V/ u8 n3 d4 }6 t

) e7 Q$ _; A) |: q, E8 i6 Q. C$ c4 Y, h/* OPT Field specific defines */2 O& _/ ?. R- F7 i$ y
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)/ r& f% h; n2 E" y; J/ |/ b
#define OPT_TCC_MASK                        (0x0003F000u)
1 p8 P  s# O. l4 D- `+ l#define OPT_TCC_SHIFT                       (0x0000000Cu)* O" B( |: a! N, i0 I, c% \
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)# m# J0 U( D' Y
#define OPT_TCINTEN_SHIFT                   (0x00000014u)7 B& M0 B$ a5 u. `7 _& i. X$ f

& ~7 V/ t5 U9 c# zchar ping_buffer[PING_PONG_BCNT];
% `1 M1 {0 _4 O. Z' xchar pong_buffer[PING_PONG_BCNT];
6 ^7 N) G2 S6 ~" |/ s0 T
& D2 A) v% l3 w) o6 q: W" O- ?# V5 s2 N6 I7 O4 C; \5 z, b
# g1 N. l3 f+ I" ~) s. u
% K0 l2 Q1 u$ H8 e" ^7 P! ]8 W, P9 y
static void ys_edma3_init()9 y: x0 c8 r5 K) o# m
{3 D5 [0 X/ }2 M, p8 l: n( K3 N
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
8 [& X8 \' D9 g  Q* x9 G3 g        EDMA3_DRV_Result result = EDMA3_DRV_SOK;% m- O/ l) @, @2 x
        EDMA3_DRV_Handle hEdma;) V5 O1 _( Q; v6 P" ?, L& [3 d
    uint32_t chId   = 0;! f; M5 b  B- O- T
    uint32_t tcc    = 0;
. c4 K7 R% z9 U5 Z" n. N+ {0 i/ E* O
    print2arm("edma3 driver init...",0);% u3 u, x0 L& m+ Y! v

0 t$ \( d' Q( Y# i- h2 S        hEdma = edma3init(0,&result);5 u  F" s6 c/ d- O) @. J* H
        if(hEdma)7 D1 o5 C; B0 Z" g0 w& Q
        {
  x' }" x! J7 w6 j& G                print2arm("edma3init() Passed.",0);
6 `! s2 T8 ^2 d7 ]' x4 @        }
) U- a. {/ ?8 N$ _. F        else
! W* w' T# n5 B0 g! H        {. v9 U7 m2 U6 T  \9 P& ^
                print2arm("edma3init() Failed.",0);
1 b9 _. O! q  @) r, r$ {# G        }' s; w- X$ T$ Q1 c! E
        7 z2 e0 L4 P3 e2 E( |- i
        if (result == EDMA3_DRV_SOK)( l3 q- J  i" H3 o, O' {5 F) v
    {0 \3 v6 L$ `) F3 A0 y
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,: m( i3 _8 P$ N) p$ R+ ~4 l, d
                                                       (EDMA3_RM_EventQueue)0,' C/ w# B3 s) f) p
                                                            &edma3_isr, NULL);
3 k" [9 F4 u" K. W    }
; w( J+ W1 P+ f8 l$ ?1 V        9 ?/ ?, e7 D- A8 y! L! b
        if(result == EDMA3_DRV_SOK)% B* K# c+ D8 {( |/ O
        {
( ^9 S4 ?/ ~; b6 ?1 I3 @                paramSet.srcBIdx    = 0;; ?- x- E5 Z/ N( c! u: [3 M
                paramSet.destBIdx   = 1;
0 R/ Z0 y2 T6 a# W! o                paramSet.srcCIdx    = 0;4 x) I' b& Q7 `, ?# {
                paramSet.destCIdx   = 0;8 l1 y+ U; P! e- A! K
                paramSet.aCnt       = PING_PONG_ACNT;% \5 d% W& s! t0 w& z+ G' u# ~
                paramSet.bCnt       = PING_PONG_BCNT;" g: S9 s  A3 H5 d+ z1 m, f
                paramSet.cCnt       = PING_PONG_CCNT;
% e$ w9 a$ G0 t9 E! I7 D                - M: S/ X, E: O) ~% K
                /* For AB-synchronized transfers, BCNTRLD is not used. */
2 t$ f! w7 {  D% Q  [                paramSet.bCntReload = PING_PONG_BCNT;
. s7 w& t( }  i! K# `9 Q
9 O( r/ q; u% {/ k6 o                /* Src in constant mode Dest in INCR modes */) F) ^/ H, E0 V. x0 c" K; m
                paramSet.opt &= 0xFFFFFFFDu;
3 n; c  M) U- }! L3 P9 G                //paramSet.opt &= 0xFFFFFFFCu;
, n" R" ^! p* V* t$ ^               
0 F1 S1 D6 `2 ~# n3 q: \8 q; r                /* Program the TCC */
; h. W( M" I; Z7 G: F0 q                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
* O9 ?  e, U4 @  O3 @6 L9 @
9 Z. @( T, P* k                /* Enable Intermediate & Final transfer completion interrupt */
4 }! `' A' C) D) H# C' G; b. g                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
$ F- O% @8 f& l- V# v                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);- ^9 j2 w* y, z* N0 S: N: N

' P; ^. ~3 V& b4 {                /* AB Sync Transfer Mode */
2 O& x; M8 Z) @( w                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);7 Q9 S4 E- C& }: W
               
/ |6 Q' _5 q7 H6 C& D                /* Program the source and dest addresses for master DMA channel */' N% y/ T$ \& U9 I: }# [$ p( I
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);, I; L1 a2 C2 O( w7 `, ^3 h
                paramSet.destAddr   = (uint32_t)(ping_buffer);
1 V/ F8 {$ c3 Z
  j2 T5 z* M5 b+ R                /* Write to the master DMA channel first. */
: `' ^- B% P( z1 {                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
$ \3 [, \: a6 j- `: \; a& x    }      
& }4 H4 y* w0 J# I4 y6 v
7 B8 D; @; e3 x* ~        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
2 N6 y$ z9 M! f8 d       
" o1 `  b3 G' S! ]9 L* E6 E    if(result == EDMA3_DRV_SOK)
. Y7 ?& z) z4 R- u  g    {
; ?% d/ ?5 u, A3 |( l            print2arm("edma3 driver init success.",0);
+ ?: @) R8 l  V2 G    }
) k" c/ J1 `( ^8 ]3 R! t}
  G0 }: n: N. v0 g6 J$ W) q& g' b; ]- M
7 V. f0 v0 O0 A( l3 }! B
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。2 b' W/ G: h' H! T
- H/ n. |9 @; L. }
1 k; \% q: C9 I; l# l7 P

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47" \- |' w4 s0 r) K; P( `
每次DMA传输完成后都要再次使能传输

' T  m9 w4 C. L, }4 Q0 A! W* y) R. _原来是这样,我明天去试试,谢谢了!




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