嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:3 u# z* ^& i; B0 a9 M0 T
#define  PING_PONG_ACNT          1
  P7 I& b% Y: R. r#define  PING_PONG_BCNT          8*32*40 8 U. K$ I' u- h1 A' K5 v2 O
//#define  PING_PONG_BCNT       1
' z8 I. H) R9 T2 W% _#define  PING_PONG_CCNT          1
6 V! T3 R+ n$ ?#define  MCASP_BASEADDR          0x01D00000+ Q) v/ q6 @. x* [, C
#define  Mcasp_RXEVENTQUE        (0u)" k% J- l2 T1 R/ V+ ]2 W
" T( h  [  k# K3 F6 H* o0 R6 l2 ~
/* OPT Field specific defines */: s- n1 ~+ K/ P1 V1 e" Y: M
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
, Q) }; e3 P/ L, H% d1 E0 m2 }#define OPT_TCC_MASK                        (0x0003F000u)8 L- q6 ^  z2 k: Z' @
#define OPT_TCC_SHIFT                       (0x0000000Cu)
  a! W  N% V2 r: v$ k#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
! @9 H4 v! @+ t) [. n#define OPT_TCINTEN_SHIFT                   (0x00000014u)+ E' V. K% G" z: I

. Z% A7 C4 ~6 n+ Q! j; ychar ping_buffer[PING_PONG_BCNT];
6 C& c$ n  _! R3 k+ H" pchar pong_buffer[PING_PONG_BCNT];- j) }! L. y) J7 _2 P6 i
- G" F+ _" z0 u' {+ }$ `

' g$ ^) ~% J9 z, C, s1 b* _, x$ |; A* x3 D
  w& u4 b: X% s7 H  r4 R8 i4 F( ?
static void ys_edma3_init()6 @* K: Q9 r( e; t
{
" Z# Z5 @) Y9 V: W9 s9 u" V* Q) V: k        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};! \3 K/ y  @' r) x7 b) w* A# w
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;6 J* I! j; k; _8 ?/ b
        EDMA3_DRV_Handle hEdma;' `6 P; z* M$ G3 `. n8 a. w
    uint32_t chId   = 0;& R! H4 F  T# w1 [
    uint32_t tcc    = 0;5 J. V8 v" `- P. O1 I4 c% `8 B! Y- u) X
# R# P' F9 R2 z4 l8 e
    print2arm("edma3 driver init...",0);
5 ~( w+ M9 Q# }3 a! a! I$ Y5 J$ i# _% I: H, M+ e8 y; p. T7 Q
        hEdma = edma3init(0,&result);
7 [9 ~: s9 Y4 Y1 W8 J        if(hEdma)1 ^/ H. v$ f) ?+ {8 h4 C  b$ j9 o
        {
+ F$ j1 }9 p/ K4 x                print2arm("edma3init() Passed.",0);
* n/ @. k! v& {( ~" w( I        }* }& R& u7 L" |
        else. y. x6 X- g4 v" s; }1 U( ?
        {
# S1 M2 f. r0 w( y% K                print2arm("edma3init() Failed.",0);* G! \# N9 r, _/ q% [! C
        }( m/ c) e; R8 g" P, X  S$ a5 B
       
5 ^; U$ X9 `5 {4 p: |  b        if (result == EDMA3_DRV_SOK); \3 |  s) E4 G0 ^5 S8 M; v
    {
& v- o% c; q0 @4 D                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,4 Y1 h# {( h8 w' P: v- M
                                                       (EDMA3_RM_EventQueue)0,
7 g/ H, {, U& Z                                                            &edma3_isr, NULL);  v( ^% \& b) |, Y; O& J
    }
% C+ y. Z$ X" z1 ]. L# w       
+ n0 b0 j# |; @        if(result == EDMA3_DRV_SOK)
& W; T8 x8 e. P6 x% E. `- h% C8 O1 v        {
5 m3 J" {9 v4 \- R4 J# z                paramSet.srcBIdx    = 0;
# M3 d; j# T$ a                paramSet.destBIdx   = 1;
( D: ^# B+ d" [) X                paramSet.srcCIdx    = 0;3 z3 }$ L9 `3 Y( [
                paramSet.destCIdx   = 0;* s$ h. T! f* M, |. _+ m/ c
                paramSet.aCnt       = PING_PONG_ACNT;
1 |, k/ W1 _! H) L9 M; f% X                paramSet.bCnt       = PING_PONG_BCNT;3 W% j! b1 V2 N$ P. |
                paramSet.cCnt       = PING_PONG_CCNT;/ Q0 \8 L3 v* n* \! Z
               
5 Z  h5 F( H# _  {; [& Y                /* For AB-synchronized transfers, BCNTRLD is not used. */3 W0 t) z5 S  r% l
                paramSet.bCntReload = PING_PONG_BCNT;
+ z. y$ K0 y3 A. \  d' m# e9 t: [  a( {5 ~! `6 s& J
                /* Src in constant mode Dest in INCR modes */; ]) e; y4 `* d
                paramSet.opt &= 0xFFFFFFFDu;
8 W! \  I2 M$ `/ Z0 {5 t$ W: z                //paramSet.opt &= 0xFFFFFFFCu;7 O, ]6 r, O9 n3 a8 ~0 `
               
: I0 j: L, {7 b                /* Program the TCC */
% n2 X3 |' V0 f                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
% Q+ K2 s0 p! n* c# `
- y- H0 j: H& Y                /* Enable Intermediate & Final transfer completion interrupt */" _( \0 {. e, j
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
, T4 _) J0 `$ |1 ]1 R2 p* i% [                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);# w0 Z: r5 L  h' e. f

; Q$ W9 V: o: ~; a+ A5 p- q                /* AB Sync Transfer Mode */% E* ?( p+ d0 N( n5 l* }+ R  k% k
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
1 P! Z+ V. J4 Q+ O2 k) T( W: ^+ R                * k' g* P; h! g3 U' c0 J* i3 V
                /* Program the source and dest addresses for master DMA channel */
- j* H7 [6 @7 a: b4 k9 q9 V" _                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);: c+ h4 H* Q+ m. V5 j( Q
                paramSet.destAddr   = (uint32_t)(ping_buffer);
1 _; ^) l# X& V% e+ w" X5 j9 H. L0 O: }* ?+ ^/ ?
                /* Write to the master DMA channel first. */9 ^& U, I. j; l4 M. V
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
; k5 y! Q' g) S$ `" d, ?( `    }      
' u* V8 G/ ]8 Z& L: U4 u/ G1 J# T3 @7 H; d* O! P- x
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);# M; ~$ I4 s% x: B
        * Y! {/ j# D) Q1 B/ @; Q
    if(result == EDMA3_DRV_SOK)
/ ~& ?$ h( \/ B) s" r  ~' F    {6 a! ~) n. j, U& c
            print2arm("edma3 driver init success.",0);# n# C, W% T. e. L, w1 M6 M
    }
) ]0 H! s9 P2 R& g, t. T}
# z4 Q/ l9 B% h
- ]' H3 J0 e5 }/ u6 _; J
  q: J0 v% D$ G& X! t/ x- }EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
$ E- h. N$ U) g/ C; ~: w
# }) g) {8 X* W% Y' a0 m0 b: t/ f) Y( }  @( x. B. R8 G  H7 H

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
# r7 L- @9 ]$ ]1 M6 ~每次DMA传输完成后都要再次使能传输
1 D$ q. x4 ~/ B* o# ^! S
原来是这样,我明天去试试,谢谢了!




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