嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
; K9 q8 C* ^- v, K- s#define  PING_PONG_ACNT          1
5 I$ q4 v/ T4 o% h0 o6 B#define  PING_PONG_BCNT          8*32*40 5 e# t/ ?, \0 x- {5 _* N
//#define  PING_PONG_BCNT       1
6 s: S* y) ~" p9 x) L6 W#define  PING_PONG_CCNT          1" Q5 z+ Y4 o& V0 v( X9 Y
#define  MCASP_BASEADDR          0x01D00000& t/ N% F* L' I! i0 I+ R; |
#define  Mcasp_RXEVENTQUE        (0u)/ e7 g! A' ?* G0 U0 w( `7 x% U
; O% A+ o) T% S, g
/* OPT Field specific defines */
: e* n- q9 u( h. D5 p6 P#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
$ N( i3 A5 M; J  Q' q5 S# R% V#define OPT_TCC_MASK                        (0x0003F000u)
  U( B" K1 v. u1 H% e) j2 K% s6 d/ J#define OPT_TCC_SHIFT                       (0x0000000Cu). o* j) N2 O9 S& v4 w$ M0 l
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
% Q" y  H3 o% @& k8 ?6 y& C#define OPT_TCINTEN_SHIFT                   (0x00000014u)
$ `# k* I2 l; C6 Q9 T8 z
. x) M) l0 [9 `2 H6 _# Dchar ping_buffer[PING_PONG_BCNT];
# o% [( Q" T( k) p! ^char pong_buffer[PING_PONG_BCNT];
( q& }( R. M" s( D
3 @5 I! c& J9 j6 p. l5 }9 f% c9 v0 J; m/ w" }2 _

% k6 g; _' B* l7 [
% `2 X9 L2 j& Q  T9 _static void ys_edma3_init()
2 ~1 N2 {* r: p* d0 [4 o2 m7 `+ s{
3 ^, y0 I# B, _5 C        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
8 @5 ?6 F, B! v5 F' G) x5 v1 i        EDMA3_DRV_Result result = EDMA3_DRV_SOK;) n. b3 P* r2 g; Q- {( l: m; t
        EDMA3_DRV_Handle hEdma;7 t, @! m* m- i3 E1 I, ]
    uint32_t chId   = 0;
: R* V: ?1 r" V" S* k5 |    uint32_t tcc    = 0;% b; k! J3 V1 M4 N
5 n4 ?  c, x6 I! X) q# U
    print2arm("edma3 driver init...",0);8 @: U0 F/ m* U. B+ Q

9 O+ b7 `0 B& A, t+ Y) ]  h' i4 r1 c2 @( o        hEdma = edma3init(0,&result);
! c3 A9 v( y( y8 x        if(hEdma)
' e- X/ A/ O# K3 P" E! X        {
/ A6 ~3 y2 P) ^                print2arm("edma3init() Passed.",0);
$ e0 o- n3 w7 X; r4 G        }8 H  O$ v! x! Q, o' o8 s% \3 h! ^
        else
5 k: h2 @# C+ v! {# E( o        {
1 b8 V' [7 X9 q1 h, e. _                print2arm("edma3init() Failed.",0);
, w% K* P. T# m3 k        }0 G5 k' o/ E5 Q
       
/ H# ]& h5 _, U3 m        if (result == EDMA3_DRV_SOK)& [9 l# g; ?/ g) ^# a
    {
9 q2 A3 x( z& j                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
) g+ |) w9 o2 H7 z' w                                                       (EDMA3_RM_EventQueue)0,+ h. r3 i+ O, P  G; k
                                                            &edma3_isr, NULL);+ ]$ O/ A' d* T* m
    }0 B  t; [( Q* b8 p$ R" ]: Y/ p
        3 @, w  D+ [) _2 t0 v5 E
        if(result == EDMA3_DRV_SOK), `: j7 {: Y+ w0 I' p
        {
3 I1 @; S. E; z0 N5 H# y! y4 Y                paramSet.srcBIdx    = 0;
8 }. E+ k3 B0 e/ z- j' Q                paramSet.destBIdx   = 1;
, ?1 Q3 L7 [4 y- h4 @& p                paramSet.srcCIdx    = 0;
" p3 K' H/ O4 z% k! B) z" U                paramSet.destCIdx   = 0;/ R) M9 e0 ~! h5 I2 [9 }  Y
                paramSet.aCnt       = PING_PONG_ACNT;- @4 z" x; k/ I7 _
                paramSet.bCnt       = PING_PONG_BCNT;
1 L4 E( g0 W' Q5 W9 @- O/ s                paramSet.cCnt       = PING_PONG_CCNT;
( x  F# A: f0 s- _               
% Z6 K4 p; _6 g1 E  c2 x" [" u/ X2 z                /* For AB-synchronized transfers, BCNTRLD is not used. */! u, C% \7 O4 r! q: }% s$ V% y
                paramSet.bCntReload = PING_PONG_BCNT;
$ B3 w% |+ ^6 A$ K1 \) H+ n
7 k1 w* ?/ ^( H. ]                /* Src in constant mode Dest in INCR modes */
% H+ y7 D/ l4 N                paramSet.opt &= 0xFFFFFFFDu;8 }' b3 @  A: a7 O, w
                //paramSet.opt &= 0xFFFFFFFCu;
& z4 b& Y: o- U; L3 |                & x7 G3 P# I" \8 s
                /* Program the TCC */
+ Y3 ~0 ^/ C8 n; H                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
; B2 Y7 @. E6 y1 {2 {3 u( D& |
& B4 s; l* O. J1 K3 Z. ^3 |1 L  Y' I                /* Enable Intermediate & Final transfer completion interrupt */
9 j% b; }0 O: @0 n% O/ i  i# b                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);2 u* r- N; n7 r$ \3 U/ b6 G; z$ _
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);$ _. Y( ?6 ^8 n8 O# h% v

" v/ ~+ U7 M4 o8 e% D0 Y                /* AB Sync Transfer Mode */8 j; R- q  q, i- g
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);* ]: \: d3 N) [& s, s
               
+ t5 u8 P/ |. V9 N& A" n1 ?                /* Program the source and dest addresses for master DMA channel */& i) z% S, R5 I/ w9 d# ~! h& I
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);, T2 [( Z0 D! b' W$ `
                paramSet.destAddr   = (uint32_t)(ping_buffer);
( [$ P  A2 t1 d; q; q  T$ L: c  Q1 G, z7 [. I* e
                /* Write to the master DMA channel first. */  F+ s0 s$ o7 R( m% G5 L$ q( S! c
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
3 o) c1 `" u( ]  q: U2 L* D    }      
; C1 t, q5 y6 C) [  K$ a, I# e& v; H5 r7 N! B' q1 g- b
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
- t. a8 g! |1 ^       
7 I$ o3 d; B5 H' d# I+ O$ x    if(result == EDMA3_DRV_SOK)
; c/ R3 i6 ]6 `    {
* _$ I7 b) t5 b7 z1 M2 O' Q2 i5 V            print2arm("edma3 driver init success.",0);4 [& P8 E+ k: \5 i' I% g
    } 0 W/ y0 v( O( z, ?; [( [; t' M' h
}1 j* H; o+ T# T' l+ Q
' x- c. w' c- T0 s8 k" j5 `0 R
2 d" R* r+ t5 d1 N2 u
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
: \+ t9 Q( q/ j
" o# L, N) \, v: T' m0 H
* d2 N- ?3 o8 ]& W# B
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:476 C2 L" P& X) U) n
每次DMA传输完成后都要再次使能传输
* m! A9 b6 g+ ~/ s$ D
原来是这样,我明天去试试,谢谢了!




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