嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
1 w1 W2 j. t  H) R5 k, M#define  PING_PONG_ACNT          1
% L( u, V  \* @; Q- ?$ `#define  PING_PONG_BCNT          8*32*40
2 @/ [2 W5 @* x//#define  PING_PONG_BCNT       1
: |# l/ e# G" y7 u2 E  o  Z  B# s1 V#define  PING_PONG_CCNT          1, ^# N* i/ o' z  r! v2 o
#define  MCASP_BASEADDR          0x01D000009 C+ v1 b2 p: d' R& Q8 J
#define  Mcasp_RXEVENTQUE        (0u)" W% D2 J, N& |. |
1 Q7 `' v- g1 y+ c- G( u9 z% w
/* OPT Field specific defines */
; R: Q. m* i3 t& R, ?. G#define OPT_SYNCDIM_SHIFT                   (0x00000002u)0 T/ Z" q( r6 n  f2 q& L
#define OPT_TCC_MASK                        (0x0003F000u)+ Y/ R- w: t. u# m* ^( w
#define OPT_TCC_SHIFT                       (0x0000000Cu)8 I- c  q+ T3 b% P
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)# P  e, Q: X0 n
#define OPT_TCINTEN_SHIFT                   (0x00000014u)  Q* t- z; J0 h. b; o$ v/ _  `" w. `
& M) c" W: m3 p' X% J
char ping_buffer[PING_PONG_BCNT];
* \! f7 Q% X( }" Q) Vchar pong_buffer[PING_PONG_BCNT];
. l- ^7 t2 K! ]9 O3 }. n) f5 z; z* m8 e

5 d# P4 f  v. G2 D( H: B: F  @  J' H# d# f+ R% a
- O: ?) h( k7 c) f
static void ys_edma3_init()
  _/ j1 V: \  _# r" n. H1 Z4 p{6 |' H% \$ Z) Y
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};- n/ Y+ Y2 Q% b) M  ~
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;/ t/ J+ s( N* d) W" V! b; a
        EDMA3_DRV_Handle hEdma;
+ W5 S1 M" O( k. [7 y    uint32_t chId   = 0;5 K% u! m! \# [7 S4 ?5 l2 j
    uint32_t tcc    = 0;
/ k, D8 p' Y* u: {8 ~! `
- ~9 R  R' \5 `% W! H    print2arm("edma3 driver init...",0);( E) \( D  Z- e
7 }* ]) R- {; ]3 u' j
        hEdma = edma3init(0,&result);
8 ^9 `2 w8 I+ Q' F2 o# f        if(hEdma)
0 B0 L9 D1 _1 ~8 l7 j' [0 ^0 _        {
" z8 l& {; p) [/ p' W                print2arm("edma3init() Passed.",0);4 D( M6 F7 j/ Z) `! {8 h
        }; A& I+ _( @8 Z/ P- R
        else: \8 k* P8 J" D5 f) W( z
        {8 \2 `9 i+ Z. b/ n0 O& L
                print2arm("edma3init() Failed.",0);# U+ A- q' l% Z( y$ t! S
        }
" g- y9 i4 g+ v1 \. N        + a5 M/ {' Z8 ~0 W/ z
        if (result == EDMA3_DRV_SOK)
) b& @$ y6 K& [- G2 i1 ~    {
6 _4 [- L- ~, p' Z9 C+ w                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
; z. [0 G4 G% W- J0 G                                                       (EDMA3_RM_EventQueue)0,
7 b3 ]- p# {7 d  ^, z2 W2 x                                                            &edma3_isr, NULL);$ A' S7 F/ I: }% U: K* x0 q) b
    }
% |0 n3 X" k) f4 y# z5 W: X       
* Y5 B, b. w  M/ M2 \5 s8 E4 s: F        if(result == EDMA3_DRV_SOK)
/ l! i3 R8 x/ S9 x- p        {
' r0 f1 W8 {5 o* G5 l9 a                paramSet.srcBIdx    = 0;/ ]- O, h" `/ F$ Q
                paramSet.destBIdx   = 1;, ?2 r8 Q1 H/ C) I# d7 N, f
                paramSet.srcCIdx    = 0;
: o( B6 t: V7 W" P7 V3 t  a2 f, X0 l                paramSet.destCIdx   = 0;; f2 d+ d# O$ i! [& a
                paramSet.aCnt       = PING_PONG_ACNT;
* G) n4 A( h" t5 K8 z7 Q" b% m6 ]: x( t                paramSet.bCnt       = PING_PONG_BCNT;  M  Y' O0 c9 M0 V5 N* U- ~3 r
                paramSet.cCnt       = PING_PONG_CCNT;
' U! h% P" E; Y$ V6 _3 x                & ^0 i& r- Y$ d. x1 `
                /* For AB-synchronized transfers, BCNTRLD is not used. */- Y; r7 @, V, B& U8 w( |5 M
                paramSet.bCntReload = PING_PONG_BCNT;
( S2 n! V1 A! V: E
. f: L, g$ H4 T" K, U  z                /* Src in constant mode Dest in INCR modes */" b  m/ u! C+ l& F: q
                paramSet.opt &= 0xFFFFFFFDu;9 f; S! q. L, Z2 k
                //paramSet.opt &= 0xFFFFFFFCu;/ B( P. p  {( O1 `, n
               
* n  T; [: a" g                /* Program the TCC */, L* ?( I, k/ n, e7 y
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);0 T( }- |/ H7 W6 i$ I
( b. Y: Y) B. V5 _8 ?$ S8 M" n0 U
                /* Enable Intermediate & Final transfer completion interrupt */$ h! I0 k. n5 K8 q
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
  r) @9 i( |9 H; t                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);4 }8 E( o5 x& L9 l/ O- o8 V4 M
' }# `8 A. ?: `3 V4 O9 m
                /* AB Sync Transfer Mode */
2 W* V9 Y/ l1 e: L6 z                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);+ n# `* B$ d/ T+ p# u5 d$ m
                . a9 g: `! c8 x8 ^% p; [
                /* Program the source and dest addresses for master DMA channel */6 ?4 w- l5 z8 `( l, C
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
' ?- U$ B1 V/ B9 d6 B, p; u                paramSet.destAddr   = (uint32_t)(ping_buffer);
" m& N0 Y' X$ |' X) `! n* h0 j0 |7 g8 U
                /* Write to the master DMA channel first. */
7 u0 D% }3 r0 t' U0 p* R                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
  L4 m" {' z) s4 V' L    }      
4 a0 ^% V5 u& Y3 C6 @: _0 W  M4 r7 ^, v, y  o- ]! D0 l+ D: Z
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
9 w6 r% I0 d, n+ a) S0 _1 d       
: z$ E9 Z# R) @$ J/ M    if(result == EDMA3_DRV_SOK) / p+ g+ t! A3 R8 u  X6 b. T  g
    {
$ i+ R' {3 s% T# d9 C3 }0 m6 {& l- S% v            print2arm("edma3 driver init success.",0);
8 p' T$ U2 A/ y* n, b8 v    }
9 t4 j2 e4 m. V}1 l$ V5 I' x; l  ~, {

: h: w2 p8 Z! I9 y3 c) E( N& t! _  S, a: K8 e
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。. A9 |2 [, b/ p6 I

' j& A- T+ F1 \, B; |, J6 }6 g0 l; b  H
2 x) d' M( i" m5 r' C7 f& i* [
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
% f) n1 k& C) K9 e! G- z7 z$ Q3 s每次DMA传输完成后都要再次使能传输
, b4 ^1 J# i3 t. [$ `
原来是这样,我明天去试试,谢谢了!




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