嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
; j8 M9 d! n! c- {+ b#define  PING_PONG_ACNT          11 b9 y0 w* S! l- i
#define  PING_PONG_BCNT          8*32*40 " i& ]' X/ `. J0 T$ U; x# I# J( n
//#define  PING_PONG_BCNT       1
0 R( U# v. C& G4 [. f#define  PING_PONG_CCNT          1% n) V% v6 n2 ?$ E' e
#define  MCASP_BASEADDR          0x01D00000
  i3 o* Y! u3 C+ S1 r#define  Mcasp_RXEVENTQUE        (0u)
. r/ b/ T+ _3 }$ M/ A! v% b
% m% ^+ b, v. G6 w4 @' ]/* OPT Field specific defines */
3 `6 R( S/ O# u3 i#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
, u8 k3 a5 b/ F* W#define OPT_TCC_MASK                        (0x0003F000u)7 s3 E  W) o; _
#define OPT_TCC_SHIFT                       (0x0000000Cu)
% Y$ @5 H" _" \9 w) V/ d#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
: p5 S8 {. I) e2 ]$ ^, j7 T#define OPT_TCINTEN_SHIFT                   (0x00000014u)
* D' J$ T2 _: L* a) H2 i* E' R2 B% Y3 y! x" L2 R
char ping_buffer[PING_PONG_BCNT];0 b2 f  Y! f1 F8 ~2 y3 m. I
char pong_buffer[PING_PONG_BCNT];' {* i  `3 C- N4 ]
6 c$ |3 ^6 k' N$ m& \

. b0 l: Y0 M: s2 E: Z
, b& m4 N$ f4 E6 G# c5 _2 I! j" p; s, A0 D0 B
static void ys_edma3_init()$ i- N1 a- L" x7 O
{
/ p6 _( \: V7 ~0 @4 V        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};: {+ \' B' p& r. T
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;1 i: G# C" l7 T- k1 W  e
        EDMA3_DRV_Handle hEdma;
, u+ V4 i' `  e, E2 [    uint32_t chId   = 0;
3 }' L" [% O/ w( N    uint32_t tcc    = 0;) p* l/ B6 N  r9 C

8 K- v7 r( H! ~4 a$ ]' {    print2arm("edma3 driver init...",0);% M* y. |3 _+ O; s

8 M2 V3 n# z+ a2 F* G6 H) }        hEdma = edma3init(0,&result);
5 w+ Q2 K% J0 l5 G/ ^9 V. z        if(hEdma)2 T3 f) h: {/ P5 ?6 }) @$ R$ _+ V' Y/ F
        {
% a4 U$ e' W5 \+ g. M4 m1 a                print2arm("edma3init() Passed.",0);( M) Q( @( j. |  c1 M
        }2 N7 B6 z$ v) [: P8 `' N
        else
; ?5 G2 P6 _  x( k* H; C        {$ D% O1 B# A1 e' T9 F: S
                print2arm("edma3init() Failed.",0);7 F% a5 F5 V" n8 r3 \( l, x
        }! f+ H( X1 ~) u
       
7 E/ m- j6 h  r5 U( ]2 V        if (result == EDMA3_DRV_SOK); c+ Y2 C4 Q3 g3 w* s
    {
3 P" P3 ^6 E% Q2 D                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,0 {5 T! ^8 \4 x' P0 F" f
                                                       (EDMA3_RM_EventQueue)0,
% O: R9 N0 O4 Q9 v                                                            &edma3_isr, NULL);9 c1 }) r- U# X) n
    }
  z: @: k3 ~! _( e( a       
% a; s, u& r, `. G& `        if(result == EDMA3_DRV_SOK)/ ]* e, D( @/ I0 i8 J# d2 s2 ^
        {) r$ x/ r% N" I8 f6 u
                paramSet.srcBIdx    = 0;
8 m# }, b6 R8 W' J, y2 X5 p                paramSet.destBIdx   = 1;
2 g! W$ Z) b# R                paramSet.srcCIdx    = 0;1 W0 o8 a3 Q8 ?& o! T
                paramSet.destCIdx   = 0;% R  r  Q8 M6 T7 ]
                paramSet.aCnt       = PING_PONG_ACNT;
# A* F+ ^! \1 A7 |! x' ^                paramSet.bCnt       = PING_PONG_BCNT;- r2 M5 ^4 i3 ?: Q& x* t1 o
                paramSet.cCnt       = PING_PONG_CCNT;  k3 t- |7 ]) w4 I3 u% f
               
3 a/ T9 a6 k$ `                /* For AB-synchronized transfers, BCNTRLD is not used. */
5 y/ g- S6 P% d: I9 K. D                paramSet.bCntReload = PING_PONG_BCNT;* X; [( k8 m$ f& b( h, {

# D) _6 Y, i5 I/ {/ J                /* Src in constant mode Dest in INCR modes */
/ V( ]: Q: c& e( {' j2 e  M+ W6 n                paramSet.opt &= 0xFFFFFFFDu;
. j+ Z! ~4 _5 o, [( J& s                //paramSet.opt &= 0xFFFFFFFCu;
1 U: {* j5 w0 {; I- W               
. E- d- B7 \1 s1 P                /* Program the TCC */9 a( i/ Z6 h* ]0 W/ c9 b  R
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);* V4 F$ [6 e7 J  K
# u1 U# e" K8 g% l" q) g
                /* Enable Intermediate & Final transfer completion interrupt */
2 o" c" \+ u( a; ~/ k& [                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);$ Q" n; H5 d0 e. i( l
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
! f. r5 e: Y6 {+ H
% I0 `! ]" C+ [: ]+ Z                /* AB Sync Transfer Mode */
. G0 ]1 F" l4 E8 {& s1 L' V6 a                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
7 t0 r; A+ V# v0 q# i8 Y3 V6 r9 A                & ^1 Z9 p* a* }+ q
                /* Program the source and dest addresses for master DMA channel *// C. z9 r; H0 L1 ~
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);: n; y. d6 R6 t: a7 q) U- e
                paramSet.destAddr   = (uint32_t)(ping_buffer);) ]% T/ _! W  b* M

; t6 e$ z1 ]! N" i9 g0 O                /* Write to the master DMA channel first. */
; }  C7 K( ?4 V4 K. P7 P                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);( H$ j  N- u  Q9 p0 G  A. ^" `
    }       9 j( {+ I2 @# Q4 p6 c& U2 Z
5 I+ }' Q- D+ H% |
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);& g/ i0 j, G  H5 @  Y0 n! X
       
  q2 u3 P+ L" \0 q' n5 @    if(result == EDMA3_DRV_SOK) + z3 ~+ ~, X' ~. S+ n
    {
  d7 ]* h* r  |  P6 ^            print2arm("edma3 driver init success.",0);
, v/ V$ ~6 ~* p# @6 X    } % m) I4 k" ~* O
}
% L4 w% {3 ^# a$ o% l$ \7 z5 L5 J: O$ P# m' q* o% Y
3 f* O! C( B* R; b, @
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
0 x/ \9 I, f! Z* V; ?0 G; ]; V1 H$ r, p' P; ~- X

, k% S; d3 E2 |  I' z( j7 M
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
6 X" M& l( P+ l0 N1 a1 \, n' [2 N" a每次DMA传输完成后都要再次使能传输

& x" N* Y. X0 e, x5 b( q原来是这样,我明天去试试,谢谢了!




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